2012-11-15 11 views
6

Ich habe eine harte Zeit der Suche nach klaren Antworten auf Negation in Prolog hatte, so dass ich entschuldige mich, wenn dies eine offensichtliche Frage ist:swi-prolog Negation

Ich versuche, einen einfachen Code zu schreiben, der logisch sagen dass "X und Y einander lieben, wenn X Y und nur Y mag." Mein .pl Code sieht etwa so aus:

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

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

ich dann mein Programm laufen und einfach fragen:

?- loves(X,Y). 

aber es kommt immer als falsch. Nach meiner Logik sollte es zurückkommen und 'X = John, Y = Mary' sagen.

Ich habe ein paar Kombinationen aus der Trennung der Negation mit Kürzungen, versuchen mehrere Zeilen für die Definition "liebt" ... Ich vermisse wahrscheinlich ein Hauptprinzip der Negation, oder vielleicht gibt es sogar eine einfachere Möglichkeit, was zu implementieren Ich versuche es hier. Bitte lassen Sie mich wissen, wenn Sie helfen können!

Ich benutze SWI-Prolog (swipl) vom Debian-Software-Manager, wenn das überhaupt hilft, obwohl ich bezweifle, dass das viel Unterschied machen wird.

Antwort

5

Ihr Problem ist, dass Z es nicht gebunden ist, wenn Ihre Regel für \+likes(X,Z) aufruft, dann wird mindestens immer Z = Y, die Liebes/2 ungültig macht. Ich meine, da Likes (X, Y) wahr ist, wird es sicherlich wahre Likes (X, Z) sein.

ändern es auf diese Weise:

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

und Sie werden

?- loves(X,Y). 
X = john, 
Y = mary. 
erhalten