[Prolog] Listensuche

Dako2007

Redshirt
Mitglied seit
08.02.2007
Beiträge
2
Renomée
0
Hallo

Ich habe ein Problem in Prolog.

Ich habe eine Liste "Liste" mit Elementen, die selber Listen sind.
So könnte es z.B. aussehen (Die Liste, sowie die Listenelemente, welche selber Listen sind, können werschiedene Größen habe, jedoch sind sie untereinander immer gleich groß.:

ListeAlt=[[ , , x, , ], [ , x, x, x, ], [x, x, x, x, x], [ , , x, , ], [ , , x, , ]]

Nun weiß ich nicht, wie ich die Liste und deren Listen durchsuche und eine neue Liste "ListeNeu" mit folgendem Format erstellen kann:


ListeAlt=
[[ , , x, , ],
[ , x, x, x, ],
[x, x, x, x, x],
[ , , x, , ],
[ , , x, , ]]



ListeNeu=([[besetzt(1, 3), besetzt(2, 2), besetzt(2, 3), besetzt(2, 4), besetzt(3, 1), besetzt(3, 2), besetzt(3, 3), besetzt(3, 4), besetzt(3, 5), besetzt(4, 3), besetzt(5, 3)]]).

Man sieht also, dass ich erst so eine Art Karte habe die als LIste aufgebaut ist und nun eine Liste haben möchte, wo jeweils mit besetzt(Y, X) die Koordinaten angegeben sind.
 
Code:
buildstring(A, B, C) :- atom_concat('besetzt(', A, D), atom_concat(D, ',', E), atom_concat(E, B, F), atom_concat(F, ')', C).

% helper function to convert an inner list
convertih(_, _, [], []).
convertih(A, B, [H|T], C) :- H \== x, Z is B + 1, convertih(A, Z, T, C).
convertih(A, B, [x|T], [C|D]) :- buildstring(A, B, C), Z is B + 1, convertih(A, Z, T, D).

% start function to convert an inner list
converti(A, B, L) :- convertih(A, 1, B, L).

% helper function
converth(_, [], []).
converth(A, [H|T], C) :- converti(A, H, C1), Z is A + 1, converth(Z, T, C2), append(C1, C2, C).

% main function
convert(A, B) :- converth(1, A, B).

Beispiele:
Code:
?- convert([[q,x],[x,q],[x,x]], L).

L = ['besetzt(1,2)', 'besetzt(2,1)', 'besetzt(3,1)', 'besetzt(3,2)'] ;

No


?- convert([[q,a],[1,q],[2,3]], L).

L = [] ;

No
 
Danke. Könntest du das aber vielleicht ein wenig erklären? Ich verstehe praktisch garnichts.
 
Sorry, keine Zeit. Schau Dir die Prädikate von unten nach oben mal genau an. Sie sind einfacher als sie auf den ersten Blick aussehen.
Für die korrekte Ausgabe muss man ja zwangsläufig mitzählen welche Liste bzw. welches Element man gerade bearbeitet. Das mache ich mit dem ersten Parameter von converth/3 bzw. den ersten beiden von convertih/4.
 
Zurück
Oben Unten