fact(1,1):-!.
fact(N,F):-
N1=N-1,
fact(N1,F1),
F=F1*N.
它导致stackoverflow(不是站点)!它不应该因为削减(!)。它在SWI-Prolog中有用吗?
答案 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.