2013-04-14 67 views
0

我想清除不切割的列表。我試過了:Prolog清除不使用切割的正面元素列表

filter([],[]). 

filter([H|T],[H|S]) :- 
    H<0, 
    filter(T,S). 

filter([H|T],S) :- 
    H>=0, 
    filter(T,S). 

但它不起作用。

這裏是發生了什麼事時,我想:

?- filter([1,0,-6,7,-1],L). 

L = [-6,-1]; %false 
no 

L=[0,-6,-1] %true 
+1

請詳細解釋你的謂詞應該做什麼。 – Haile

回答

0

這裏有一個辦法做到這一點:

filter([ ],[ ]). 
filter([H|T],X) :- 
    (H > 0 -> X = Y ; X = [H|Y]), 
    filter(T,Y). 

因爲如果-then-else結構中的Prolog有時被描述爲具有「隱藏的切割「,這意味着Prolog不會在該構造的」if「部分重試(回溯)邏輯結果(它承諾第一個也是唯一的結果),可以想象,您的課程教師可能會反對此解決方案(即使沒有使用實際的剪輯)。

但您的解決方案部分錯誤。你把零元素與積極的元素結合在一起,你的問題的措詞只表明積極條目需要從列表中「清除」。

+0

非常感謝你。我做得很好!再次感謝。 – user2280033

+0

感謝@ bubakazouba,爲鷹眼捕捉。 – hardmath