1

私は次のようなほとんどの複合用語を持っています:

likes(a, b).
likes(c, b).
likes(a, d).
likes(b, c).
likes(c, a).
likes(a, f).
go(a, t).
go(t, d).
go(g, a).
go(f, g).
go(f, a).

複合Ternを検索したいのですが、Atomの値は「a」、他のAtomの値は任意の値です。

Prologリターンの結果:

likes(a, b).
likes(a, d).
likes(c, a).
likes(a, f).
go(a, t).
go(g, a).
go(f, a).

私を助けてください

4

2 に答える 2

1

私はここに一般的なヘルパーを書きました。必要なビルトインは少ないと思いました...

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)).
于 2013-01-24T10:15:08.737 に答える
0

まず、述語の用語を「具象化」する必要があります。あなたの理論は次のようになります:

do(likes, a, b).
do(likes, c, b).
do(likes, a, d).
do(likes, b, c).
do(likes, c, a).
do(likes, a, f).
do(go, a, t).
do(go, t, d).
do(go, g, a).
do(go, f, g).
do(go, f, a).

以下を追加します。

has_value(X) :- do(_, X, _)
has_value(X) :- do(_, _, X)

これで完了です。

理論の変更を避けるために、=..のようなメタ述語を使用できます。個人的にはそれは間違ったアプローチだと思います。最初から問題を正しく形式化することをお勧めします。

于 2013-01-24T09:32:35.047 に答える