首页 > 解决方案 > 如何在 Prolog 中表示情况演算?

问题描述

我试图用 swi-prolog 来表示情况演算中的情况。这种情况是物品的销售,其中:

“A 人以 10 美元的价格将 I 物品卖给 B 人。我的物品在出售前价值 20 美元。”

到目前为止,我所拥有的是基本事实:

person(a).
person(b).
item(i).

owns(a,i,s0).
value(i,20,s0).

我认为我必须做的是定义sell谓词。到目前为止,我尝试过的是:

sell(Seller, Buyer, Item, Price, S0, S1):-
  (
    person(Seller), person(Buyer), item(Item), owns(Seller,Item,S0)
    ->  not(owns(Seller,Item,S1)), 
        owns(Buyer,Item,S1)
  ).

我想做的是说sell(a,b,i,10,s0,s1)然后检查owns(b,i,s1)哪个应该返回true。问题是我不知道如何设置owns(Buyer,Item,S1),因为它似乎没有设置在那里。

标签: prolog

解决方案


一种可能的解决方案是声明谓词,例如owns/3value/3作为动态谓词:

:- dynamic([owns/3, value/3]).

然后将您的规则重写为:

sell(Seller, Buyer, Item, Price, S0, S1):-
    (   person(Seller),
        person(Buyer),
        item(Item),
        owns(Seller,Item,S0) -> 
        assertz(owns(Buyer, Item, S1)),
        assertz(value(Item, Price, S1))       
    ).

在 Prolog 中使用动态谓词是应该尽可能避免的,但这种情况可能需要使用它们。

示例调用:

?- sell(a, b, i, 10, s0, s1).
true.

?- owns(Who, Item, Time).
Who = a,
Item = i,
Time = s0 ;
Who = b,
Item = i,
Time = s1.

推荐阅读