Even und Odd-Listen
Ich versuche zu implementieren ist ein Prolog-Programm, das aufteilen einer Liste in zwei Listen. Die erste enthält die zahlen selbst in Positionen, und die zweite die Zahl ist ungerade Positionen.
E. g.: even_odd([1,2,4,7,5],Even,Odd).
führt Even=[2,7].
und Odd=[1,4,5].
Habe ich gefunden elegantere Lösungen als meine, googeln das problem, jedoch möchte ich, um herauszufinden, wo das problem liegt mit in meinem code (wahrscheinlich Betreiber Missbrauch), weil ich wirklich glaube, ich habe ein sehr schlechtes Verständnis von Prolog die Betreiber (vor allem in der Arithmetik-Vergleich). Auch googeln, es macht es nur noch schlimmer, jede Webseite hat eine völlig andere Erklärung.
Mein code:
even_odd([], [], []).
even_odd([H|T], Even, Odd) :-
length([H|T], X),
X mod 2 is 0,
append(Even1, H, Even),
even_odd(T, Even1, Odd).
even_odd([H|T], Even, Odd) :-
length([H|T], X),
X mod 2 is 1,
append(Odd1, H, Odd),
even_odd(T,Even,Odd1).
Ich habe versucht, tracing und ich weiß, das problem liegt in der X mod 2 is 1
oder 0
keiner von Ihnen ist jemals wahr. Wenn ich eine Liste mit drei Elementen, und ändern Sie die Bedingung zu X is 3
es ist völlig in Ordnung, aber die Teilung scheint es Durcheinander, so dass jeder Ideen?
InformationsquelleAutor Angelos Chalaris | 2014-01-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Arithmetische Auswertung operator (ist)/2 führt arithmetische Operationen auf den rechten Ausdruck, und vereint es mit seiner linken argument, und wenden Sie den test auf die falsche variable. Sollte
Alternativ gibt es (=:=)/2, führt arithmetische Operationen auf beiden Seiten. Dann könnte
Darüber hinaus die Art und Weise, die Sie Bearbeiten Listen macht nicht viel Sinn. Sie müssen noch den Wert in der Liste Auch. Dann so etwas wie
mehr Sinn machen würde.
ja, danke, vielleicht hatte ich blinde Fleck, der beim Lesen der Frage
Gut, ich weiß, dass meine Lösung nicht sehr sinnvoll, nach dem Versuch es für eine Weile, aber das problem war vor allem, warum die Bewertung ist fehlgeschlagen. Also das beantwortet meine Frage, warum der Scheck war falsch. Es scheint zu funktionieren jetzt! 🙂
InformationsquelleAutor CapelliC
Während CapelliC hat die richtige Idee, etwa, warum Ihr code fehlschlägt, wird er missverstanden, zu deiner Frage, die gerade/ungerade Positionen.
Das problem ist, Sie kalkulieren solche aus der Ende der Liste, so dass
even_odd([1,2,4,7],Even,Odd).
führtEven=[1,4].
undOdd=[2,7].
ist nicht, was Sie wollen.Eine Lösung wäre die Umkehrung der Liste vor der Verarbeitung und Umkehrung der Ergebnisse danach, oder nehmen einen anderen Ansatz.
Hier, wir beginnen, indem Sie das erste element der seltsame Liste, und dann abwechselnd hinzufügen, um der geraden und der ungeraden Liste, bis wir erreicht haben, das Letzte element.
Ich bin damit einverstanden, aber es war ein Fehler in Ihrer Lösung, die nicht leicht behoben werden, außer durch das hinzufügen von mehr kludges wie die Umkehrung vor und nach. Das ist, warum ich fügte hinzu, dieses Beispiel: es scheint mir, als ob Sie versuchen zu schreiben prozeduralen code in Prolog. Ich denke, es ist lebenswichtig zu lehren, den richtigen Weg des Denkens in Prolog.
Ich dachte nur, der eine interessante Herausforderung. Tun Sie dies für eine beliebige Anzahl von Listen anstelle von zwei. So zum Beispiel
divvy([1,5,4,8,6,4,4,2,0,4], 3, X) ? X = [[1,8,4,4], [5,6,2], [4,4,0]].
Danke für die Mühe. Obwohl mein problem war vor allem, warum der Vergleich fehlgeschlagen ist, ist dies eine schöne Lösung. Allerdings fand ich dann eine elegantere sowieso! Ich war nur neugierig, warum meine Lösung konnte nicht Vergangenheit, die ein certaint Punkt!;)
Total +1. Alles, was kann ausgedrückt werden über pattern matching sollte ausgedrückt werden über pattern-matching. Der Fall der im Zusammenhang mit einer Liste seiner gerade/ungerade Positionen kann klar ausgedrückt werden, die über pattern matching, so ist diese Lösung sehr empfehlenswert. Beachten Sie, dass Sie diese version verwenden, in alle Richtungen, zum Beispiel:
?- even_odd(List, [a,b,c], [d,e,f]).
wird, die entweder gar nicht möglich oder führt zu Kündigung Probleme mit moster anderen Versionen und funktioniert nicht, auch nach dem anwenden der vorgeschlagenen Korrekturen.InformationsquelleAutor SQB
Gibt es ein paar Probleme.
Erste ist die, die @CapelliC wies darauf hin, dass die
is/2
Prädikat instanziiert eine einzelne variable auf der linken Seite mit dem Wert des Ausdrucks auf der rechten Seite. Der ursprüngliche code hat der Ausdruck auf der linken Seite und dem Wert auf der rechten Seite und schlägt immer fehl. Also dieses:Sollte geändert werden zu:
Oder, wie @CapelliC sagt,
X mod 2 =:= 1
.Zweite, Ihre
append
versuche zum Anhängen eines einzelnen Elements zu einer Liste.append
funktioniert nur auf Listen. Also diese:Sollte
Dritte, die Bestellung von
append
und die rekursiveeven_odd
Anruf wird ein Problem verursachen:Odd1
ist nicht instanziierten wennappend
genannt wird, so istOdd
. Dies erzeugt eine unendliche Anzahl von Lösungen für dieappend
bevor eine akzeptable Antwort kann gebunden werden, indem die base-case, was ist ein stack-überlauf. Die einfache Lösung dafür ist, um Sie zu tauschen:Funktioniert jetzt, aber führt zu Ergebnissen in der umgekehrten Reihenfolge:
Ist die einfachste Sache zu beheben, ist voranzustellen, anstatt anfügen. Ersetzen
Mit
Oder einfach im Kopf der Klausel. Die endgültigen Klauseln, mit allen fixes, dann so Aussehen:
Nachgeben
Schließlich gibt es ein weiteres Problem: die Parität der Listen wird bestimmt von das Ende der Liste eher als der Anfang. Dies ist aufgrund der Logik der Verwendung
length
auf der aktuellen Liste fragment, als ein Mittel zur Bestimmung der Parität.Diese zu lösen, innerhalb der gegebenen Struktur des Codes (wieder, side-stepping, die mehr Natürliche Lösung, die @ATS dargestellt), würden Sie wirklich brauchen, um count/index-von Anfang an. Betrachten Sie wortreich, dass uns führen würde, um eine Lösung wie diese:
Gibt:
Es ist eine funktionierende Lösung, aber nicht optimal, da es sich nicht nehmen, den Vorteil des "Wissens" von der Liste position des Codes (Redundant führt, die eine Anzahl oder index, um zu wissen, wo wir stehen in der Liste).
InformationsquelleAutor lurker