算上起伏

时间:2013-12-05 09:20:54

标签: prolog

在SWI-Prolog中,我想计算用户输入updown的次数。每次输入up时,向上计数器(xu)将增加,向下计数器(xd)将减少。当用户打字时,会发生同样的情况。这就是我所拥有的:

:- dynamic xd/1, xu/1.

xd(0).
xu(0).

up :- 
   retract(xu(Xu)),
   succ(Xu, Xu1),
   asserta(xu(Xu1)), 
   retract(xd(Xd)),
   succ(Xd1,Xd),
   asserta(xd(Xd1)).

down :- 
   retract(xd(Xd)),
   succ(Xd, Xd1),
   asserta(xd(Xd1)),
   retract(xu(Xu)),
   succ(Xu1,Xu),
   asserta(xu(Xu1)).

但我有两个问题:

每当用户键入up.down.时,他都会获得false.,但xu或xd(分别) 正在增加。例如

   1 ?- down.
   false.

   2 ?- down.
   false.

   3 ?- xd(X).
   X = 2.

我遇到的第二个问题是,如果用户开始多次输入up.,然后down.,则xd计数器不会增加。例如:

1 ?- down.
false.

2 ?- down.
false.

3 ?- xd(X).
X = 2.

4 ?- up.
false.

5 ?- xu(X).
false.

我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题在于succ/2仅适用于正数。

来自文档

  

succ(X, 0)无声地失败

然而,断言和撤回并不是可追溯的。因此增加的计数器被断言,而减少的值仅被收回,但从未断言。这就是你看到

的原因
5 ?- xu(X).
false.

而不是

5 ?- xu(X).
X = 0.

我建议你改用X1 is X + 1X1 is X - 1