【发布时间】:2017-11-06 17:02:38
【问题描述】:
我有以下知识库:
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).
add2(W+X,Y+Z,R) :- add(W,X,A),add(Y,Z,T),add2(A,T,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(X,Y,R) :- add(X,Y,R).
正确评估查询,例如:
?- add2(s(0)+s(s(0)), s(s(0)), Z).
Z = s(s(s(s(s(0)))))
?- add2(0, s(0)+s(s(0)), Z).
Z = s(s(s(0)))
?- add2(s(s(0)), s(0)+s(s(0)), Z).
Z = s(s(s(s(s(0)))))
但是,以下查询被评估为:
?- add2(s(0)+s(0), s(0+s(s(0))), Z).
Z = s(s(s(0+s(s(0))))) .
但是需要的输出是:
?- add2(s(0)+s(0), s(0+s(s(0))), Z).
Z = s(s(s(s(s(0)))))
我知道问题出在以下行:
add2(W+X,Y+Z,R) :- add(W,X,A),add(Y,Z,T),add2(A,T,R).
但我就是想不通。任何帮助将不胜感激!
【问题讨论】:
-
您还需要在前两个调用中递归调用
add2/3。所以使用add2(W+X,Y+Z,R) :- add2(W,X,A),add2(Y,Z,T),add2(A,T,R).。但是如果你想要一个纯粹的 Prolog 实现,你需要更彻底地改变代码。 -
该实现的输出没有任何变化。
-
形式有点奇特。为什么在两个不同的参数中进行内联加法,然后将它们加在一起会带来额外的复杂性?
标签: prolog successor-arithmetics