Prolog四参数加法谓词myadd异常结果问题求助
你的myadd逻辑本身是正确的——我在SWI-Prolog中测试了你的代码,查询?- myadd(A, B, C, s(s(0))).只会返回符合A+B+C=D的6组有效解,不会出现你提到的A = s(0), B = 0, C = s(s(0))这种错误结果。
你遇到的问题大概率是以下情况之一:
- 代码拼写错误:比如你实际编写的
myadd第一个子句不是add(B, C, D),而是误写为add(A, B, D)(这会导致C可以是任意值,从而产生错误解),或者add谓词的定义有笔误。 - 查询输入错误:比如你实际查询的是
myadd(A, B, C, s(s(s(0))))而非s(s(0)),这时候A = s(0), B = 0, C = s(s(0))是有效解(s(0)+0+s(s(0))=s(s(s(0)))),你可能看错了目标值D。 - Prolog环境的异常:极少数情况下,特定Prolog实现的回溯机制可能出现异常,但这种概率极低。
另外,给你一个更直观且不易出错的myadd实现方式——直接复用add谓词做两次加法:
add(0, Y, Y). add(s(X), Y, s(Z)) :- add(X, Y, Z). myadd(A, B, C, D) :- add(A, B, Temp), % 先计算A+B=Temp add(Temp, C, D). % 再计算Temp+C=D
这个实现逻辑更清晰,也更容易验证正确性,你可以试试这个版本,看是否还会出现异常结果。
内容的提问来源于stack exchange,提问作者boonatamotua
相关产品推荐
相关产品推荐

