我有以下情况,我必须做一个代表医生就诊的谓词,但它不起作用 .
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
作为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)
Prolog需要证明
doctor(doc), patient(pat).
这两个子目标都是基础的,不包含任何逻辑 Variables ,因此要证明它们必须与我们知识库中的某些事实相匹配 . 但我们只有
Variables
doctor(adele). doctor(inez). doctor(elin). patient(aurora). patient(mandy). patient(roan).
我们没有 doctor(doc) 也没有 patient(pat) 作为陈述的事实 .
doctor(doc)
patient(pat)
另一方面, doctor(Doc) 将匹配任何陈述的 doctor/1 事实,因为 Doc 是一个能够承担任何值的逻辑变量 .
doctor(Doc)
doctor/1
Doc
如Daniel Lyons点in the comments,变量名称在Prolog中是大写的 .
您现在可以修复谓词定义 .
至于你的查询,
doctor_attends_patient(adele,roan)
在您的知识库中也不符合任何事实或规则头 . 你拥有远程匹配头的唯一规则是
但复合词
doctor_attends_patient( adele, roan)
与复合词不匹配
doctor_attends_patient( doc , pat )
因为虽然这两个术语的编写器 doctor_attends_patient 匹配,并且它们的arities,2也匹配,但括号内的参数都不匹配 . 特别是,
doctor_attends_patient
adele = doc
失败了,也是
roan = pat
如果尝试过,也会失败 .
但是,如果你使用变量,那么
adele = Doc , roan = Pat
相反会取而代之,导致替换 Doc = adele , Pat = roan . 因为规则的头部也会匹配,作为一个整体,
Doc = adele , Pat = roan
doctor_attends_patient(adele,roan) doctor_attends_patient( Doc , Pat)
将输入规则的主体,并且Prolog将在用其成功替换中的值替换其中的任何变量之后尝试证明所得的子目标 .
1 回答
作为was said before,谓词可以被解读为
所以
意味着要证明
Prolog需要证明
这两个子目标都是基础的,不包含任何逻辑
Variables
,因此要证明它们必须与我们知识库中的某些事实相匹配 . 但我们只有我们没有
doctor(doc)
也没有patient(pat)
作为陈述的事实 .另一方面,
doctor(Doc)
将匹配任何陈述的doctor/1
事实,因为Doc
是一个能够承担任何值的逻辑变量 .如Daniel Lyons点in the comments,变量名称在Prolog中是大写的 .
您现在可以修复谓词定义 .
至于你的查询,
在您的知识库中也不符合任何事实或规则头 . 你拥有远程匹配头的唯一规则是
但复合词
与复合词不匹配
因为虽然这两个术语的编写器
doctor_attends_patient
匹配,并且它们的arities,2也匹配,但括号内的参数都不匹配 . 特别是,失败了,也是
如果尝试过,也会失败 .
但是,如果你使用变量,那么
相反会取而代之,导致替换
Doc = adele , Pat = roan
. 因为规则的头部也会匹配,作为一个整体,将输入规则的主体,并且Prolog将在用其成功替换中的值替换其中的任何变量之后尝试证明所得的子目标 .
您现在可以修复谓词定义 .