1

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

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

如何使用递归实现谓词?

4

2 回答 2

3

maplist/4Prolog lambda一起使用,如下所示:

?- 使用模块([库(clpb),库(lambda)])。
真的。

?-地图列表(\A^B^AB^(A*B =:= AB),
           [1,1,0,0],
           [1,0,0,1],
           产品)。
产品 = [1,0,0,0]。
于 2015-11-12T16:18:23.713 回答
0

免责声明:这个答案只是@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 的代码既可用又易于浏览,您可以查看标准库定义

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要编写的谓词,您可以简单地内联它。因此,您将替换为calland仅替换为is. 现在您也不需要重新排序参数,因此您不需要有谓词和辅助谓词。

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

于 2015-11-12T21:12:15.200 回答