algorithm - 如何在 prolog 中编写 unflatten 函数?

标签 algorithm debugging prolog computer-science

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

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

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):- !.

最佳答案

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]

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

关于algorithm - 如何在 prolog 中编写 unflatten 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40711481/

相关文章:

Prolog间接关系

algorithm - 如何在线性时间内构建后缀树?

python - 使用 Delaunay 三角剖分加速 Python MST 计算

javascript - 关闭包含 YouTube 电影的 Fancybox-iframe 时出现 IE JS 错误

c++ - 如何在用 C++ 编写的 Visual Studio 2010 中调试 dll winamp 插件?

prolog - 沃伦的抽象机程序指令何时执行?

algorithm - 使用 Google map 解决旅行商问题的实用方法是什么?

java - 我的选择算法有什么问题?

c# - 设置一个 c# 方法范围的变量如何影响另一个?

recursion - Prolog 递归循环永远