我有以下情况,我必须做出一个代表医生正在就诊的谓词,但是它不起作用。
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
答案 0 :(得分:0)
作为was said before,谓词可以理解为
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
,因此要得到验证,它们必须与某些事实相符( s)。但是我们只有
doctor(adele).
doctor(inez).
doctor(elin).
patient(aurora).
patient(mandy).
patient(roan).
我们没有doctor(doc)
或patient(pat)
那样的事实。
doctor(Doc)
,将匹配所陈述的doctor/1
事实中的任何,因为Doc
是逻辑变量能够承担任何价值。
在Daniel Lyons指向in the comments的地方,变量名在Prolog中为大写。
您现在可以修复谓词定义。
关于您的查询,
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
的 functors 都匹配,并且它们的 arities 2 也匹配,括号内的 arguments 均不匹配。特别是
adele = doc
失败,并且
roan = pat
如果尝试也将失败。
但是,如果您使用的是变量,则
adele = Doc , roan = Pat
将代替成功,导致替换 Doc = adele , Pat = roan
。由于规则的头部也将整体匹配
doctor_attends_patient(adele,roan)
doctor_attends_patient( Doc , Pat)
将输入规则的正文,并且Prolog将尝试在成功替换后将其中的所有变量替换为其值之后,在 中证明产生的子目标。
您现在可以修复谓词定义。