2012-08-29 45 views
2

這一次,我真的無法理解的錯誤:我寫了這個代碼在某個位置以獲取列表元素:列表搜索是不終止

take_pos([], _, _) :- fail; 
take_pos([H|T], 1, H). 
take_pos([H|T], Pos, X) :- Pos2 is Pos - 1, take_pos(T, Pos2, X). 

它永遠不會終止;追蹤它我可以看到它從來不符合第二條語句。另外,如果我查詢take_pos([1,2,3], 1, 1).它匹配最後一個。

我錯過了什麼?

回答

1

我認爲問題在於你在fail之後放了一個分號而不是點號。

還要考慮重寫第二個規則,以避免引入單:

take_pos([], _, _) :- fail. 
take_pos([H|_], 1, H). 
take_pos([H|T], Pos, X) :- Pos2 is Pos - 1, take_pos(T, Pos2, X). 
+0

這個。很好的接收! –

1

您的問題是第一款具有;,我認爲你的意思.。 無論如何,第一個條款如果糾正了什麼都不做,所以應該完全刪除:

take_pos([H|T], 1, H). 
take_pos([H|T], Pos, X) :- Pos2 is Pos - 1, take_pos(T, Pos2, X).