2

だから私は取り組んできたエクササイズに行き詰まっています。私は次の事実を持っています:

sd(appleseed0, appleseed1).

sd(appleseed0, apple1).
sd(appleseed1, apple1).
sd(appleseed2, apple1).

sd(appleseed0, apple2).
sd(appleseed1, apple2).
sd(appleseed2, apple2).

これが意味することは、appleseed1 が appleseed0 から来た、apple1 が appleseed0 から来たなどということです。私が抱えている問題は、値が入れ替わった場合に false を出力する必要があることです。つまり、クエリの結果が「true」の場合は「true」になり、クエリseed(appleseed0, apple1)が逆の順序の場合は「false」になりますseed(apple1, appleseed0).

現在、私の述語は次のようになっています。

seed(A,B) :- sd(A,B) ; sd(B,A).

これが、順序に関係なくクエリが true を返す理由であることを理解していますが、他の唯一のアイデアは次のとおりです。

seed(A,B) :- sd(A,B). 

しかし、そのように書くと、false のない無限ループになってしまうため、そのように書くことはできません。seed(appleseed2, apple2)のようなもので表示されたときにクエリが「true」になり、のようなもので表示されたときに「false」になるようにするにはどうすればよいseed(apple2, appleseed2)ですか?

4

1 に答える 1

1

あなたの質問を正しく読んでいることを願っています:

余分な述語は必要ありません。実際、探しているのは次のクエリです。

?- sd(A, B).

あなたが説明したように、これは成功するか失敗します。述語

seed(A, B) :-
    (   sd(A, B)
    ;   sd(B, A)
    ).

(あなたのものと同じように、簡単に理解できるようにフォーマットされています)読み取り:「seed(A, B)が真の場合sd(A, B)は真です。が真の場合も真sd(B, A)です」(お気づきのように)。興味深い副作用は、データベースに次の 2 つの事実がある場合です。

sd(foo, bar).
sd(bar, foo).

次に、クエリ:

?- seed(foo, bar).

クエリと同じように、 2 回(!)成功します。

?- seed(bar, foo).

または同等の最上位クエリ

?- sd(bar, foo) ; sd(foo, bar).

最後のクエリは、クエリが 2 回成功する理由を最も明確に示しています。

何が私を混乱させますか: なぜそう思いますか?

seed(A, B) :-
    sd(A, B).

無限ループにつながる?番組で見せていない部分はありますか?sd/2現状では、このような述語を定義することは、エイリアスを与えることと同じseed/2です。この定義は次のとおりseed(A, B)ですsd(A, B)

于 2015-01-28T07:30:04.470 に答える