prolog - 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) ?
解决方案
只是一个不适合评论的注释。
事实上的标准forall/2
谓词在其实现中使用否定。它相当于:
:- meta_predicate(forall(0, 0)).
forall(Generate, Test) :-
\+ (Generate, \+ Test).
由于使用了否定,成功调用forall/2
谓词时不会返回任何绑定。因此,您不能用于您尝试实现的计算。
PSR := R+R1
应该是R is R+R1
。
推荐阅读
- java - 带有审核的 ZoneId 字段
- r - y 轴的自由刻度不适用于 facet_nested (ggh4x)
- sharepoint - 抱歉,此网站无法保存为模板。它包含在模板中不起作用的应用程序
- salesforce - 使用 informatica 更新到 Salesforce 用户对象
- javascript - 将动态道具传递给 Vue.js 中的子组件
- reactjs - React Redux 状态已更新但 ui 不会重新加载 & 如果从 redux 状态复制数据然后覆盖该数据,它将自动更新 redux 状态
- google-maps - 获取地图上位置的边界点以设置地址
- mysql - 在 MySQL 存储过程中,如何过滤从字符串列表中的任何一个开始的记录?
- java - 无法将字符串转换为 Int 进行求和
- python - 如何使用for循环计算函数的方差?