序言中的用户输入

问题描述 投票:0回答:4

我想编写一个程序,如果用户进入冬季,则将“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,因为我认为季节(冬季)是正确的,但我再次被提示回答“现在是什么季节?”。我怎样才能让这个简单的程序运行?

prolog
4个回答
2
投票

看起来你想做的是一种“前向链接”。所以你 希望能够将事实添加到知识库中,然后查看 弹出更多事实。

这些东西在 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


1
投票

因为“

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).

0
投票

在定义事实时,您需要稍微改变一下语法。

start(Y) :- write('What season is it?: '), read(X), nl, season(X,Y).
season(winter,cold).
season(summer,warm).

请注意,用户需要以句号结束输入。 (例如冬天。)


0
投票
season(winter,cold).  
season(summer,warm).  
start:-write('What season is it?'),write(' '),read(X),season(X,Y),write(Y).  

输出将如下所示:
?-开始。
现在是什么季节?冬天。

是的。

© www.soinside.com 2019 - 2024. All rights reserved.