【问题标题】:Prolog: comparing the respective elements in 2 listsProlog:比较2个列表中的各个元素
【发布时间】:2015-11-12 12:13:21
【问题描述】:

我有 2 个列表 [x1, x2, ...xn][y1, y2, ...yn],格式为 {0, 1}^n

我想为从 1 到 n 的每个 i 生成一个新列表 [a1, a2 ... an] 以便 ai = xi AND yi(即,如果 x1 = y1 = 1 则 a1 = 1 或如果 x1 = 1,y1 = 0,那么 a1 = 0)

如何使用递归实现谓词?

【问题讨论】:

  • 如果你展示了一些代码,你对它的期望,它实际上做了什么(例如,尝试运行它并在你的问题中显示结果),它会更容易帮助你。然后,您可以提出一个具体问题,例如“为什么我使用此程序没有得到预期的结果”。另外,继续将通用 [prolog] 标签添加到问题中。
  • 这是使用maplist/3 处理的理想选择(查找)。但是由于您可能需要将自己的递归作为作业进行,请考虑以下事项:(1)您需要一个基本情况,即当两个(或其中一个?)列表为空时会发生什么([]) - 所以编写一个谓词来处理基本情况。如果一个或两个列表是[],结果是什么?,那么(2)然后写递归的情况:如果你比较[X|Xs][Y|Ys],结果看起来像X和@ 987654333@?递归调用如何处理其余部分?做一点研究。
  • @lurker:你的评论是一个更好的答案......

标签: list prolog clpb


【解决方案1】:

像这样使用 maplist/4Prolog lambdas

?- 使用模块([库(clpb),库(lambda)])。 真的。 ?- maplist(\A^B^AB^sat(A*B =:= AB), [1,1,0,0], [1,0,0,1], 产品)。 产品 = [1,0,0,0]。

【讨论】:

  • @CapelliC。起初我写了AB is A*B。令我惊讶的是sat(A*B =:= AB) 有多好! clpb 被低估了……
  • 我们甚至不知道这是否真的合乎逻辑——而且,看看这个问题。我们只知道它只需要为 {0, 1} 定义。
【解决方案2】:

免责声明:此答案只是 comment by @lurker 的更明确版本。

首先,你如何做 AND?一个简单的选择是使用按位与:

and(A, B, R) :- R is A /\ B.

现在,你想要的很简单:

?- maplist(and, [1, 0, 0, 1], [0, 1, 0, 1], L).
L = [0, 0, 0, 1].

这是什么maplist?由于SWI-Prolog的代码既可用又易于浏览,大家可以看看standard library definition

maplist(Goal, List1, List2, List3) :-
    maplist_(List1, List2, List3, Goal).

maplist_([], [], [], _).
maplist_([Elem1|Tail1], [Elem2|Tail2], [Elem3|Tail3], Goal) :-
    call(Goal, Elem1, Elem2, Elem3),
    maplist_(Tail1, Tail2, Tail3, Goal).

这比您可能需要的更通用。首先,您不需要将and/3 传递给您要编写的谓词,您可以简单地内联它。因此,您将用and 或仅用is 替换call。现在您也不需要重新排序参数,因此您不需要有谓词和辅助谓词。

那里有这么多代码,不看它并尝试学习是一种耻辱。

【讨论】:

  • @repeat lambda 和 clpb。无论如何我删除了它,因为它没有为答案增加任何价值。
  • 使 lambdas 正确可能有时非常具有挑战性,但在简单的情况下,它的使用很简单:比较 (1) maplist(\A^B^AB^(AB is A*B), As, Bs, ABs) 与 (2) num_num_prod(A,B,AB) :- AB is A*B. 和 @ 987654333@.
  • @repeat 我在这里没有争论,我完全同意。
  • 由于我对 clpb 的经验很少,我应该更多地使用它——不要再害怕它。我想知道如何(以及是否)clpb 和 clpfd 可以一起用于“从不同角度”解决同一个问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2020-11-14
  • 2019-12-07
相关资源
最近更新 更多