如何在Prolog中表示情境演算?
我试图用swi prolog来表示情境演算中的情境。这种情况是指销售物品,其中: “A以10美元的价格将物品I出售给B。在出售之前,物品I的价值为20美元。” 到目前为止,我掌握的是基本事实:如何在Prolog中表示情境演算?,prolog,Prolog,我试图用swi prolog来表示情境演算中的情境。这种情况是指销售物品,其中: “A以10美元的价格将物品I出售给B。在出售之前,物品I的价值为20美元。” 到目前为止,我掌握的是基本事实: person(a). person(b). item(i). owns(a,i,s0). value(i,20,s0). 我想我要做的是定义sell谓词。到目前为止,我尝试的是: sell(Seller, Buyer, Item, Price, S0, S1):- ( person(Sel
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
。问题是我不知道如何设置所有者(买方,项目,S1)
,因为它似乎没有设置。一个可能的解决方案是将所有者/3
和值/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.
一种可能的解决方案是将诸如
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.
正如我的名字可能暗示的那样,我对Prolog是新手。“将谓词…声明为动态谓词”是什么意思?@PrologNoob我回答中的第一行代码,
dynamic/1
指令,它应该在事实和规则之前位于源文件的顶部。这很有效!通过将sell(a,b,i,10,s0,s1)。
添加到文件中,您只需查询owns(Who,Item,Time)
而无需执行?-sell(a,b,i,10,s0,s1)。
正如我的名字所示,我对Prolog是新手。“将谓词…声明为动态谓词”是什么意思?@PrologNoob我回答中的第一行代码,dynamic/1
指令,它应该在事实和规则之前位于源文件的顶部。这很有效!通过将sell(a,b,i,10,s0,s1)。
添加到文件中,您只需查询owns(Who,Item,Time)
而无需执行?-sell(a,b,i,10,s0,s1)。