2016-11-20 32 views
1

我做了一個計算列表長度的函數。以下是我的代碼。Prolog參數沒有被充分實例化(計算列表長度的函數)

listLength(LIST) :- solve(LIST, LENGTH), write(LENGTH). 
solve([], _). 
solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

當運行該代碼與輸入

- ?listLength([1,2,3,4,5,6,7])。

然後,解釋器拿給我錯誤消息solve/2 : Arguments are not sufficiently instantiated.

當我修改上面的代碼等下方。

listLength(LIST) :- LENGTH is 0, solve(LIST, LENGTH), write(LENGTH). 
solve([], _). 
solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

當運行此代碼具有相同的輸入,則總是被寫入。

我想計算LENGTH,並且我想在listLength函數中使用該變量。

我怎麼了? (請注意,我正在使用swi-prolog。)

回答

0

第一個錯誤是基本情況。而不是solve([], _).您應該編寫solve([], 0).,因爲如果您不知道空列表的長度,您將如何遞歸查找較大的列表。

還存在另一個問題:

solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

嘗試計算ADD時長+ 1米的長度不是實例計算。您需要更改順序,如:

listLength(LIST) :- solve(LIST, LENGTH), write(LENGTH). 
solve([], 0). 
solve([_|T], LENGTH) :- solve(T, ADD), LENGTH is ADD+ 1. 

現在查詢:

?- listLength([1, 2, 3, 4, 5, 6, 7]). 
7 
true. 
+0

這是像'listLength(L,10000)查詢很慢' – false

+0

你怎麼能查詢,由於只需要一參數列表? – coder

+1

你是對的!我只看到最後的加法。應該讀'解決(L,100000'我承認,這不會發生。 – false

相關問題