2017-09-18 44 views
2

我该如何构建一个列表成一个列表成交错子列表单列表? like recons([[1,2],[3,4]],X)将给出X = [1,3,2,4]? 我一直试图小时,我的代码总是给我非常奇怪的结果或无限循环, 我的想法是这样的:Prolog如何通过交叉构建列表到单个列表中?

recons([[A|R],REST],List):- 
    recons(R,REST), 
    append(A,[R|REST],List). 

我知道它完全错误的,但我不`吨知道如何解决这个。

+1

它总是嵌套两层深?或者这可以是任意深的? –

+0

此外,我最近还经常给出一个建议:尝试*橡皮鸭调试*:向你的橡皮鸭解释为什么你认为这种方法应该工作,试图说服你的橡皮鸭。通常你会开始看到问题,经过几次迭代,你可以想出一个解决方案。 –

+0

这可能会更深一些,如([[1,4],[2,5],[3,6]],X)可能会返回[1,2,3,4,5,6] –

回答

3

首先,我们可以考虑正确性,而不是首先考虑效率。

interleaving_join([[]|X], Y):- 
    interleaving_join(X, Y). 

这一点是明确的,但还有什么?

interleaving_join([[H|T]|X],   [H|Y]):- 
       append( X, [T], X2), 
       interleaving_join(X2, Y). 

但是什么时候结束?当没有什么更多的有:

interleaving_join([], []). 

事实上,

2 ?- interleaving_join([[1,2],[3,4]], Y). 
Y = [1, 3, 2, 4] ; 
false. 

4 ?- interleaving_join([[1,4],[2,5],[3,6,7]], X). 
X = [1, 2, 3, 4, 5, 6, 7] ; 
false. 

这假设我们只希望加入列表内的名单,无论元素,像[[...],[...]] --> [...]。特别是,我们不在乎这些元素本身是否是列表,或者不是。

将内部列表中的所有非列表元素(但深度嵌套)收集到一个列表中(不包括嵌套结构)可能有时会很有趣。事实上,这样的名单实际上是树木,并且这被称为变平,或收集树的边缘。这是一个不同的问题。