2011-11-16 28 views
2

我正在嘗試編寫一個prolog程序,它將刪除列表中所有高於值X的元素。序言:刪除列表中的所有元素高於X

例如,我想從列表中刪除比50所有元素更高:

[2,8,18,34,40,44,46,51,52,54,64,66,76,90] 

所以我得到:

[2,8,18,34,40,44,46] 
+0

看[這裏](http://stackoverflow.com/questions/297996/prolog-filtering-a-list) –

+1

這是一門功課?你有什麼嘗試? – svick

+1

該列表是否總是排序? – Sebastian

回答

3

這將是很高興看到你是如何得到遠。什麼給你帶來問題?

在大多數這些問題的想法通常是這樣的:

  1. 建設基本情況,通常是空的列表。
  2. 嘗試遞歸到遞歸的底部,並在途中, 只保留所需的元素。在這裏,保持意味着你遞減 ,刪除不需要的元素。
  3. 爲了讓它「正常地一起生長」,如遞歸 返回時一樣,您必須正確定義輸出列表。

實際上有兩種方法。在下樓時刪除元素,或者在返回時忽略它們。這些本質上是一樣的。

我不是最好的解釋這一點。我會簡單地發佈我的解決方案。但我強烈建議您在查看之前盡力而爲。 :)

delete_gt([], _, []) :- !. 
delete_gt([Head|Rest], X, L) :- 
    Head > X, !, 
    delete_gt(Rest, X, L). 
delete_gt([Head|Rest], X, [Head|L]) :- 
    delete_gt(Rest, X, L). 
0

使用accumulator

removeHigherThan(X, List, Ans) :- 
    removeHigherThan(X, List, Ans, []), !. 

removeHigherThan(_, [], Ans, Ans). 
removeHigherThan(X, [H | Tail], Ans, Acc) :- 
    (
     (H > X, NewEl = []) 
     ; 
     (H =< X, NewEl = [H]) 
    ),  
    append(Acc, NewEl, NewAcc), 
    removeHigherThan(X, Tail, Ans, NewAcc). 

它的工作原理就像

?- removeHigherThan(10, [1,4], X). 
X = [1, 4]. 

?- removeHigherThan(10, [1,12,4], X). 
X = [1, 4]. 
0

你也可以考慮從此實用程序適用

del_elems_higher :- 
    exclude(condition, [2,8,18,34,40,44,46,51,52,54,64,66,76,90], L), writeln(L). 

condition(X) :- X > 50. 

測試:

?- del_elems_higher. 
[2,8,18,34,40,44,46] 
相關問題