我正在尝试编写一个prolog程序,该程序将删除列表中高于值X
的所有元素。
例如,我想从此列表中删除高于50
的所有元素:
[2,8,18,34,40,44,46,51,52,54,64,66,76,90]
所以我得到了:
[2,8,18,34,40,44,46]
答案 0 :(得分: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).
答案 1 :(得分:0)
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].
答案 2 :(得分:0)
您还可以从 apply 库
中考虑此实用程序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]