Math 序言中的除法

Math 序言中的除法,math,recursion,prolog,successor-arithmetics,Math,Recursion,Prolog,Successor Arithmetics,我试图用余数定理和井序原理来定义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)) :- a

我试图用余数定理和井序原理来定义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
=
工作。

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