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

如何在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

我试图用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(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)。