prolog - 如何在 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)
,因为它似乎没有设置在那里。
解决方案
一种可能的解决方案是声明谓词,例如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.
推荐阅读
- solr - Nutch solr 指数失败
- sql - SQLServer 2016 - BCP 在使用临时表时生成空文件
- python-3.x - 无法点击链接
- 元素列表python代码
- python - 我的链表实现的成员资格检查方法中的错误
- keycloak - Keycloak 容器 kcadmin 错误:连接到 localhost:8080 [localhost/127.0.0.1] 失败
- ios - SwiftUI - 使用未正确取消选择其他按钮的按钮进行分段控制
- azure-data-lake-gen2 - ADLS 中容器内的文件夹级别访问控制
- angular - 键盘输入时关注下一个链接 显示更多
- vue.js - 如何在 vue.js 中显示图像 url
- sql - 在 MS Access 中将日期作为一个字段从 2 个表中排序