Prolog元组算术:多项式求值代码运行报错问题咨询
修复Prolog多项式求值代码的算术错误
首先,咱们来定位问题根源:你的输入是元组列表(比如[(1,0),(4,3)]),但原代码的列表匹配逻辑错误地把列表当成了扁平的[系数, 指数, 系数, 指数...]结构。这会导致递归时把元组直接代入算术运算,而Prolog的is/2只支持数值运算,复合项(比如(4,3))无法参与计算,所以才会抛出算术错误。
修正后的代码
evaluate(P, X, Y) :- evaluate(P, X, Y, 0). % 终止条件:列表为空时,累加器S就是最终结果Y evaluate([], _, S, S). % 递归子句:逐个取出列表中的(系数, 指数)元组 evaluate([(Coeff, Exp)|Rest], X, Y, S) :- S1 is S + Coeff * X^Exp, evaluate(Rest, X, Y, S1).
代码逻辑说明
- 初始调用:
evaluate(P,X,Y)负责初始化累加器S为0,调用带累加器的辅助谓词启动计算。 - 终止条件:当多项式项列表为空时,把累加的结果
S赋值给Y,结束递归流程。 - 递归处理:每次从列表头部取出一个
(系数, 指数)元组,计算当前项的值并加到累加器S上得到新的累加器S1,再递归处理剩余的多项式项。
测试示例
比如执行以下查询:
?- evaluate([(1,0),(4,3)], 2, Y).
计算过程为 1*2^0 + 4*2^3 = 1 + 32 = 33,最终会返回 Y = 33。
这样修改后,代码就能正确处理元组形式的多项式列表啦~
内容的提问来源于stack exchange,提问作者Mitchell Faas
相关产品推荐
相关产品推荐

