2011-06-22 4 views
0
fact(1,1):-!. 
fact(N,F):- 
    N1=N-1, 
    fact(N1,F1), 
    F=F1*N. 

これは(サイトではなく)スタックオーバーフローにつながります。それはカット(!)のためにではありません。それはSWI-Prologで動作しますか?プロローグの再帰オーバーフロー

答えて

3

fact(0,N)のようなクエリでは、両方の定義(OPとパッド)は終了しないことに注意してください。しかし、fact(1,2)も終了しません。それは失敗するはずです。 fact(N, F)の場合、正しい答えは1つだけですが、無限に多くなければなりません。そのような目的のためにカットを使用することは非常に難しいです。これを修正する最もきれいな方法は、目標に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. 
関連する問題