【发布时间】:2019-04-20 09:50:16
【问题描述】:
看下面的代码:
multiple(X,0).
multiple(X,Y) :- lt(0,X), lt(0,Y), diff(Y,X,D), multiple(X,D).
发生了一些错误。供您参考:
lt/2 是第一个参数是否小于第二个。
diff/3 是第三个参数是否等于第一个参数减去第二个参数。
lt/2 和 diff/3 定义正确。
定义中是否存在逻辑错误?假设 0 是每个有问题的数字的倍数还是其他地方的逻辑错误?我得到了正确的答案,但我认为查询进入了无限循环。
编辑:
这是其他定义。
natNum(0).
natNum(s(X)) :- natNum(X).
lt(0,s(X)) :- natNum(X).
lt(s(X),s(Y)) :- lt(X,Y).
sum(0,X,X).
sum(s(X),Y,s(Z)) :- sum(X,Y,Z).
diff(X,Y,Z) :- sum(Z,Y,X).
?- multiple(X, s(s(s(s(s(s(0))))))).
s(0) 是 1,s(s(0)) 是 2 等等。它给出了 X 的所有所需答案,但在最后一个答案之后,它就卡住了。我假设在无限递归循环中?
【问题讨论】:
-
什么不起作用?什么查询失败了?你
trace.了吗? -
?- multiple(X, s(s(s(s(s(s(0))))))).其中 s(0) 为 1,s(s(0)) 为 2 等等。它为 X 提供了所有所需的答案,但在最后一个答案之后,它卡住了。我假设在无限递归循环中? @WillemVanOnsem -
请添加
lt/2和diff/3的定义。如果我们没有看到它们,我们怎么知道! -
已编辑。 :) @false
-
写
X = s(_)代替lt(0,X)(两次)
标签: prolog failure-slice successor-arithmetics