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

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

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 ответ

Решение

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

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 логическая переменная, способная принимать любое значение

Как указывает Daniel Lyons в комментариях, имена переменных пишутся с заглавной буквы в Прологе.

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


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

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, совпадают, и их арности, 2, также совпадают, ни один из аргументов в скобках не совпадает. Особенно,

    adele = doc

не удается, а также

    roan = pat

также потерпит неудачу, если попробует.

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

    adele = Doc , roan = Pat

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

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

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

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

Другие вопросы по тегам