我对Prolog还是很陌生,我不确定为什么这段代码无法正常工作。我认为基本情况或递归情况的最后3行都可能出现问题。其他一切都很好。
此程序确定cosine calculated with series approximation,
为此,它需要计算2K的阶乘,也是-1 ^ K,然后在最终方程式中使用这2个计算(在%递归情况下完成)。
% 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进行帮助格式化)
由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.
我对Prolog还是很陌生,我不确定为什么这段代码无法正常工作。我认为基本情况或递归情况的最后3行都可能出现问题。其他一切...
基本情况是错误的,应该是cosN(N,N,_,0)。因为在程序完成递归过程后,K和N必须都等于N。这是一些测试案例,表明它现在可以工作: