在Prolog中实现我自己的地图列表?

时间:2013-01-12 09:11:03

标签: prolog maplist

我想在Prolog中实现自己的地图列表。

鉴于以下内容:

myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
        apply(Goal, [Elem1, Elem2]), 
        myMaplist(Goal, Tail1, Tail2).

什么是apply运算符,如何将其替换为某些运算符 是库系统调用?

2 个答案:

答案 0 :(得分:4)

如果您的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]] .

答案 1 :(得分:1)

纯prolog基于一阶逻辑意味着您不能将谓词作为其他谓词的参数。因此,您无法实现映射谓词。

关于apply/2swipl manual