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