【问题标题】:How to make predicate repeat N number of times in Prolog?如何在Prolog中使谓词重复N次?
【发布时间】:2017-10-08 17:25:41
【问题描述】:

我有许多包含字母的列表,并且我编写了一个谓词来检查这些给定列表之一中是否存在重复项:

noDuplicates([]).
noDuplicates([H|T]):-
  not(member(H, T)),
  noDuplicates(T).

我有 10 个列表,我想知道其中是否没有重复,所以我将它们变成了一个大列表的子列表,例如:

[[A,B,C], [C,A,D], [E,F,G]...]]

(因此大列表中可以有重复项,但单个子列表中不能有重复项)。

我知道我必须进行 10 次重复测试;每个子列表一次,但我如何在 Prolog 中写这个?我大概可以写下 10 次,但我猜我可以使用递归让 prolog 重复自己,直到检查完所有子列表。

所以基本上:我希望这个谓词重复 N 次,直到 N 为 10。不过我真的很挣扎。有人知道该怎么做吗?

【问题讨论】:

    标签: list prolog


    【解决方案1】:

    让我们将问题概括如下:

    您有一个谓词p/1,它表达了您对单个列表的要求。

    因此,为了提升这个定义到一个list这样的列表,你可以定义一个谓词ps/1如下:

    ps([])。 ps([L|Ls]):- p(L), ps(Ls)。

    每次看到这种模式,都可以使用maplist/2。也就是上面等价于到:

    ps(Ls) :- maplist(p, Ls)

    目标maplist(p, Ls) 为真iff pLLs 中的每个元素都成立。

    请注意,如果您从“循环”和“重复”的角度思考,它将限制您对 Prolog 的理解。这些是必要的 概念,只有在列表已经完全实例化时才有意义。但是,对于 Prolog,我们期望的远不止这些:我们期望一个完整的关系也能够生成关系所适用的列表。在这种情况下,还没有什么可“重复”的:我们从无到有,询问 Prolog一般有哪些解决方案。

    因此,当关系ps/1 适用于列表列表时,请考虑描述

    1. 它适用于空列表[]
    2. 它适用于列表[L|Ls] 如果我们的初始谓词(p/1)适用于L并且ps/1适用于剩余的列表@ 987654334@.

    这种声明性阅读适用于所有方向,无论有多少列表元素已经实例化(如果有的话)。它适用于 10 个列表以及 0 个和 50 个列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多