如何制作一个递归地倒数到 0 的 prolog 谓词。(swi-pl)

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

给定一个数字 Num,谓词应该从 Num 倒数到 0,不包括 Num。尝试递归地执行此操作,但只收到一个答案作为输出,而不是整个倒计时。

尝试从 Num 中减去 1,然后递归地返回该值,当 Num 等于 1 时,有一个基本情况,这将给出输出 CDN = 0。但不知何故,我的代码只返回倒计时的第一个数字。跟踪输出时,它会执行所有步骤并且不会失败,但最终仅返回 CDN = 5,尽管它已经计算了 CDN 的所有其他结果。

这是我的代码:

countdown(0, 1). 
countdown(CDN, Num):-
    Num > 1,
    Num1 is Num1 - 1,
    countdown(CDN1, Num1), % Returns Num1 as Num
    CDN is CDN1 + 1.
recursion prolog countdown predicate swi-prolog
1个回答
0
投票

一个简单的解决方案是:

countdown(N, C) :-
    N > 0,
    C is N - 1.
countdown(N, C):-
    N > 0,
    M is N - 1,
    countdown(M, C).

示例:

?- countdown(3, C).
C = 2 ;
C = 1 ;
C = 0 ;
false.

稍微好一点的版本如下:

countdown1(1, 0) :- !.  % avoid spurious choicepoint (that produces 'false' after last answer)
countdown1(N, C) :-
    N > 0,              % avoid recomputing predecessor of N on backtracking
    M is N - 1,         
    (   C = M
    ;   countdown1(M, C) ).

示例:

?- countdown1(3, C).
C = 2 ;
C = 1 ;
C = 0.
© www.soinside.com 2019 - 2024. All rights reserved.