我想编写一个程序,如果用户进入冬季,则将“cold”设置为“true”;如果用户进入夏季,则将“warm”设置为“true”。这是我到目前为止所拥有的:
start :- write('What season is it?: '), read(X), season(X).
cold :- season(winter).
warm :- season(summer).
但是,当我查询开始并输入季节的冬季时,我收到一条错误,指出季节/1 未定义。为了解决这个问题,我尝试将代码更改为以下内容:
start :- season(X).
season(X) :- write('What season is it?: '), read(X).
cold :- season(winter).
warm :- season(summer).
现在,当我查询开始时,它会按预期询问季节,我进入了冬季。我询问 Cold 期望返回 true,因为我认为季节(冬季)是正确的,但我再次被提示回答“现在是什么季节?”。我怎样才能让这个简单的程序运行?
看起来你想做的是一种“前向链接”。所以你 希望能够将事实添加到知识库中,然后查看 弹出更多事实。
这些东西在 80 年代专家系统出现时非常流行 也可以用 Prolog 来完成。这是一篇文章,大致描述了 “后向链接”和“前向链接”之间的区别:
逻辑编程协会有限公司
ProWeb:专家系统
我尝试过改造类似于上面的前向链接的东西 通过许多 Prolog 中可用的子句扩展机制 系统并通过知识库中正常保存的议程 事实。扩展机制改变了以下形式的规则:
P :- A
进入一条规则,其中 X 是 P 或 A 中未出现的新鲜变量:
delta(X, P) :- A_new(X)
其中 A_new 是一个条件,表示当一个新事实时 P 是新的 X 已经到了。让我们考虑一下你的例子:
?- ['delta.p'].
?- [user].
:- forward season/1.
:- forward cold/0.
:- forward warm/0.
cold :- season(winter).
warm :- season(summer).
^D
这两条 Prolog 规则将转化为以下 delta/2 规则 通过重写。由于规则非常简单,所以 delta/2 规则 也很简单:
?- listing(delta/2).
delta(X, cold) :-
X = season(winter).
delta(X, warm) :-
X = season(summer).
这是一个示例会话:
?- list.
Yes
?- volunteer(season(winter)).
Yes
?- list.
season(winter).
cold.
Yes
delta.p 中的重写非常原始。重写可以增强 支持严格的谓词并支持动态删除事实。 “正向链接”可能的其他应用领域是:
P.S.:谓词名称 Volunteer/1 源于 Nexpert 对象,
80 年代和 90 年代使用的专家系统 shell。
NEXPERT OBJECT 3.0 版,Jean-Marie Chauvet,Neuron Data, Inc.
P.P.S.:但是您可能想查找更新的东西,例如 Rete-NT 或 OWL:
http://answers.semanticweb.com/questions/3304/forward-vs-backward-chaining
因为“
cold/0
”和“warm/0
”不带参数,所以不可能在运行时更改结果而不更改它们的定义。最简单的方法是根据用户输入使用 cold.
和 warm.
添加或删除事实“assert/1
”和“retractall/1
”。
start :- write('What season is it?: '), read(X), season(X).
season(summer) :- retractall(cold), assert(warm).
season(winter) :- retractall(warm), assert(cold).
在定义事实时,您需要稍微改变一下语法。
start(Y) :- write('What season is it?: '), read(X), nl, season(X,Y).
season(winter,cold).
season(summer,warm).
请注意,用户需要以句号结束输入。 (例如冬天。)
season(winter,cold).
season(summer,warm).
start:-write('What season is it?'),write(' '),read(X),season(X,Y),write(Y).
输出将如下所示:
?-开始。
现在是什么季节?冬天。
冷
是的。