述語で構成されるリストを定義することは可能ですか?また、述語を呼び出す方法を教えてください。
また、ある述語を別の述語に渡すことは可能ですか(アトムの受け渡しなど)?
例:
pre1:- something.
pre2(Predicate1, List):-
call(Predicate1),
append([Predicate1], List, R),
.....
述語をリストに格納することはできませんが、項(またはファンクタ) を格納し、項を goal として呼び出すことができます。
次の述語は、項がファンクタのリストによって記述されたプロパティを持っているかどうかをテストします。
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
もちろん、このクエリに対する答えは、 の定義によって異なります。必要に応じて私の説明を=..
参照してください。
編集: コメントで @false が報告されているため=..
、を使用する必要はありません。Goal =.. [P, X], call(Goal)
置き換えることができるためcall(P, X)
、同じ効果があります。=..
ただし、他の人のコードで遭遇する可能性があるため、について学ぶ価値があるかもしれません。