Prolog中的谓词列表

时间:2012-05-02 08:20:48

标签: list prolog

是否可以定义一个由谓词组成的列表,以及如何调用谓词。

另外,是否可以将一个谓词传递给另一个谓词(如传递原子)?

示例:

pre1:- something.
pre2(Predicate1, List):-
    call(Predicate1),
    append([Predicate1], List, R),
    .....

1 个答案:

答案 0 :(得分:5)

您无法在列表中存储谓词,但您可以存储条款(或仿函数)并将条款称为目标。< / p>

这是一个谓词,用于测试一个术语是否具有由仿函数列表描述的属性:

has_properties([], _).
has_properties([P|Ps], X) :-
    Goal =.. [P, X],            % construct goal P(X)
    call(Goal),
    has_properties(Ps, X).

用法:

% is 4 a number, an integer and a foo?
?- has_properties([number, integer, foo], 4).

此查询的答案取决于您对foo/1的定义,当然。如果需要,请参阅我的explanation of =..

修改:由于评论中的@false报告,没有必要使用=..,因为Goal =.. [P, X], call(Goal)可以替换为call(P, X)具有相同的内容影响。但是,您可能仍然值得学习=..,因为您可能会在其他人的代码中遇到它。