Prolog中mul实现问题:add被识别为结构而非谓词求解决
解决Prolog乘法谓词的调用问题
嘿,我来帮你搞定这个乘法谓词的问题!你遇到的核心问题有两个:一是把谓词调用写成了结构赋值,二是乘法的递归逻辑有点小偏差。
先看你写的mul第三个子句:
mul(inc(X), Y, Z) :- mul(X,Y,V), Z = add(Y,Y,Z).
这里的Z = add(Y,Y,Z)是在告诉Prolog:把Z绑定成一个add/3结构(也就是把Z当成一个静态数据项,而不是去执行加法计算),这就是为什么你会得到类似add(...)的结构结果,而不是预期的inc嵌套形式。
正确的写法和逻辑
首先回忆乘法的递归定义:inc(X) * Y = (X * Y) + Y,也就是“X加1之后乘以Y,等于X乘Y的结果再加上Y”。结合你已经正确实现的add谓词,正确的mul谓词应该这样写:
% 0乘以任何数都是0 mul(zero, Y, Z) :- Z = zero. % 递归:inc(X)*Y = X*Y + Y mul(inc(X), Y, Z) :- mul(X, Y, V), % 先计算X*Y,结果存在V中 add(V, Y, Z). % 调用add谓词,把V和Y相加得到最终结果Z
另外,你写的mul(inc(zero), Y, Z) :- Z = Y.这个子句其实可以去掉——当X是zero时,inc(X)就是1,此时递归调用mul(zero, Y, V)会得到V=zero,再调用add(zero, Y, Z)就会返回Z=Y,和这个子句的效果完全一致。保留也没问题,但去掉会让代码更简洁。
测试验证
比如你测试mul(inc(inc(zero)), inc(inc(inc(zero))), Z),Prolog会一步步计算:
- 先调用
mul(inc(zero), inc(inc(inc(zero))), V) - 再调用
mul(zero, inc(inc(inc(zero))), V1),得到V1=zero - 调用
add(zero, inc(inc(inc(zero))), V),得到V=inc(inc(inc(zero))) - 最后调用
add(inc(inc(inc(zero))), inc(inc(inc(zero))), Z),得到Z=inc(inc(inc(inc(inc(inc(zero)))))),也就是2*3=6的正确表示。
内容的提问来源于stack exchange,提问作者user2985816
相关产品推荐
相关产品推荐

