prolog中的用户输入

时间:2012-03-24 05:21:46

标签: prolog

我想编写一个程序,如果用户进入冬季,则将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).  

现在,当我查询开始时,它按照预期询问了季节,我进入冬季。因为我觉得季节(冬天)会是真的,但是我再次被提示回答“它是什么季节?”。我怎样才能使这个简单的程序工作?

4 个答案:

答案 0 :(得分:3)

看起来你想要做的就是“前瞻性”。那么你 希望能够在知识库中添加一个事实,然后看看 弹出额外的事实。

当专家系统出现时,这些东西在80年代非常流行 也可以用Prolog完成。这是一篇粗略描述的文章 “后向链接”和“前向链接”之间的区别:

Logic Programming Associates Ltd.
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中的重写非常原始。可以增强重写 支持严格的谓词并支持动态删除事实。 那么“正向链接”的可能的附加应用领域是:

  • 自然语言处理
  • 约束解决

最好的问候

经过几年的发展后,目前的delta / 2改写:
http://www.jekejeke.ch/idatab/doclet/blog/en/docs/15_min/02_reference/minimal/delta.html

一篇文章显示约束商店可以建模:
https://plus.google.com/+JekejekeCh/posts/8oHErwopKxK

P.S。:谓词名志愿者/ 1源于Nexpert对象,
80年代和90年代使用的专家系统外壳 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 :(得分:2)

因为“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).

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

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

真。