我想出的解决方案是检查左侧和右侧,以确保左侧是扁平的,右侧是所有可能的分区。
当我检查双重嵌套元素时,分区方程有一些错误。
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/