2015-04-13 3 views
3

Может кто-нибудь объяснить мне, почему:разница Пролог между утверждениями

notmarried(P) :- \+(married(P)), male(P). 

отличается, то:

notmarried(P) :- male(P), \+(married(P)). 
+1

'\ +/1' обычно звучит, только если его аргумент заземлен. Например: '? - \ + замужем (P), P = test.' * не удается * если есть женатый человек, независимо от того, успешно ли он выдан (или сам). Напротив, '? - P = test, \ + married (P) .' и, следовательно,'? - \ + замужем (тест) .' * преуспевает *, если '? - женат (тест) .' преуспевает. Таким образом, лучше использовать '\ +/1', только если его аргумент заземлен (вторая версия). – mat

+0

Имейте в виду, что «заявления» - это обязательное программирование. Пролог имеет цели, правила и факты, а не заявления. – Enigmativity

ответ

2

Хороший вопрос!

Ответ должен быть связан с логической чистотой: в Прологе отрицание реализовано как отрицание как отказ. В общем, цель \+ G гласит, что G не может быть доказано в этот момент времени --- не то, что G логически ложно.

Как следствие, конъюнктуры, которые вы написали, не могут быть коммутативными.

+1

Хорошо, вы можете сказать мне, что значит + \ operator? Это отрицание, верно? И тогда, если у меня есть база знаний: мужчина (знак). мужской (том). Женатый (том) Я получу одинаковые ответы из обоих этих утверждений. Поэтому я не понимаю смысл этого примера в моей книге. –

+0

@ АлександарМакрагић. Существует другая «логически ложная» и «не доказуемая (в это время)» ... – repeat

1

Тема состоит в том, что переменная в прологе может быть привязана к некоторому значению (X = foo) или unbound (еще неизвестное значение).

Теперь предположим, следующие факты:

married(tom). 
married(john). 

Что должно быть после того, как "не замужем" в

\+married(P), male(P) 

?

P может быть любым значением, кроме «tom» или «john». Но пролог не имеет возможности сохранить этот факт в «Р» (не с основными утверждениями). Итак, результат «не состоящий в браке» - «да, возможно, что некоторые люди не состоят в браке» и «Р» не связаны. С P несвязанным, мужчина (P) берет первого мужчину, и у нас есть первый ответ.

Теперь второй вопрос:

male(P), \+married(P). 

После самца, пролог будет связан P одному из самцов. Теперь он проверит, женат ли этот мужчина или нет, ответив «да/нет». В случае нет, он отступит к другому мужчине и так далее.

+0

Да, я понимаю сейчас. –

Смежные вопросы