【问题标题】:Flattening only one level of a list in Prolog在 Prolog 中仅展平一级列表
【发布时间】:2015-01-31 12:02:08
【问题描述】:

我正在解决一个问题,即在 Prolog 中仅展平一个列表级别。例如,[[1],[2,3]] 会变成[1,2,3],但[[1,[2]],3] 只会变平为[1,[2],3]。我在网站上查看了其他一些问题,但没有人能彻底回答这个问题,我就是无法让我的代码在我的所有测试用例上运行。


更新:代码有效!这是我最终得到的答案

my_flatten([], []).
my_flatten([A|B],L) :- is_list(A), my_flatten(B,B1), !, append(A,B1,L).
my_flatten([A|B],[A|B1]) :- my_flatten(B,B1).

【问题讨论】:

  • Get elements from list of lists 的可能重复项
  • 最好是use DCGs
  • 您所说的“只工作了大约一半的时间”是什么意思?
  • 我的意思是我提出的测试用例不起作用,但其他人可以。对于一些——比如我在帖子中展示的那些,它只是输出空列表。
  • 我无法用“输出”[]复制示例

标签: list prolog flatten


【解决方案1】:

你需要 3 个简单的从句,我只展示最复杂的一个

flat([H|T],R) :- is_list(H), flat(T,T1), append(H,T1,R).

其他两个子句是基本递归情况,以及一个 copy as is 的头到结果。

您还应该在我显示的子句中放置一个切口,否则在回溯时您会得到错误的结果(由于触发了子句copy as is

【讨论】:

  • 所以flat([A,B], [1,2]) 失败了?
  • 同样糟糕。 A 和 B 都必须是列表。
  • @false:为什么? flat([1,2],[1,2]) 没关系,我觉得
  • 至少我们可以同意flat([[1,2],[]],[1,2]) 是真的。因此flat([A,B],[1,2]), A = [1,2], B = [] 也应该成功。
  • @CapelliC 我已经使用了我的代码,到目前为止,得到了flat([], []). flat([H|T],R) :- is_list(H), flat(T,T1), !, append(H,T1,R). flat(H,H).,这实际上是迄今为止我得到的最好的工作代码。它适用于我尝试过的所有情况,除了当我输入 [1,[2,3]] 时,它只返回相同的东西。另外,我相信我可以假设输入将始终是一个列表——这会影响这个吗?对不起,我在 Prolog 是个菜鸟……
猜你喜欢
  • 2011-09-17
  • 1970-01-01
  • 2013-11-08
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
相关资源
最近更新 更多