сви-пролог отрицание

мне было трудно найти четкие ответы на отрицание в прологе, поэтому я прошу прощения, если это очевидный вопрос:

Я пытаюсь написать простой код, который логически скажет ,что" X и Y любят друг друга, если X любит Y и только y " мой .код pl выглядит примерно так:

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

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

затем я запускаю свою программу и просто спрашиваю:

?- loves(X,Y).

но он всегда выходит ложь. По моей логике, он должен вернуться, сказав: "X=john, Г=Мэри'.

Я пробовал несколько комбинаций разделения отрицания с сокращениями, пытаясь несколько строк для определения "любит"... Я, вероятно, упускаю главный принцип отрицания, или, может быть, есть даже более простой способ реализовать то, что я пытаюсь сделать здесь. Пожалуйста, дайте мне знать, если вы можете помочь!

Я использую SWI-Prolog (swipl) из диспетчера программного обеспечения Debian, если это вообще помогает, хотя я сомневаюсь, что это будет иметь большое значение.

1 ответов


ваша проблема в том, что Z это не связано, когда ваше правило требует \+likes(X,Z), то, по крайней мере, всегда будет Z=Y, что делает недействительными любовь/2. Я имею в виду,поскольку likes(X, Y) истинно,наверняка будет истинным likes(X, Z).

измените его таким образом:

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

и вы

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