【问题标题】:Prolog: Append elements in a list to a listProlog:将列表中的元素附加到列表中
【发布时间】:2015-02-05 14:05:34
【问题描述】:

我正在尝试创建一个给出的程序:combine([[1],[2,3]],Q)。它将生成:Q=[1,2,3]。

换句话说,如果我得到一个元素列表,我需要将它们全部附加到一个列表中。不是每个元素都可以是一个列表,所以我必须让任何非列表元素成为列表,以便可以追加。列表元素中包含的任何其他元素都无关紧要。

到目前为止我的尝试:

combine(L,Q) :- match(L,Q).

match([],Q).
match([H|T],Q) :- H = [], append(H,Q,Z), match(T,Z).
match([H|T],Q) :- H = [_|_], append(H,Q,Z), match(T,Z).
match([H|T],Q) :- append([H],Q,Z), match(T,Z).

我的想法是,当我调用辅助函数时,我会尝试找出 H 是列表还是非列表。如果它是一个非列表,它会将 H 放入一个列表并将其附加到递归传递的列表中。当列表到达末尾时,顶部事实取消。可悲的是,我得到的是 Q = [giberish,giberish,...]; Q = [更多的胡言乱语,....];

编辑:修正了我需要什么的描述。

【问题讨论】:

  • 您希望Q 来自combine([[1],[2,[3]]],Q)
  • 我希望:Q=[1,2,[3]]。

标签: list recursion prolog append


【解决方案1】:

给你。基本上,如果列表为空,则扁平版本也是。如果它没有将第一个元素附加到其余元素的展平版本中,但如果头部不是列表,则将其添加到第一个。

combine([],[]).
combine([H|T],Q) :- is_list(H), combine(T,Q1), append(H,Q1,Q).
combine([H|T],Q) :- not(is_list(H)), combine(T,Q1), append([H],Q1,Q).

【讨论】:

  • 有道理。欣赏!
猜你喜欢
  • 2013-02-08
  • 1970-01-01
  • 2018-04-25
  • 2017-12-18
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2021-10-06
相关资源
最近更新 更多