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

时间:2017-04-15 19:53:27

标签: prolog declarative-programming

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

例如:

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

我对这个问题的处理方法是我应该用头/尾迭代字符串并找到下一个字母的索引,该字母与当前字符串相同(它满足最小2长度要求)并切断子字符串sub_string谓词。

2 个答案:

答案 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).