Prolog 断言,如果我们输入6作为参数,将生成A=6,B=0。。。A=4,B=2。。。A=2,B=4。。。A=0,B=6,结束

Prolog 断言,如果我们输入6作为参数,将生成A=6,B=0。。。A=4,B=2。。。A=2,B=4。。。A=0,B=6,结束,prolog,Prolog,这就是我所拥有的: values(Count, A, B) :- A is Count, B is 0. values(Count, A, B) :- values(Count, Aa, Bb), A is Aa-2, B is Bb+2, \+ A < 0; B < 0. 我明白了,但是解释器一直在运行,并耗尽了堆栈空间,因为递归值(Count,Aa,Bb)在开始时。我不知道如何重写它,以使递归不是无止境的,我

这就是我所拥有的:

values(Count, A, B) :- 
    A is Count, 
    B is 0. 
values(Count, A, B) :- 
    values(Count, Aa, Bb), 
    A is Aa-2, 
    B is Bb+2,
    \+ A < 0; 
    B < 0.

我明白了,但是解释器一直在运行,并耗尽了堆栈空间,因为递归
值(Count,Aa,Bb)
在开始时。我不知道如何重写它,以使递归不是无止境的,我希望它在得到上述输出后结束。有人能帮忙吗?

我会这样做:

val(A,A,0):- 
    A>=0.
val(C,A,B):-
    CC is C-2,
    CC >=0,
    val(CC,A,BB),
    B is BB+2.
输出是

?- val(6, A, B).
A = 6,
B = 0 ;
A = 4,
B = 2 ;
A = 2,
B = 4 ;
A = 0,
B = 6 ;
false.

那么有什么区别呢?我使用
Count
变量作为计数器。它必须在每一步中减少,以迫使递归结束。缺点是我必须确保计数器永远不小于零。

我会这样做:

val(A,A,0):- 
    A>=0.
val(C,A,B):-
    CC is C-2,
    CC >=0,
    val(CC,A,BB),
    B is BB+2.
输出是

?- val(6, A, B).
A = 6,
B = 0 ;
A = 4,
B = 2 ;
A = 2,
B = 4 ;
A = 0,
B = 6 ;
false.

那么有什么区别呢?我使用
Count
变量作为计数器。它必须在每一步中减少,以迫使递归结束。缺点是我必须确保计数器永远不小于零。

如果在/3之间使用,可能会更容易。你知道这个论点是正偶数吗

p(To0, A, B) :-
    To is To0 div 2,
    between(0, To, X),
    A is (To - X) * 2,
    B is X * 2.

如果在/3之间使用,可能会更容易。你知道这个论点是正偶数吗

p(To0, A, B) :-
    To is To0 div 2,
    between(0, To, X),
    A is (To - X) * 2,
    B is X * 2.

非常直截了当,谢谢!非常直截了当,谢谢!非常感谢你!非常感谢你!