2013-01-16 50 views
0
elem([],0). 

elem([H|T],R):-atomic(H),elem(T,R1),R1 is R+1. 

elem([H|T],R):-elem(H,R1),elem(T,R2),R is R1+R2. 

這是我的代碼,在我搜索了我在這個網站上的問題的答案後,我沒有找到一個好的。錯誤是:?- elem([1,[2],3,4],R)在prolog中計算深層列表中的原子元素

ERROR: is/2: Arguments are not sufficiently instantiated. 

但應R = 3

+1

你嘗試跟蹤執行?在Prolog提示符處輸入'trace.'。 –

回答

1

在第二行,你應該有

R is R1 + 1 

,而不是

R1 is R + 1. 
+0

原因:R是[H | T]的結果,R1是僅用於T的結果。因此,如果H是原子,則將謂詞應用到列表尾部(T)的結果爲R將是1 +。 – Mihai

+0

謝謝,但當R = 3時,輸出爲R = 4。我試圖將它修改爲elem([H | T],R): - 原子(H),!,elem(T,R1),R是R1 + 1。但它仍然不好,它不應該算作原子。 – user1913592

+0

我現在明白了。你只希望它能夠算在最高層。這樣寫第三個子句(即當頭部不是原子時,刪除頭上的遞歸): elem([H | T],R): - elem(T,R)。 – Mihai