Prolog如何通过交错将列表列表构建到单个列表中?

时间:2017-09-18 14:04:05

标签: list prolog interleave

如何使用交错子列表将列表列表构建到一个列表中? 像recons([[1,2],[3,4]],X)会给出X = [1,3,2,4]? 我一直在努力工作,我的代码总是给我非常奇怪的结果或无限循环, 我的想法是这样的:

Route::get('/dashboard', 'DashboardController@index');

我知道它完全错了,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分: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.

这假设我们只想加入列表中的列表,无论元素是什么,如[[...],[...]] --> [...]。特别是,我们不关心元素本身是否是列表。

有时可能有趣的是将内部列表中的所有非列表元素(无论如何深度嵌套)收集到一个列表中(没有嵌套结构)。事实上,这样的列表实际上是树,这被称为 flattening ,或者收集树的 fringe 。这是一个不同的问题。