Prolog递归溢出

时间:2011-06-22 09:50:11

标签: recursion prolog clpfd prolog-cut

fact(1,1):-!.
fact(N,F):-
    N1=N-1,
    fact(N1,F1),
    F=F1*N.

它导致stackoverflow(不是站点)!它不应该因为削减(!)。它在SWI-Prolog中有用吗?

1 个答案:

答案 0 :(得分:4)

请注意,fact(0,N)之类的查询不会终止这两个定义(OP和pad)。但fact(1,2)也不会终止。它应该失败。而对于fact(N, F),它只给出了一个正确的答案,但应该有无数的答案。为此目的使用切割是非常棘手的。解决这个问题的最简单方法是将目标N > 0添加到规则并设置事实fact(0,1).如果您使用SWI-Prolog:使用library(clpfd),还有更好的方法。在文档中,您发现已定义n_factorial/2。它可用于以下查询:

?- n_factorial(47, F).
F = 258623241511168180642964355153611979969197632389120000000000 ;
false.

?- n_factorial(N, 1).
N = 0 ;
N = 1 ;
false.

?- n_factorial(N, 3).
false.