Prologで逆階乗を取得する方法を見つけるのを手伝ってくれる人はいますか...
たとえばinverse_factorial(6,X)
===> X = 3
。
私はそれに多くの時間を費やしてきました。
私は現在階乗を持っていますが、それを可逆にする必要があります。私を助けてください。
Prolog の述語は関係であるため、階乗を定義すると、暗黙のうちに逆も定義されます。ただし、通常の算術演算は Prolog でモード化されています。つまり、(is)/2
orの式全体(>)/2
が実行時に認識されている必要があり、認識されていない場合はエラーが発生します。制約はこの欠点を克服します。
:- use_module(ライブラリ(clpfd) )。 n_factorial(0, 1)。 n_factorial(N, F) :- N #> 0、N1 #= N - 1、F #= N * F1、 n_factorial(N1, F1)。
この定義は、両方向で機能するようになりました。
?- n_factorial(N,6)。 N = 3; 間違い。 ?- n_factorial(3,F)。 F = 6; 間違い。
SICStus 4.3.4 および SWI 7.1.25 以降、以下も終了します。
?- n_factorial(N,N).
N = 1
; N = 2
; false.
詳細については、マニュアルを参照してください。
factorial(X, XFact) を実装してから、引数を交換するだけです
factorial(X, XFact) :- f(X, 1, 1, XFact).
f(N, N, F, F) :- !.
f(N, N0, F0, F) :- succ(N0, N1), F1 is F0 * N1, f(N, N1, F1, F).