prologdeclarative-programming

All substrings with same begin and end


I have to solve a homework but I have a very limited knowledge of Prolog. The task is the following:
Write a Prolog program which can list all of those substrings of a string, whose length is at least two character and the first and last character is the same.

For example:

?- sameend("teletubbies", R).
R = "telet";
R = "ele";
R = "eletubbie";
R = "etubbie";
R = "bb";
false.

My approach of this problem is that I should iterate over the string with head/tail and find the index of the next letter which is the same as the current (it satisfies the minimum 2-length requirement) and cut the substring with sub_string predicate.


Solution

  • This depends a bit on what you exactly mean by a string. Traditionally in Prolog, a string is a list of characters. To ensure that you really get those, use the directive below. See this answer for more.

    :- set_prolog_flag(double_quotes, chars).
    
    sameend(Xs, Ys) :-
       phrase( ( ..., [C], seq(Zs), [C], ... ), Xs),
       phrase( ( [C], seq(Zs), [C] ), Ys).
    
    ... --> [] | [_], ... .
    
    seq([]) -->
       [].
    seq([E|Es]) -->
       [E],
       seq(Es).