Пролог: факты и правила - PullRequest
       39

Пролог: факты и правила

0 голосов
/ 10 декабря 2018

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

doctor(adele).
doctor(inez).
doctor(elin).

patient(aurora).
patient(mandy).
patient(roan).

doctor_attends_patient(doc,pat):-doctor(doc),patient(pat).

При выполнении запроса возвращается false.

doctor_attends_patient(adele,roan).
false

1 Ответ

0 голосов
/ 10 декабря 2018

Как было сказано ранее , , предикаты можно прочитать как

to_prove(This) :- need_to_prove(This) , and_also(That).

, поэтому

doctor_attends_patient(doc, pat) :- doctor(doc), patient(pat).

означает, что доказать

doctor_attends_patient(doc, pat)

Пролог должен доказать

                                    doctor(doc), patient(pat).

Обе эти подцели являются наземными , не содержат логических Variables, поэтому должны быть доказано, они должны соответствовать некоторым фактам в нашей базе знаний.Но у нас есть только

doctor(adele).
doctor(inez).
doctor(elin).

patient(aurora).
patient(mandy).
patient(roan).

У нас нет doctor(doc) или patient(pat), как указано.

doctor(Doc) с другой стороны, будет совпадать любой из указанных doctor/1 фактов, поскольку Doc - это логическая переменная, способная принимать любое значение.

Как Даниэль Лайонс Очки в комментариях , имена переменных Заглавные буквы , в Прологе.

Теперь вы можете исправитьопределение вашего предиката.


Что касается вашего запроса,

doctor_attends_patient(adele,roan)

также не соответствует ни фактам, ни заголовкам правил в вашей базе знаний.Единственное правило с удаленно совпадающей головой -

doctor_attends_patient(doc, pat) :- doctor(doc), patient(pat).

, но составной термин

doctor_attends_patient( adele, roan)

не не соответствует составному термину

doctor_attends_patient( doc  , pat )

, потому что хотя функторы обоих терминов, doctor_attends_patient, совпадают, и их arities , 2 , также не соответствуют ни один из аргументы внутри скобок совпадают.В частности,

    adele = doc

терпит неудачу, а также

    roan = pat

также может завершиться неудачей, если попытаться.

Но если вы использовали переменные тогда

    adele = Doc , roan = Pat

вместо будет успешным , что приведет к замене Doc = adele , Pat = roan.Поскольку в этом случае также будет совпадать заголовок правила, в целом,

doctor_attends_patient(adele,roan)
doctor_attends_patient( Doc , Pat)

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

Теперь вы можете исправить определение предиката.

...