Prolog递归将元素添加到列表中

问题描述 投票:0回答:1

我正在为我的大学做Prolog评估,我需要一些帮助。我不想解决我的问题,而只是解释某些序言机制。

我从列表(具有嵌套列表)中递归地选择元素。我现在可以将所有选定的元素写入控制台(使用writeln(Element))。我的问题是我需要将那些元素添加到应该是最终输出的列表中。

假设我有List = [1,2,[4,5,[6,7]]],并且我想输出包含所有偶数的列表。我现在可以将每个偶数写入控制台。现在的问题是我们只允许使用append / 3,而且我不知道im如何将列表“返回”到递归步骤“之前”。我想做类似append([foundElement],OutputList,OutputList)的操作,而这在Prolog中是不可能的...

我将不胜感激,甚至会帮助您解决不和谐之处,或者提供一个简单的示例。(偶数练习不是我的职责!)

提前感谢

list recursion prolog swi-prolog
1个回答
0
投票

无论何时使用递归,您都有两个问题:基本情况和归纳情况。我建议您始终从基本情况开始,因为它很容易,通常会告知递归情况。

因此,如果您有一个空列表[],那么您想要一个空列表返回[]

flatten([],[]).

现在在递归情况下,您有两个选择,要么是嵌套列表,要么是其他东西,因此请分别处理。为了区分,让我们创建一个辅助谓词,以确定某物是否为列表。

is_list([]).    % either an empty list
is_list([_|_]). % or a list with elements

如果列表以外的东西,您只想将其添加到输出列表的开头。您如何确定输出列表是什么?简单,只需递归调用列表其余部分上的flatten

flatten([Head|Rest],[Head|Output]) :- \+ is_list(Head), flatten(Rest,Output).

现在,如果您的头只是一个列表,那会有些棘手。现在,除了扁平化列表的其余部分,我们还需要扁平化列表的头部。然后,我们可以简单地将这两个append一起获得最终列表。

flatten([Head|Rest], OutputNew) :-
  is_list(Head),
  flatten(Head, OutputHead),
  flatten(Rest, OutputRest),
  append(OutputHead, OutputRest, Output).
© www.soinside.com 2019 - 2024. All rights reserved.