2012-11-15 13 views
6

私はプロローグでの否定に明確な答えを探しに苦労を持っていたので、私は、これは明白な疑問であれば謝罪:SWI-プロローグ否定

私は、論理的に言うだろう簡単なコードを記述しようとしています「XとYは、XがYとYだけを好きなら、お互いを愛している」私はその後、私のプログラムを実行し、単に尋ねる

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

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

?- loves(X,Y). 

をしかし、それは常にfalse出てくる私の.plコードは次のようになります。私の論理では、「X =ジョン、Y =マリー」と戻ってくるはずです。

私は、否定と切り捨てを分けて、 "愛"を定義するために複数の行を試してみました...私はおそらく否定の主要な原則を欠いているでしょうか、私はここでやろうとしている。もしあなたが助けることができるなら私に教えてください!

私はDebian Software ManagerのSWI-Prolog(swipl)を使用していますが、これはまったく役に立ちますが、これが大きな違いになるとは思えません。

答えて

5

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

変更、それをこの方法:

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

、あなたが

?- loves(X,Y). 
X = john, 
Y = mary. 
を取得します