具有相同开始和结束的所有子串
All substrings with same begin and end
我要完成作业,但我对 Prolog 的了解非常有限。任务如下:
编写一个 Prolog 程序,它可以列出一个字符串的所有这些子字符串,其长度至少为两个字符并且第一个和最后一个字符相同。
例如:
?- sameend("teletubbies", R).
R = "telet";
R = "ele";
R = "eletubbie";
R = "etubbie";
R = "bb";
false.
我解决这个问题的方法是,我应该用 head/tail 遍历字符串并找到与当前字母相同的下一个字母的索引(它满足最小 2 长度要求)和使用 sub_string
谓词剪切子字符串。
这在一定程度上取决于您所说的字符串的确切含义。传统上,在 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).
如果你的 Prolog 在库中有 append/2 和 last/2(lists),这很容易
sameend(S,[F|T]) :-
append([_,[F|T],_],S),last(T,F).
我要完成作业,但我对 Prolog 的了解非常有限。任务如下:
编写一个 Prolog 程序,它可以列出一个字符串的所有这些子字符串,其长度至少为两个字符并且第一个和最后一个字符相同。
例如:
?- sameend("teletubbies", R).
R = "telet";
R = "ele";
R = "eletubbie";
R = "etubbie";
R = "bb";
false.
我解决这个问题的方法是,我应该用 head/tail 遍历字符串并找到与当前字母相同的下一个字母的索引(它满足最小 2 长度要求)和使用 sub_string
谓词剪切子字符串。
这在一定程度上取决于您所说的字符串的确切含义。传统上,在 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).
如果你的 Prolog 在库中有 append/2 和 last/2(lists),这很容易
sameend(S,[F|T]) :-
append([_,[F|T],_],S),last(T,F).