【问题标题】:Differentiating two people prolog区分两个人序言
【发布时间】:2018-02-12 07:43:36
【问题描述】:

我是 Prolog 的新手,我无法理解 OR 运算符“;” 所以这是下面的一个例子:-

/*attributes(Person,Eats,Footwear).*/

attributes( personA,
        eats(fried;baked),
        footwear(shoes;slippers)
       ).

attributes( personB,
        eats(roasted;baked),
        slippers
       ).

person(Person, Eats, Footwear) :-

attributes(Person,
        Eats,
        Footwear
        ).

所以我需要区分 personA 和 personB,例如,如果我输入查询

person(Person, roasted, _).

由于只有 personB 具有烤的属性,它应该返回Person = personB

然后,例如,如果我输入查询

person(Person, baked, _).

由于 A 和 B 都有属性 bake,它应该返回 Person = personA Person = personB

谁能解释一下如何正确制定规则。谢谢。

【问题讨论】:

    标签: prolog


    【解决方案1】:

    要得到你想要的结果,你必须以这种方式重写知识库(你不能在一个术语中使用;):

    footwear(personA,slippers).
    footwear(personA,shoes).
    footwear(personB,slippers).
    
    eats(personA,fried).
    eats(personA,baked).
    eats(personB,roasted).
    eats(personB,baked).
    

    然后你查询:

    ?- eats(Person,roasted).
    Person = personB.
    
    ?- eats(Person,baked).
    Person = personA
    Person = personB
    

    如果你喜欢概率编程,你可以把这个程序翻译成概率程序,也许会得到一些有趣的结果。

    【讨论】:

    • 嗨,对于这种方法,我将如何编写查询来比较两个数据,例如“person(Person, bake, shoes)。”
    • person(Person, bake, shoes)的结果应该是什么?您想通过此查询找到什么?
    • 它会返回 Person = personA,因为他吃的是烤的,穿的是鞋子。
    • 只需?-eats(Person,baked), footwear(Person,shoes).
    • @AkbarMna 从技术上讲,你可以在任何你喜欢的地方使用;。问题是:Prolog 在哪里实际应用了它作为运算符的解释。这发生在谓词的主体或命令行中。所以你可以说,?- eats(Person, baked) ; eats(Person, fried).,这将向你显示所有Person 值,该人在哪里吃烘焙食品或该人吃油炸食品。但是如果你写eats(baked ; fried),Prolog解释;。它只是一个函子,并将其视为eats(';'(baked, fried))。这可能看起来很奇怪,但它允许您编写谓词来推理 ;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多