首页 文章

Prolog中的谓词列表

提问于
浏览
3

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

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

例:

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

1 回答

  • 5

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

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

    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 =.. .

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

相关问题