正整数和负整数的 Prolog 谓词

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

我目前正在准备 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 ...

我只是想知道什么是改变这一点的好方法,以便让它们按正确的顺序列出。

recursion prolog predicate swi-prolog swi-prolog-for-sharing
1个回答
0
投票

高效:

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 ;
...
© www.soinside.com 2019 - 2024. All rights reserved.