我用这个非常简单的代码来表示数字。问题是当我使用add2函数时。
示例:add2(s(0)+s(s(0)), s(s(0)), Z).
正确返回s(s(s(s(s(0)))))
。但是add2(0, s(0)+s(s(0)), Z).
总是returns s(0)+s(s(0))
。谁能看到为什么会这样?
numeral(0).
numeral(s(X)) :- numeral(X).
numeral(X+Y) :- numeral(X), numeral(Y).
add(0,X,X).
add(s(X),Y,s(Z)) :- add(X,Y,Z).
%% exercise 1
add2(X,Y,R) :- add(X,Y,R).
add2(X+Y,Z,R) :- add(X,Y,A),add2(A,Z,R).
add2(X,Y+Z,R) :- add(Y,Z,A),add2(X,A,R).
最佳答案
这是由于第一个add2
子句和第一个add
子句的组合而发生的。您的add2(0, ..., ...)
将触发add(0, ..., ...)
,它始终将第二个和第三个参数统一起来。
关于prolog - 序言加法练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7909507/