私はここに一般的なヘルパーを書きました。必要なビルトインは少ないと思いました...
search_facts_by_arg(Functor, Arg, C) :-
current_functor(Functor, Arity),
Arity >= 2, % because of 'value of the other Atom is any value.'
length(Args, Arity),
C =.. [Functor|Args],
clause(C, true),
once((arg(_, C, A), A == Arg)).
ふぅ...
テスト:
?- search_facts_by_arg(go, a, C).
C = go(a, t) ;
C = go(g, a) ;
C = go(f, a) ;
false.
編集:@false'の提案の後、コードを簡略化できます
search_facts_by_arg(Functor, Arg, C) :-
functor(C, Functor, 2),
clause(C, true),
once((arg(_, C, A), A == Arg)).
これがファンクター/3のドキュメントです。基本的な組み込みはclause/2であり、ここでは別の簡略化された方法であり、univを使用して「テンプレート」ヘッドを構築します。
search_facts_by_arg(Functor, Arg, C) :-
C =.. [Functor,_,_],
clause(C, true),
once((arg(_, C, A), A == Arg)).