Пролог: факты и правила
У меня следующая ситуация, я должен сделать предикат, который представляет врача, который лечит пациента, но он не работает.
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)
тело правила будет введено, и Пролог попытается доказать результирующие подцели после замены в них любых переменных их значениями при успешной замене.
Теперь вы можете исправить определение предиката.