递归程序在Prolog中不起作用

问题描述 投票:1回答:1

我对Prolog还是很陌生,我不确定为什么这段代码无法正常工作。我认为基本情况或递归情况的最后3行都可能出现问题。其他一切都很好。

此程序确定cosine calculated with series approximation

enter image description here

为此,它需要计算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.

但是,它没有正确进行递归,并且输出最终看起来像这样:example output

其中5pi可以是任何东西,只要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行都可能出现问题。其他一切...

prolog trigonometry approximate
1个回答
0
投票

基本情况是错误的,应该是cosN(N,N,_,0)。因为在程序完成递归过程后,K和N必须都等于N。这是一些测试案例,表明它现在可以工作:

© www.soinside.com 2019 - 2024. All rights reserved.