Prolog中的谓词列表

Rob*_*Fox 3 list prolog

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

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

例:

pre1:- something.
pre2(Predicate1, List):-
    call(Predicate1),
    append([Predicate1], List, R),
    .....
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 5

您不能将谓词存储在列表中,但可以存储术语(或函子)并将术语称为目标.

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

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

用法:

% is 4 a number, an integer and a foo?
?- has_properties([number, integer, foo], 4).
Run Code Online (Sandbox Code Playgroud)

foo/1当然,这个查询的答案取决于你的定义.如果需要,请参阅我的解释=...

编辑:由于注释中的@false报告,没有必要使用=..,因为Goal =.. [P, X], call(Goal)可以替换call(P, X)将具有相同的效果.=..但是,您可能仍然值得学习,因为您可能会在其他人的代码中遇到它.

  • 请考虑`call(P,X)`而不是`(= ..)/ 2`和`call/1`!这是更快,更清洁,甚至更普遍! (3认同)
  • @larsmans:这是[最新的SWI手册](http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%274.9%27,swi%28%27/doc /Manual/metacall.html%27%29%29).嗯,显然,为什么获得标准是不可或缺的! (2认同)
  • @larsmans:你的修正案需要澄清:带有`call(P,X)`的版本更通用,所以效果不一样.`P`不需要是原子!`P`可以是例如`之间(1,10)`. (2认同)