私はまだ Prolog を使い始めたばかりで、このコードが機能しない理由がわかりません。基本ケースまたは再帰ケースの最後の 3 行の問題である可能性が最も高いと思います。他のすべては問題なく動作します。
このプログラムは、級数近似で計算されたコサインを決定します。
そのためには、2K の階乗を計算する必要があり、さらに -1 ^ K を計算し、これら 2 つの計算を最終的な式で使用します (これは % Recursive Case で行われます)。
% Factorial from class
fact(0, 1).
fact(N, F) :-
N > 0,
N1 is N-1,
fact(N1, F1),
F is F1 * N.
% Calculate -1 ^ K
signCnt(0,1).
signCnt(K,S) :-
K > 0,
K1 is K - 1,
signCnt(K1,S1),
S is S1 * -1.
% Base case
cosN(N,_,_,0).
% Recursive case
cosN(K,N,X,Y) :- K < N,
signCnt(K,S),
K2 is 2 * K,
fact(K2,F),
Yk is (S * X**K2)/F,
K1 is K + 1,
cosN(K1,N,X,Y1),
Y is Y1 + Yk.
cosN(N,X,Y) :-
N>0,
cosN(0,N,X,Y).
入力は次の形式にする必要があります
?- cosN(25,pi,Y).
期待される出力で
Y = -1.0 ;
false.
ここで5
、 とpi
は、pi が pi の形式 (つまり pi/2、pi/3) のままである限り、何であってもかまいません。行を編集/置換する必要があります。私を正しい方向に向けてくれるものは何でも大歓迎です。
(ヘルプの書式設定については、Guy Coder に感謝します)
ガイ・コーダーによる編集
SWI-Prolog を使用したいくつかのテスト ケース
:- begin_tests(cosine_approximation).
factorial_test_case_generator(0,1).
factorial_test_case_generator(1,1).
factorial_test_case_generator(2,2).
factorial_test_case_generator(3,6).
factorial_test_case_generator(4,24).
factorial_test_case_generator(5,120).
factorial_test_case_generator(6,720).
factorial_test_case_generator(7,5040).
factorial_test_case_generator(8,40320).
factorial_test_case_generator(20,2432902008176640000).
test('factorial',[nondet,forall(factorial_test_case_generator(N,Factorial))]) :-
fact(N,Factorial).
signCnt_test_case_generator(0,1).
signCnt_test_case_generator(1,-1).
signCnt_test_case_generator(2,1).
signCnt_test_case_generator(3,-1).
signCnt_test_case_generator(4,1).
signCnt_test_case_generator(5,-1).
test('signCnt',[nondet,forall(signCnt_test_case_generator(N,Sign))]) :-
signCnt(N,Sign).
:- end_tests(cosine_approximation).
実行例:
?- make.
% c:/users/eric/documents/projects/prolog/so_question_161 compiled 0.00 sec, 5 clauses
% PL-Unit: cosine_approximation .......... done
% All 10 tests passed
true.