给定一个数字 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.
一个简单的解决方案是:
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.