Prolog flatten Liste
flatten([A|B],R):- (islist(A)->(flatten(A,R1),R=R1);(write(A),append([A],R1,R))), flatten(B,R1).
flatten(X,X).
islist([_|_]).
Dies ist der code, den ich geschrieben aber ich habe seltsames problem..
Bekomme ich
257 ?- flatten([1,[],2,[3],[3,[3,5]]],R).
1[]23335335
R = [1, [], 2, [3], [3, [3, 5]]] .
Obwohl die zahlen von schreiben sind nicht an das Sie angehängt sind, als Liste:S...
- Bitte verbessern Sie die Formatierung Ihres Codes. Wie es ist, es ist unmöglich zu Lesen.
- +1. Nicht sicher, warum jemand hat -1 auf diese Frage. Gibt es Beispielcode und-Ausgang, der anzeigt, dass das unerwünschte Verhalten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt einige Fehler in deine definition von flatten/2:
Ihre erste Klausel scheitern wird, denn wenn a Eine Liste, wird erst instanziieren R1 mit R und dann Sie versuchen zu vereinheitlichen, es wieder mit glätten(B, R1).
flatten(X,X). -> Diese Klausel lässt die Liste wie Sie ist, ohne Abflachung.
Überprüfen Sie diese anderen Umsetzung:
Hier verwenden wir zwei Prädikate: flatten/2 flatten/3. Die 'Arbeit' getan wird, in flatten/3, wobei das zweite argument halten die intermediate flachen Liste.
Der ersten Klausel ist die base-case: Wann erreichen wir die leere Liste, die wir fertig sind, damit wir instanziieren das Dritte argument der mittleren flachen Liste.
Die zweite Klausel befasst sich mit der Rekursion. Es flacht sich das erste Element in der Liste (egal, ob es ein Element oder eine Unterliste), und fährt mit dem rest der input-Liste.
Die Letzte Ziffer ist die "base-case" für die nicht-Listen-Elemente. Es fügt das Element an den Anfang der Mittelstufe flachen Liste, sondern es nur tut dies für Elemente, die nicht Listen, wie Sie diesen Fall war gesorgt in der zweiten Klausel.