2011-10-17 36 views
1

我正在嘗試使用餘數定理和良好排序原則來定義prolog中的分區。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=工作。

回答

4

在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」組成的複合詞來調用「eq/2」謂詞/ 2「和」times/2「作爲第二個參數。代碼還有其他問題,例如,nat/1的定義丟失,但我希望這有些幫助。