prolog - 序言加法练习

标签 prolog successor-arithmetics

我用这个非常简单的代码来表示数字。问题是当我使用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/

相关文章:

prolog - bagof/3是不可预测的

math - 序言中的除法

prolog - 是否应该在定义加法的规则中交换第一个和第二个参数?

lambda - 如何返回到一个点的最小距离?

prolog - 如何在 Prolog 中表示 "Alberich hates everyone but himself"?

Prolog, "or"规则语句运算符

prolog - 判断一个数是否是另一个数的倍数

Prolog 大于/2 成功

prolog - 如何判断皮亚诺数是否为偶数

list - 点积 Prolog/3 需要 SUM 提示