我正在嘗試編寫一個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]
我正在嘗試編寫一個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]
這將是很高興看到你是如何得到遠。什麼給你帶來問題?
在大多數這些問題的想法通常是這樣的:
實際上有兩種方法。在下樓時刪除元素,或者在返回時忽略它們。這些本質上是一樣的。
我不是最好的解釋這一點。我會簡單地發佈我的解決方案。但我強烈建議您在查看之前盡力而爲。 :)
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).
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].
你也可以考慮從此實用程序適用庫
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]
看[這裏](http://stackoverflow.com/questions/297996/prolog-filtering-a-list) –
這是一門功課?你有什麼嘗試? – svick
該列表是否總是排序? – Sebastian