Algorithm 如何在prolog中编写unflatten函数?

Algorithm 如何在prolog中编写unflatten函数?,algorithm,debugging,prolog,computer-science,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). unflatte

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

当我检查双嵌套元素时,分区的等式有一些错误

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的实现(与展平相反)似乎是一件奇怪的事情,因为有无限多的可能解决方案。例如,
unflatten([1,2,3,4],A)
不仅需要将
A
[[1]、[2,3,4]
[[1]、[2]、3,4]
[[1,2]、[3,4]
等统一起来,还需要与以下怪物统一起来:

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

因此,要么你对可能的解决方案领域有进一步的限制,要么我甚至在努力构思一个策略,该策略将返回有用的扁平化反转,并且在这样无限的领域中仍然是完整的。我愿意被证明是错的,尽管

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

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

因此,要么你对可能的解决方案领域有进一步的限制,要么我甚至在努力构思一个策略,该策略将返回有用的扁平化反转,并且在这样无限的领域中仍然是完整的。我愿意被证明是错的,尽管

我开始认为这是你们必须做的学术练习:)这是今天stackoverflow上第二个新来的人问同样的问题。如果这是真的,你们看起来很不道德。。。看,我开始认为这是你们必须做的一个学术练习:)这是今天stackoverflow上第二个问同样问题的新人。如果这是真的,你们看起来很不道德。。。看,这有点正确,但A是列表列表,不是列表和元素,也不是列表或空列表。@woofharrior同样的事情,因为您可以有空列表。。。除非你强制这样做,(i)所有元素都是列表,(ii)不允许有空列表。如果是这样的话,可能会产生一个合理的解决方案。这有点正确,但a是一个列表列表,而不是列表和元素或列表或空列表。@woofharrior同样的事情,因为您可以有空列表。。。除非你强制这样做,(i)所有元素都是列表,(ii)不允许有空列表。如果是这样的话,可能会产生一个合理的解决方案。