如何在Prolog中表示情境演算?

时间:2019-03-27 18:55:26

标签: 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),因为它似乎没有在那里设置。

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是将诸如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.