我目前正在准备 Prolog 考试,因此我正在尝试做一些示例问题来做好准备。我已经尝试这个有一段时间了,它的任务是创建 intgr/1 以便
?-intgr(X).
X=0;
X=1;
X=-1;
X=2;
X=-2;
...
我现在拥有的是
intgr(0).
intgr(X) :- intgr(Y), (X is Y + 1 ; X is Y - 1).
但是,它以一种非常奇怪的方式列出它们,即:
X = 0
X = 1
X = -1
X = 2
X = 0
X = 0
X = -2
X = 3 ...
我只是想知道什么是改变这一点的好方法,以便让它们按正确的顺序列出。
高效:
intgr(I) :-
integer(I),
% Any integer will do, can stop here
!.
intgr(I) :-
var(I),
( I = 0
% Start alternating +/- with 1
; intgr_(1, I)
).
% Plus
intgr_(N, N).
% Minus
intgr_(N, -N).
intgr_(N, I) :-
% Increment into infinity
N1 is N + 1,
intgr_(N1, I).
swi-prolog 中的结果:
?- intgr(-5).
true.
?- intgr(0).
true.
?- intgr(4).
true.
?- intgr(fish).
false. % Fails quickly, as appropriate
?- intgr(I).
I = 0 ;
I = 1 ;
I = - 1 ;
I = 2 ;
I = - 2 ;
I = 3 ;
I = - 3 ;
...