首页 > 解决方案 > Prolog 无法对 forall 谓词的结果求和

问题描述

我正在尝试使用 forall 谓词计算 Prolog 中的每个二项式系数。在我计算出一个系数后,我将它与 sqrt(5) 相除,然后我想将所有结果汇总为一个结果,但我收到一个错误,我不知道我需要在代码中更改什么以便好好工作。

我使用 forLoop 谓词从 0(零)迭代到 N 和每一步的 calculateCoeficient 谓词。

这是我的代码:

forLoop(Low,High,_,Low):-
    Low=<High.
forLoop(Low,High,Step,Var):-
    Inc is Low+Step, Inc =< High, forLoop(Inc,High,Step,Var).

pow2(X,Y,Z):-Z is X**Y.

permutari(0,1).
permutari(1,1).
permutari(N,R):-N1 is N-1,permutari(N1,R1), R is N*R1.

aranjamente(N,K,R):-permutari(N,R1),N1 is N-K,permutari(N1,R2), R is round(R1/R2).

combinari(N,K,R):-aranjamente(N,K,R1), permutari(K,R2), R is round(R1/R2).

calculateCoeficient(A,B,N,K,R):-
    combinari(N,K,C1), pow2(A,N-K,C2),pow2(B,K,C3), R is C1*C2*C3.


calculateFibo2(N,Step,R,S):-
    Radical is sqrt(5),
    Phi is Radical/2+0.5,
    F1 is float_integer_part(Phi),
    F2 is float_fractional_part(Phi),
    forall(
        forLoop(0,N,Step,K),
        calculateCoeficient(F1,F2,N,K,S),
        R1 is round(S/Radical),
        R := R+R1
    ).


对于调用:calculateFibo2(2,1,R,S) 我得到以下异常

ERROR: Undefined procedure: forall/4
ERROR:   However, there are definitions for:
ERROR:         forall/2
ERROR:         forall/2
ERROR: 
ERROR: In:
ERROR:    [9] forall(forLoop(0,2,1,_16156),calculateCoeficient(1.0,0.6180339887498949,2,_16166,_16168),_16172 is round(...),_16182:=_16188+_16190)
ERROR:    [8] calculateFibo2(2,1,_16218,_16220) 
   Exception: (9) forall(forLoop(0, 2, 1, _15580), calculateCoeficient(1.0, 0.6180339887498949, 2, _15580, _15268), _15596 is round(_15268/2.23606797749979), _15266:=_15266+_15596) ?

标签: prologfibonaccibinomial-coefficients

解决方案


只是一个不适合评论的注释。

事实上的标准forall/2谓词在其实现中使用否定。它相当于:

:- meta_predicate(forall(0, 0)).

forall(Generate, Test) :-
    \+ (Generate, \+ Test).

由于使用了否定,成功调用forall/2谓词时不会返回任何绑定。因此,您不能用于您尝试实现的计算。

PSR := R+R1应该是R is R+R1


推荐阅读