сви-пролог отрицание
мне было трудно найти четкие ответы на отрицание в прологе, поэтому я прошу прощения, если это очевидный вопрос:
Я пытаюсь написать простой код, который логически скажет ,что" 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.