我有 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)
如何使用递归实现谓词?
免责声明:这个答案只是@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
要编写的谓词,您可以简单地内联它。因此,您将替换为call
或and
仅替换为is
. 现在您也不需要重新排序参数,因此您不需要有谓词和辅助谓词。
那里有这么多代码,不看它并尝试学习是一种耻辱。