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

(サイトではなく)スタックオーバーフローにつながります!カット(!)のせいではないはずです。SWI-Prolog で動作しますか?

4

1 に答える 1

4

両方の定義 (OP とパッド) は、 のようなクエリで終了しないことに注意してくださいfact(0,N)。しかし、また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.
于 2011-06-22T10:21:02.970 に答える