2

私はまだ 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.
4

2 に答える 2