【问题标题】:All substrings with same begin and end所有具有相同开头和结尾的子字符串
【发布时间】:2017-04-15 19:53:26
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 你能展示一下你目前的方法吗?
  • 这只是一个想法,但在代码中可能看起来像这样:sameend([H|T], R) :- sameend([T], R), % 并且应该有再次递归调用以检查相同字符的位置,然后从 H 的位置到下一次出现的 sub_string()。

标签: prolog declarative-programming


【解决方案1】:

这在一定程度上取决于您对字符串的确切含义。传统上,在 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).

【讨论】:

    【解决方案2】:

    如果你的 Prolog 在库中有 append/2 和 last/2(lists),那么很简单

    sameend(S,[F|T]) :-
        append([_,[F|T],_],S),last(T,F).
    

    【讨论】:

      猜你喜欢
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2018-10-29
      • 1970-01-01
      相关资源
      最近更新 更多