我使用SWI Prolog的時候,下面的代碼是在我的作業中使用(代碼是不是作業,但需要編寫課程要求的方法):序言越來越inifinite循環詢問另一種解決方案
nat(0).
nat(s(X)) :-
nat(X).
plus(0,N,N) :-
nat(N).
plus(s(M),N,s(Z)) :-
plus(M,N,Z).
times(0,N,0) :-
nat(N).
times(s(M),N,Z) :-
times(M,N,W),
plus(W,N,Z).
exp(s(M),0,0) :-
nat(M).
exp(0,s(M),s(0)) :-
nat(M).
exp(s(N),X,Z) :-
exp(N,X,Y),
times(X,Y,Z).
exp(a,b,c)
表示c=b^a
。
它直接從書上抄:「序言的藝術:高級編程技術」。
當我運行以下查詢:
exp(s(s(0)),L,s(s(s(s(0))))).
我得到一個答案:
L = s(s(0))
但是,當我要求輸入另外一個答案;
L = s(s(0)) ;
我得到一個無限循環(以堆棧錯誤結束),我期待得到錯誤。
什麼是代碼的問題?是否有一個代碼可以執行相同的操作(具有相同的自然數表示形式),但按照我所描述的方式運行?如果是這樣,一些提示或建議將會很有幫助。
在此先感謝。
什麼順序的'EXP/3'。指'EXP(A,b,C)''C = b^A'? – 2015-03-31 11:01:01
是的,我將其添加到的問題。 – PrologNewb 2015-03-31 11:04:42
[相關](http://stackoverflow.com/questions/9740271/prolog-predicate-infinite-loop)。 – false 2015-03-31 15:08:07