在SWI-Prolog中,我想计算用户输入up
和down
的次数。每次输入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.
我做错了什么?
答案 0 :(得分:1)
问题在于succ/2
。 仅适用于正数。
来自文档
succ(X, 0)
无声地失败
然而,断言和撤回并不是可追溯的。因此增加的计数器被断言,而减少的值仅被收回,但从未断言。这就是你看到
的原因5 ?- xu(X).
false.
而不是
5 ?- xu(X).
X = 0.
我建议你改用X1 is X + 1
和X1 is X - 1
。