プロローグインターリーブによって、リストのリストを単一のリストに構成する方法を教えてください。

インターリーブサブリストを使用して、リストのリストを単一のリストに構成する方法を教えてください。
reconfig([[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.

これは、[[…]、[…]] – >のように、要素が何であれ、リスト内のリストに参加したいだけだと仮定します。 […]特に、要素自体がリストかどうかは関係ありません。

内側のリストにある、リストに含まれていないすべての要素を1つのリストにまとめることが興味深い場合があります(ネスト構造はありません)。実際、そのようなリストは実際には木であり、それは平坦化、または木の縁を集めることとして知られています。それは別の問題です。

転載記事の出典を記入してください: プロローグインターリーブによって、リストのリストを単一のリストに構成する方法を教えてください。 - コードログ