3

私は、Clocksin と Mellish に取り組んでおり、最終的に Prolog に手を出すだけではありません。FWIW、私はSWI-Prologを実行しています:

x86_64-linux 用の SWI-Prolog バージョン 7.2.3

とにかく、演習 1.4 の一部として diff/2 述語を実装しました。述語は非常に単純です。

diff(X,Y) :- X \== Y.

これは、次のように、sister_of 述語で使用すると機能します。

sister_of(X,Y) :- 
    female(X),
    diff(X,Y),
    parents(X, Mum, Dad ),
    parents(Y, Mum, Dad ).

その中で、必要な追加の事実を仮定して、これを行います:

?- sister_of(alice,alice).

期待どおり false を返します。しかし、ここに問題があります。代わりにこれを行うと:

?- sister_of(alice, Who).

(繰り返しますが、必要な追加の事実を考えると)私は得ます

誰=エドワード。

誰 = アリス;

間違い

ただし、既に示したように、sister_of 述語は alice を自分の姉妹として扱いません。

一方、SWI が提供する dif/2 述語を使用すると、単純に期待したとおりにすべてが機能します。

そのクエリから追加の統合を要求した場合、なぜこれがこのように起こっているのか、なぜ私の差分実装が期待どおりに機能しないのかを誰かが説明できますか?

私が扱っているソースファイル全体はここにあります

どんな助けでも大歓迎です。

4

1 に答える 1