fact(1,1):-!.
fact(N,F):-
N1=N-1,
fact(N1,F1),
F=F1*N.
(サイトではなく)スタックオーバーフローにつながります!カット(!)のせいではないはずです。SWI-Prolog で動作しますか?
fact(1,1):-!.
fact(N,F):-
N1=N-1,
fact(N1,F1),
F=F1*N.
(サイトではなく)スタックオーバーフローにつながります!カット(!)のせいではないはずです。SWI-Prolog で動作しますか?
両方の定義 (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.