Hallo Paz!
Ok, ich geh zunächst mal davon aus, dass Dein Prolog-Dialekt über eine Funktion concat/3 verfügt, die zum Konkatenieren (Aneinanderhängen) von Listen dient. Also in etwa so:
X = [1,2,3]
Ich geh außerdem davon aus, dass Du mit Rekursion vertraut bist.
Also ersten Schritt bauen wir ein Programm, das aus einer Liste von Listen (z.B. [[1],[2,3],[4]]) eine Liste von Einzelelementen (z.B. [[1,2,3,4]]) macht. (Wir sagen: eine _flache_ Liste.)
flat([H|T],F) :- flat(T,T1), concat(H,T1,F).
flat([],F) :- F=[].
Was hier passiert ist, dass die Liste von Listen [H|T] in zwei Bestandteile, nämlich die (flache) Liste H und die Liste von Listen T zerlegt wird. Die Liste von Listen T wird dann rekursiv zur flachen Liste T1 umgewandelt und die flachen Listen H und T1 am Ende mit concat/3 aneinandergehängt.
Natürlich müssen wir noch den Trivialfall abdecken, dass die übergebene Liste T leer ist. Dafür ist die zweite Regel zuständig.
Soll unser Programm auch mehrfach verschachtelte Listen auflösen können, brauchen wir noch eine zweite Rekursion, die auch die Liste H erstmal flach macht:
flat([H|T],F) :- flat(H,H1), flat(T,T1), concat(H1,T1,F).
flat([],[]).
Drittens ist ja in unserem Fall noch gefordert, dass die Rückgabeliste nicht selbst flach ist, sondern eine Liste von flachen Listen. Das heißt, wir brauchen noch ein zweites Prädikat, dass sich um die Liste auf der äußersten Ebene kümmert (und dem ich jetzt den einfallslosen Namen „p“ gebe).
p([H|T],R) :- flat(H,H1), p(T,T1), concat(H1,T1,R).
p([],[]).
Zusammengenommen ist es jetzt ein Vierzeiler geworden …
flat([H|T],F) :- flat(H,H1), flat(T,T1), concat(H,T1,F).
flat([],[]).
p([H|T],R) :- flat(H,H1), p(T,T1), concat(H1,T1,R).
p([],[]).
… der das gewünschte Ergebnis liefert:
- p([[[1,2],[3]], [[4,5,6],[7,8]] ], X).
X = [[1,2], [3], [4,5,6], [7,8] ]