Prolog:事实和规则
Prolog: facts and rules
我有以下情况,我必须做一个代表医生看病的谓词,但它不起作用。
doctor(adele).
doctor(inez).
doctor(elin).
patient(aurora).
patient(mandy).
patient(roan).
doctor_attends_patient(doc,pat):-doctor(doc),patient(pat).
进行查询时returns 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).
这两个子目标都是ground,不包含任何逻辑Variables
,所以要证明它们必须匹配我们知识库中的某些 事实。但是我们只有
doctor(adele).
doctor(inez).
doctor(elin).
patient(aurora).
patient(mandy).
patient(roan).
我们没有 doctor(doc)
也没有 patient(pat)
作为陈述的事实。
doctor(Doc)
另一方面, 会 匹配任何 陈述的doctor/1
事实,因为Doc
是一个可以取任何值的逻辑变量。
作为Daniel Lyons points ,在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 )
因为虽然 functors 这两个词 doctor_attends_patient
匹配,并且它们的 arities, 2,也匹配,括号内的参数的none匹配。特别是,
adele = doc
失败,还有
roan = pat
如果尝试也会失败。
但如果您使用的是 变量,那么
adele = Doc , roan = Pat
会 成功 ,导致 替换 Doc = adele , Pat = roan
。由于规则的头部也会匹配,作为一个整体,
doctor_attends_patient(adele,roan)
doctor_attends_patient( Doc , Pat)
规则的主体将被输入,Prolog 将尝试在 之后用成功替换的值替换其中的任何变量来证明生成的子目标。
您现在可以修复您的谓词定义。
我有以下情况,我必须做一个代表医生看病的谓词,但它不起作用。
doctor(adele).
doctor(inez).
doctor(elin).
patient(aurora).
patient(mandy).
patient(roan).
doctor_attends_patient(doc,pat):-doctor(doc),patient(pat).
进行查询时returns 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).
这两个子目标都是ground,不包含任何逻辑Variables
,所以要证明它们必须匹配我们知识库中的某些 事实。但是我们只有
doctor(adele).
doctor(inez).
doctor(elin).
patient(aurora).
patient(mandy).
patient(roan).
我们没有 doctor(doc)
也没有 patient(pat)
作为陈述的事实。
doctor(Doc)
另一方面, 会 匹配任何 陈述的doctor/1
事实,因为Doc
是一个可以取任何值的逻辑变量。
作为Daniel Lyons points
您现在可以修复您的谓词定义。
关于您的查询,
doctor_attends_patient(adele,roan)
也不符合您知识库中的任何事实或规则。与您拥有的远程匹配头的唯一规则是
doctor_attends_patient(doc, pat) :- doctor(doc), patient(pat).
但是复合词
doctor_attends_patient( adele, roan)
不匹配复合词
doctor_attends_patient( doc , pat )
因为虽然 functors 这两个词 doctor_attends_patient
匹配,并且它们的 arities, 2,也匹配,括号内的参数的none匹配。特别是,
adele = doc
失败,还有
roan = pat
如果尝试也会失败。
但如果您使用的是 变量,那么
adele = Doc , roan = Pat
会 成功 ,导致 替换 Doc = adele , Pat = roan
。由于规则的头部也会匹配,作为一个整体,
doctor_attends_patient(adele,roan)
doctor_attends_patient( Doc , Pat)
规则的主体将被输入,Prolog 将尝试在 之后用成功替换的值替换其中的任何变量来证明生成的子目标。
您现在可以修复您的谓词定义。