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

Prolog 具有相同开始和结束的所有子字符串,prolog,declarative-programming,Prolog,Declarative Programming,我必须做家庭作业,但我对Prolog的知识非常有限。任务如下: 编写一个Prolog程序,可以列出一个字符串的所有子字符串,其长度至少为两个字符,并且第一个和最后一个字符相同 例如: ?- sameend("teletubbies", R). R = "telet"; R = "ele"; R = "eletubbie"; R = "etubbie"; R = "bb"; false. 我解决这个问题的方法是,我应该用head/tail遍历字符串,找到下一个字母的索引,它与当前字母相同(它满足

我必须做家庭作业,但我对Prolog的知识非常有限。任务如下:
编写一个Prolog程序,可以列出一个字符串的所有子字符串,其长度至少为两个字符,并且第一个和最后一个字符相同

例如:

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

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

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

:- 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在library()中有append/2和last/2,那么

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

你能展示一下你目前的方法吗?这只是一个想法,但在代码中可能会是这样的:sameend([H | T],R):-sameend([T],R),%并且应该有一个递归调用来再次检查同一个字符在哪里,然后从H的位置到它的下一个位置的sub|u string()。