我正在尝试使用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)
,因为它似乎没有在那里设置。
答案 0 :(得分:0)
一种可能的解决方案是将诸如owns/3
和value/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.