序言:事实与规则

时间:2018-12-10 03:22:54

标签: list prolog rules fact

我有以下情况,我必须做出一个代表医生正在就诊的谓词,但是它不起作用。

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 个答案:

答案 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将尝试在成功替换后将其中的所有变量替换为其值之后,在 中证明产生的子目标。

您现在可以修复谓词定义。