是否可以定义一个由谓词组成的列表,以及如何调用谓词.
另外,是否可以将一个谓词传递给另一个谓词(如传递原子)?
例:
pre1:- something.
pre2(Predicate1, List):-
call(Predicate1),
append([Predicate1], List, R),
.....
Run Code Online (Sandbox Code Playgroud)
您不能将谓词存储在列表中,但可以存储术语(或函子)并将术语称为目标.
这是一个谓词,用于测试一个术语是否具有由仿函数列表描述的属性:
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)
将具有相同的效果.=..
但是,您可能仍然值得学习,因为您可能会在其他人的代码中遇到它.