8

Prolog の否定に関する明確な答えを探すのに苦労したので、これが明白な質問である場合はお詫びします。

「X が Y を好きで、Y だけが好きなら、X と Y はお互いを愛し合う」と論理的に言う簡単なコードを書こうとしています。私の .pl コードは次のようになります。

likes(mary,john).
likes(mary,chad).
likes(john,mary).

loves(X,Y):- likes(X,Y), \+likes(X,Z).

次に、プログラムを実行して、次のように尋ねます。

?- loves(X,Y).

しかし、それは常に偽になります。私の論理では、「X=ジョン、Y=メアリー」と言って返ってくるはずです。

「愛」を定義するために複数の行を試して、カットで否定を分離するいくつかの組み合わせを試しました...おそらく否定の主要な原則が欠けているか、私が試みていることを実装するより簡単な方法があるかもしれませんここで行う。お手伝いできることがあればお知らせください!

私は Debian Software Manager の SWI-Prolog (swipl) を使用しています。

4

1 に答える 1

7

あなたの問題はZ、ルールが を呼び出すときにバインドされないことです\+likes(X,Z)。少なくとも、loves/2 を無効にする Z=Y が常に存在します。つまり、likes(X,Y) は真なので、確かに真の likes(X,Z) になります。

このように変更します。

loves(X,Y):- likes(X,Y), \+ (( likes(X,Z), Z \= Y )).

そしてあなたは得るでしょう

?- loves(X,Y).
X = john,
Y = mary.
于 2012-11-15T07:47:09.583 に答える