2011-10-17 12 views
1

私はプロローグで剰余定理と秩序立ての原理を使って除算を定義しようとしています。プロローグの分割

私がこれまで持っている:

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

SWI-Prologでは、?- gtrace, your_goal.を使用してグラフィカルトレーサを使用し、何がうまくいかないかを確認できます。 eq(A, add(times(Q, R), R))の代わりに、 "times/3"と "add/3"述部を使用したいので、 "eq/2"述部を "add"からなる複合用語で呼び出すのではなく、例えばtimes(Q, R, T), add(T, R, A)と書く必要があります。/2 "と" times/2 "を第2引数とする。コードには他にも問題があります。たとえば、nat/1の定義が欠けていますが、これはやや役立ちます。