首页 文章

Prolog:事实和规则

提问于
浏览
1

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

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

    作为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 ,因此要证明它们必须与我们知识库中的某些事实相匹配 . 但我们只有

    doctor(adele).
    doctor(inez).
    doctor(elin).
    
    patient(aurora).
    patient(mandy).
    patient(roan).
    

    我们没有 doctor(doc) 也没有 patient(pat) 作为陈述的事实 .

    另一方面, doctor(Doc) 将匹配任何陈述的 doctor/1 事实,因为 Doc 是一个能够承担任何值的逻辑变量 .

    Daniel Lyonsin 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 匹配,并且它们的arities,2也匹配,但括号内的参数都不匹配 . 特别是,

    adele = doc
    

    失败了,也是

    roan = pat
    

    如果尝试过,也会失败 .

    但是,如果你使用变量,那么

    adele = Doc , roan = Pat
    

    相反会取而代之,导致替换 Doc = adele , Pat = roan . 因为规则的头部也会匹配,作为一个整体,

    doctor_attends_patient(adele,roan)
    doctor_attends_patient( Doc , Pat)
    

    将输入规则的主体,并且Prolog将在用其成功替换中的值替换其中的任何变量之后尝试证明所得的子目标 .

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

相关问题