【问题标题】:Prolog - Finding even elements in a listProlog - 在列表中查找偶数元素
【发布时间】:2020-05-17 21:53:34
【问题描述】:

我想在 Prolog 中编写一个规则,返回给定列表中的偶数元素。例如: even_elements([1,2,3,4], Result) 将返回 Result: [2,4]

这是我目前所拥有的:

% This is my base case.
even_elements([H|T], Result) :- (0 is mod(H,2) -> Result = [H|T] ; Result = T). 

% This is my recursion.
even_elements([H|T], [H|NT]) :- even_elements(T, NT).

基本情况正常工作并消除第一个元素,如果它是奇数;但递归不会改变任何东西。感谢您提供有关如何完成递归的任何提示。

【问题讨论】:

  • 基本情况看起来不像基本情况。

标签: list recursion prolog


【解决方案1】:

列表处理中的基本情况通常处理 列表。确实,我们可以这样写:

even_elements([], []).

对于递归情况,我们可以从你的基本情况中使用很多,我们唯一需要做的就是 recurse 在列表的 tail ,所以:

even_elements([H|T], Result) :-
    (  0 is mod(H,2)
    -> Result = [H|T2]
    ;  Result = T2
    ),
    even_elements(T, T2).

话虽如此,没有必要实现过滤列表的逻辑。您可以使用include/3 predicate [swi-doc],从而定义一个even 谓词:

even(N) :-
    0 is N mod 2.

然后我们可以过滤:

even_elements(L, R) :-
    include(even, L, R).

这给了我们:

?- even_elements([1,4,2,5], R).
R = [4, 2].

【讨论】:

    【解决方案2】:

    我也从this post 找到了这个解决方案,尽管威廉的回答更具可读性:

    even_elements(L1,L2):-findall(X,(member(X,L1), X mod 2=:=0),L2).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-18
      • 2018-11-17
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2011-08-17
      相关资源
      最近更新 更多