是否可以定义一个由谓词组成的列表,以及如何调用谓词 .
另外,是否可以将一个谓词传递给另一个谓词(如传递原子)?
例:
pre1:- something. pre2(Predicate1, List):- call(Predicate1), append([Predicate1], List, R), .....
您不能将谓词存储在列表中,但可以存储术语(或函子)并将术语称为目标 .
这是一个谓词,用于测试一个术语是否具有由仿函数列表描述的属性:
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 =.. .
foo/1
Edit :由于注释中的@false报告,没有必要使用 =.. ,因为 Goal =.. [P, X], call(Goal) 可以替换为 call(P, X) 将具有相同的效果 . 但是,您可能仍然值得学习 =.. ,因为您可能会在其他人的代码中遇到它 .
=..
Goal =.. [P, X], call(Goal)
call(P, X)
1 回答
您不能将谓词存储在列表中,但可以存储术语(或函子)并将术语称为目标 .
这是一个谓词,用于测试一个术语是否具有由仿函数列表描述的属性:
用法:
当然,此查询的答案取决于您对
foo/1
的定义 . 如果需要,请参阅我的explanation of =.. .Edit :由于注释中的@false报告,没有必要使用
=..
,因为Goal =.. [P, X], call(Goal)
可以替换为call(P, X)
将具有相同的效果 . 但是,您可能仍然值得学习=..
,因为您可能会在其他人的代码中遇到它 .