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)「add/2」で構成される複合語で「eq/2」述語を呼び出す代わりに、「times/3」および「add/3」述語を使用するため。 2番目の引数として"と"times/2"。コードには他にも問題があります。たとえば、nat / 1の定義が欠落していますが、これがある程度役立つことを願っています。

于 2011-10-17T19:42:23.883 に答える