我必须解决作业,但我对序言的了解非常有限。任务如下:
编写一个可以列出字符串的所有子字符串的序言程序,其长度至少为两个字符,第一个和最后一个字符是相同的。
例如:
?- sameend("teletubbies", R).
R = "telet";
R = "ele";
R = "eletubbie";
R = "etubbie";
R = "bb";
false.
我对这个问题的方法是,我应该用头/尾部在字符串上迭代,并找到与电流相同的下一个字母的索引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).
如果您的序言具有附加/2和library(列表(中的最后/2,则很容易,因为
sameend(S,[F|T]) :-
append([_,[F|T],_],S),last(T,F).