2012-11-15 9 views
6

Ho avuto un momento difficile alla ricerca di risposte chiare sulla negazione in Prolog, quindi mi scuso se questa è una domanda ovvia:swi-prolog la negazione

Sto cercando di scrivere un semplice codice che logicamente dire che "X e Y si amano a vicenda se a X piace Y e solo Y." Il mio codice .pl simile a questa:

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

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

ho quindi eseguire il mio programma e semplicemente chiedo:

?- loves(X,Y). 

ma si tratta sempre fuori falso. Secondo la mia logica, dovrebbe tornare a dire 'X = john, Y = mary'.

Ho provato alcune combinazioni di separare la negazione con i tagli, provare più righe per definire "amori" ... Probabilmente mi manca un principio importante di negazione, o forse c'è anche un modo più semplice per implementare cosa Sto cercando di fare qui. Per favore fammi sapere se puoi aiutare!

Sto usando SWI-Prolog (swipl) dal Debian Software Manager, se questo aiuta affatto, anche se dubito che farà molta differenza.

risposta

5

Il tuo problema è che Z non è vincolato quando la tua regola chiama per \+likes(X,Z), quindi almeno ci sarà sempre Z = Y che invalida loves/2. Voglio dire, dal momento che i Mi piace (X, Y) sono veri, sicuramente saranno i veri Mi piace (X, Z).

cambiamento in questo modo:

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

e si otterrà

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