我想在 Prolog 中实现我自己的地图列表。
鉴于以下情况:
myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
apply(Goal, [Elem1, Elem2]),
myMaplist(Goal, Tail1, Tail2).
什么是apply
操作符,我怎样才能用不是库系统调用的东西来替换它?
如果您的 Prolog 有呼叫/N,请使用它:
myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
call(Goal, Elem1, Elem2),
myMaplist(Goal, Tail1, Tail2).
否则用 univ 建立呼叫,并使用 call/1
myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
Pred =.. [Goal, Elem1, Elem2],
call(Pred),
myMaplist(Goal, Tail1, Tail2).
编辑感谢@false 指出我必须更正。说实话,我在没有测试的情况下发布了该代码,但我肯定忽略了这个错误......这里是一个更正
myMapList(_, [], []).
myMapList(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
Goal =.. [P|A],
append(A, [Elem1, Elem2], Ac),
Pred =.. [P|Ac],
call(Pred),
myMapList(Goal, Tail1, Tail2).
测试:
?- myMapList(myMapList(=),[[1,2,3],[a,b,c]],L).
L = [[1, 2, 3], [a, b, c]] .
纯序言基于一阶逻辑,这意味着您不能将谓词作为其他谓词的参数。因此,您无法实现映射谓词。
关于apply/2
:swipl手册