具有相同开始和结束的所有子串

All substrings with same begin and end

我要完成作业,但我对 Prolog 的了解非常有限。任务如下:
编写一个 Prolog 程序,它可以列出一个字符串的所有这些子字符串,其长度至少为两个字符并且第一个和最后一个字符相同。

例如:

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

我解决这个问题的方法是,我应该用 head/tail 遍历字符串并找到与当前字母相同的下一个字母的索引(它满足最小 2 长度要求)和使用 sub_string 谓词剪切子字符串。

这在一定程度上取决于您所说的字符串的确切含义。传统上,在 Prolog 中,字符串是字符列表。为确保您真正得到这些,请使用下面的指令。有关更多信息,请参阅 this answer

:- 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).

如果你的 Prolog 在库中有 append/2 和 last/2(lists),这很容易

sameend(S,[F|T]) :-
    append([_,[F|T],_],S),last(T,F).