Prolog:从高于X的列表中删除所有元素

时间:2011-11-16 20:17:01

标签: prolog

我正在尝试编写一个prolog程序,该程序将删除列表中高于值X的所有元素。

例如,我想从此列表中删除高于50的所有元素:

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

所以我得到了:

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

3 个答案:

答案 0 :(得分:3)

很高兴看到你走了多远。什么给你带来麻烦?

大多数问题的想法通常都是这样的:

  1. 构建一个基本案例,通常是空列表。
  2. 尝试递归到递归的底部并在途中, 只保留所需的元素。在这里,保持意味着你递归 删除了不需要的元素。
  3. 让它“适当地重新聚集”,就像在递归时一样 重新开始,你必须正确定义输出列表。
  4. 这有两种方法。在下降时删除元素,或在返回时忽略它们。这些本质上是相同的。

    我不是最好解释这个。我只想发布我的解决方案。但我强烈建议你在看之前尽力而为。 :)

    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)

使用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].

答案 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]