我正在尝试使用余数定理和良好排序原则来定义prolog中的除法。
我到目前为止:
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
或=
工作。
答案 0 :(得分: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”谓词,而不是仅仅调用“eq / 2”谓词复合词由“add / 2”和“times / 2”组成,作为第二个参数。代码还有其他问题,例如,缺少nat / 1的定义,但我希望这有所帮助。