4

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

例如:

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

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

4

2 回答 2

4

这在一定程度上取决于您对字符串的确切含义。传统上,在 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).
于 2017-04-15T20:00:12.583 回答
1

如果您的 Prolog 在库(列表)中有 append/2 和 last/2 ,则很简单

sameend(S,[F|T]) :-
    append([_,[F|T],_],S),last(T,F).
于 2017-04-16T06:47:35.923 回答