Может кто-нибудь объяснить мне, почему:разница Пролог между утверждениями
notmarried(P) :- \+(married(P)), male(P).
отличается, то:
notmarried(P) :- male(P), \+(married(P)).
Может кто-нибудь объяснить мне, почему:разница Пролог между утверждениями
notmarried(P) :- \+(married(P)), male(P).
отличается, то:
notmarried(P) :- male(P), \+(married(P)).
Хороший вопрос!
Ответ должен быть связан с логической чистотой: в Прологе отрицание реализовано как отрицание как отказ. В общем, цель \+ G
гласит, что G
не может быть доказано в этот момент времени --- не то, что G
логически ложно.
Как следствие, конъюнктуры, которые вы написали, не могут быть коммутативными.
Хорошо, вы можете сказать мне, что значит + \ operator? Это отрицание, верно? И тогда, если у меня есть база знаний: мужчина (знак). мужской (том). Женатый (том) Я получу одинаковые ответы из обоих этих утверждений. Поэтому я не понимаю смысл этого примера в моей книге. –
@ АлександарМакрагић. Существует другая «логически ложная» и «не доказуемая (в это время)» ... – repeat
Тема состоит в том, что переменная в прологе может быть привязана к некоторому значению (X = foo) или unbound (еще неизвестное значение).
Теперь предположим, следующие факты:
married(tom).
married(john).
Что должно быть после того, как "не замужем" в
\+married(P), male(P)
?
P может быть любым значением, кроме «tom» или «john». Но пролог не имеет возможности сохранить этот факт в «Р» (не с основными утверждениями). Итак, результат «не состоящий в браке» - «да, возможно, что некоторые люди не состоят в браке» и «Р» не связаны. С P несвязанным, мужчина (P) берет первого мужчину, и у нас есть первый ответ.
Теперь второй вопрос:
male(P), \+married(P).
После самца, пролог будет связан P одному из самцов. Теперь он проверит, женат ли этот мужчина или нет, ответив «да/нет». В случае нет, он отступит к другому мужчине и так далее.
Да, я понимаю сейчас. –
'\ +/1' обычно звучит, только если его аргумент заземлен. Например: '? - \ + замужем (P), P = test.' * не удается * если есть женатый человек, независимо от того, успешно ли он выдан (или сам). Напротив, '? - P = test, \ + married (P) .' и, следовательно,'? - \ + замужем (тест) .' * преуспевает *, если '? - женат (тест) .' преуспевает. Таким образом, лучше использовать '\ +/1', только если его аргумент заземлен (вторая версия). – mat
Имейте в виду, что «заявления» - это обязательное программирование. Пролог имеет цели, правила и факты, а не заявления. – Enigmativity