我必须解决作业,但我对Prolog的知识非常有限。任务如下:
编写一个Prolog程序,它可以列出字符串的所有子串,其长度至少为两个字符,第一个和最后一个字符是相同的。
例如:
?- sameend("teletubbies", R).
R = "telet";
R = "ele";
R = "eletubbie";
R = "etubbie";
R = "bb";
false.
我对这个问题的处理方法是我应该用头/尾迭代字符串并找到下一个字母的索引,该字母与当前字符串相同(它满足最小2长度要求)并切断子字符串sub_string
谓词。
答案 0 :(得分:4)
这取决于字符串的确切含义。传统上,在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).
答案 1 :(得分:1)
如果您的Prolog在库(lists)中附加了/ 2和最后/ 2,那么这很容易
sameend(S,[F|T]) :-
append([_,[F|T],_],S),last(T,F).