Prolog 如何通过交错将列表列表构建为单个列表?
Prolog How can I construct a list of list into a single list by interleaving?
如何将一个列表的列表构造成一个具有交错子列表的列表?
像 recons([[1,2],[3,4]],X) 会给出 X= [1,3,2,4]?
我已经尝试了几个小时,我的代码总是给我非常奇怪的结果或无限循环,
我的想法是这样的:
recons([[A|R],REST],List):-
recons(R,REST),
append(A,[R|REST],List).
我知道这是完全错误的,但我不知道如何解决这个问题。
与其先考虑效率,不如先考虑正确性
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.
这假设我们只想加入列表内部的列表,无论元素是什么,比如[[...],[...]] --> [...]
。特别是,我们不关心元素本身是否是列表。
有时将内部列表中的所有非列表元素收集到一个列表(无嵌套结构)中可能很有趣,无论嵌套有多深。事实上,这样的列表实际上是树,这被称为 flattening,或收集树的 fringe。这是一个不同的问题。
如何将一个列表的列表构造成一个具有交错子列表的列表? 像 recons([[1,2],[3,4]],X) 会给出 X= [1,3,2,4]? 我已经尝试了几个小时,我的代码总是给我非常奇怪的结果或无限循环, 我的想法是这样的:
recons([[A|R],REST],List):-
recons(R,REST),
append(A,[R|REST],List).
我知道这是完全错误的,但我不知道如何解决这个问题。
与其先考虑效率,不如先考虑正确性
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.
这假设我们只想加入列表内部的列表,无论元素是什么,比如[[...],[...]] --> [...]
。特别是,我们不关心元素本身是否是列表。
有时将内部列表中的所有非列表元素收集到一个列表(无嵌套结构)中可能很有趣,无论嵌套有多深。事实上,这样的列表实际上是树,这被称为 flattening,或收集树的 fringe。这是一个不同的问题。