Hi, habe immer noch Probleme zu unterscheiden, wann ein | etwas hinzufügen und wann etwas abschneiden soll.
Z.B. bei dem Versuch eine Liste umzudrehen:
myreverse([],_). %Rekursionsabschluss
myreverse([Kopf|Liste1],Liste2):-myreverse(Liste1,[Kopf|Liste2]). %Sollte eigentlich das 1. Element der 1. Liste vorn an die 2. Liste dranhängen?!?
%Beim Test jedoch:
myreverse([a,b,c,d],X).
X = _G1318 ;
Kann mir da bitte jemand weiterhelfen???
Ich finde, ein trace spricht Baende:
?- trace.
Yes
[trace] ?- myreverse([a,b,c,d], X).
T Call: (6) myreverse([a, b, c, d], _G290)
Call: (6) myreverse([a, b, c, d], _G290) ? creep
T Call: (7) myreverse([b, c, d], [a|_G290])
Call: (7) myreverse([b, c, d], [a|_G290]) ? creep
T Call: (8) myreverse([c, d], [b, a|_G290])
Call: (8) myreverse([c, d], [b, a|_G290]) ? creep
T Call: (9) myreverse([d], [c, b, a|_G290])
Call: (9) myreverse([d], [c, b, a|_G290]) ? creep
T Call: (10) myreverse([], [d, c, b, a|_G290])
Call: (10) myreverse([], [d, c, b, a|_G290]) ? creep
T Exit: (10) myreverse([], [d, c, b, a|_G290])
Exit: (10) myreverse([], [d, c, b, a|_G290]) ? creep
T Exit: (9) myreverse([d], [c, b, a|_G290])
Exit: (9) myreverse([d], [c, b, a|_G290]) ? creep
T Exit: (8) myreverse([c, d], [b, a|_G290])
Exit: (8) myreverse([c, d], [b, a|_G290]) ? creep
T Exit: (7) myreverse([b, c, d], [a|_G290])
Exit: (7) myreverse([b, c, d], [a|_G290]) ? creep
T Exit: (6) myreverse([a, b, c, d], _G290)
Exit: (6) myreverse([a, b, c, d], _G290) ? creep
X = _G290
Yes
Ich schau grad noch. Aber AFAIR solltest Du nen Akku einbauen.
MoKrates
[trace] ?- myreverse([a,b,c,d],X).
Call: (53) myreverse([a, b, c, d], _G2308) ? creep
Call: (54) myreverse([b, c, d], [a|_G2308]) ? creep
Call: (55) myreverse([c, d], [b, a|_G2308]) ? creep
Call: (56) myreverse([d], [c, b, a|_G2308]) ? creep
Call: (57) myreverse([], [d, c, b, a|_G2308]) ? creep
Exit: (57) myreverse([], [d, c, b, a|_G2308]) ? creep
Exit: (56) myreverse([d], [c, b, a|_G2308]) ? creep
Exit: (55) myreverse([c, d], [b, a|_G2308]) ? creep
Exit: (54) myreverse([b, c, d], [a|_G2308]) ? creep
Exit: (53) myreverse([a, b, c, d], _G2308) ? creep
Was sagt uns das nun???
So gehts:
myreverse([], X, X).
myreverse([K|L1], L2, X) :- myreverse(L1, [K|L2], X).
myreverse(X,Y) :- myreverse(X, [], Y).
Du hast einen nicht-endrekursiven Ansatz versucht, der Aufgrund der Listenstruktur so nicht moeglich ist. Der obige Ansatz ist endrekursiv (Strukturmerkmal: der Akku).
MoKrates
Was sagt uns das nun???
[_] Du hast Deinen Kopf benutzt.
[_] Du hast gesehen, dass ich noch "grade geschaut" habe.
[_] Du hast 5 min Geduld.
MoKrates
Das war bezogen auf den Trace. Hat sich die Liste beim "Exit" wieder aufgebaut oder ist die Darstellung immer so?
P.S.: Vielen Dank - werds gleich mal ausprobieren
Nein, die Liste baut sich nicht wieder auf. Was Du bei den "Exit" Zeilen siehst, ist der Backtracking Effekt. Wenn Du das nicht verstehst, solltest Du Dich noch sehr genau mit Rekursion & Backtracking beschaeftigen.
Das ist mir ein wenig zu ausschweifend, um es Dir hier alles zu erlaeutern.
MoKrates