2

我正在尝试使用余数定理和良序原则来定义序言中的除法。

到目前为止,我已经:

less(0, s(0)).

less(0, s(B)) :- less(0, B).
less(s(A), s(s(B))) :- less(A, s(B)).

add(A,0,A)       :- nat(A).
add(A,s(B),s(C)) :- add(A,B,C).  % add(A,B+1,C+1) = add(A,B,C)

add2(A,0,A).
add2(A,s(B),s(C)) :- add2(A,B,C).  % add(A,B+1,C+1) = add(A,B,C)

times(A,0,0).
times(A,s(B),X) :- times(A,B,X1),
               add(A,X1,X).

eq(0,0).
eq(s(A), s(B)) :- eq(A, B).

% A / B = Q (R) => A = B * Q + R
div(A, B, Q, R) :- less(R, B), eq(A, add(times(Q, R), R)).

但是 的定义在div某种程度上是错误的。有人可以给我一个提示吗?

PS:我不应该使用eq,但我无法获得is=工作。

4

1 回答 1

5

在 SWI-Prolog 中,您可以尝试?- gtrace, your_goal.使用图形跟踪器并查看问题所在。而不是eq(A, add(times(Q, R), R)),你应该写例如:times(Q, R, T), add(T, R, A),因为你想使用“times/3”和“add/3”谓词,而不是仅仅用一个由“add/2”组成的复合词来调用“eq/2”谓词" 和 "times/2" 作为它的第二个参数。代码还有其他问题,例如缺少 nat/1 的定义,但我希望这会有所帮助。

于 2011-10-17T19:42:23.883 回答