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 将尝试在 之后用成功替换的值替换其中的任何变量来证明生成的子目标。

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