【问题标题】:How to write unflatten function in prolog?如何在 prolog 中编写 unflatten 函数?
【发布时间】:2016-11-21 01:20:01
【问题描述】:

我想出的解决方案检查左侧和右侧,以确保左侧是扁平的,右侧是所有可能的分区。

当我检查双重嵌套元素时,分区方程有一些错误。

unflatten([],[]) :- !.
unflatten(flatList, [l1|lst]) :- !, unflatten(A, l1), unflatten(B, lst), append(A,B, flatList).
unflatten([l1|flatList], [l1]|lst]) :- unflatten(flatlist,lst).
unflatten([l1,l2|flatList], [[l1,l2]|lst]) :- !, unflatten(flatList,lst).
unflatten( [flatList],flatList):- !.

【问题讨论】:

  • 我开始认为这是你们必须做的学术练习 :) 这是 stackoverflow 今天第二个新人问同样的事情。如果这是真的,你们觉得这很不道德……见stackoverflow.com/questions/40709840/…

标签: algorithm debugging prolog computer-science


【解决方案1】:

unflatten 的实现(作为 flatten 的反面)似乎是一件奇怪的事情,因为有无数种可能的解决方案。例如unflatten([1, 2, 3, 4], A)不仅需要将A[[1], [2, 3, 4]][[1], [2], 3, 4][[1, 2], [3], 4]等统一起来,还需要与这样的怪物统一:

 [[[[[[[[[[]]]]]]]]], [[[[[[[[[[[1]]]]]]]]]], 2, 3, 4]

因此,要么您对可能解决方案的范围有进一步的限制,要么我正在努力构思一种策略,该策略将返回有用的扁平化反转,并且在如此无限的域上仍然是完整的。不过,我愿意被证明是错的……

【讨论】:

  • 有点正确,但 A 是列表的列表,而不是列表和元素或列表或空列表。
  • @WoofWarrior 同样的事情,因为你可以有空列表......除非你强制类似,(i)所有元素都是列表,(ii)不允许空列表。如果是这样,可能会产生一个合理的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多