Da niemand geantwortet hat und ich mir jetzt ganz sicher bin:
Ja, Sie könnten %code% verwenden, um eine der anderen Arten zu emulieren. Die Frage beschreibt im Detail wie.
Jedoch : Das ist aus verschiedenen Gründen eine schlechte Idee.
Es kann in seltenen Fällen vorkommen, dass die Größe der Elemente der Liste viel größer ist als die Länge der Liste, die wir sortieren, und dieser kleine Tanz:
%Vor%( siehe hier ) ist tatsächlich teurer (langsamer) als die Verwendung von %code% , mit %code% vom Benutzer definiert. Auch dann hängt die Reihenfolge der Ergebnisse mit äquivalenten Schlüsseln nicht nur von der (Benutzer-) Definition von %code% ab, sondern auch von der Implementierung von %code% .
Mit anderen Worten, eine "stabile" Sortierung mit %code% ist eine schlechte Idee.
Dies ist ein Follow-up zu einem antworten auf eine Frage zum Sortieren nach einem bestimmten Argument eines Begriffs, ohne eine neue Liste für %code% zu erstellen (wenn ich die ursprüngliche Frage richtig verstanden habe).
Nehmen wir an, wir wollten %code% genauso verhalten wie %code% : Wenn ich das richtig verstehe, würde das bedeuten, es wie folgt zu benennen:
%Vor%Nun sagen wir, dass wir %code% verwenden wollten, um nach %code% zu sortieren (siehe auch Frage ). Eine Möglichkeit wäre, ein Vergleichsprädikat %code% zu definieren, das %code% nicht mit %code% vereinigt, wenn die Elemente tatsächlich gleich sind:
%Vor%Frage : Sortiert das wirklich einfach, ohne Duplikate zu entfernen, wie %code% es tut? Es scheint wie es sollte.
Weiter: Sagen wir, dass wir die Begriffe mit arity & gt; n, auf die Standard-Reihenfolge des n-ten Arguments in der Laufzeit. Der saubere Weg dazu wäre:
%Vor%Wenn wir %code% verwenden wollten, um denselben Effekt zu erzielen, könnten wir versuchen, ein Vergleichsprädikat wie folgt zu verwenden:
%Vor%Und nach dem zweiten Argument sortieren:
%Vor%Dies ist jedoch nicht das gleiche wie %code% über dem, das %code% verwendet. Es wird Duplikate entfernen, und es werden zusammengesetzte Terme gemäß der Standardreihenfolge des ursprünglichen vollständigen Terms angeordnet, wenn die zweiten Argumente zweier Terme zufällig gleich sind:
%Vor%Machen Sie die Annahme , dass für jedes Paar von %code% und %code% , das an das Vergleichsprädikat %code% übergeben wurde, %code% vor %code% in der ursprünglichen Liste steht. Können wir einen Vergleich definieren:
%Vor%An dieser Stelle, genau dann, wenn zwei beliebige Elemente %code% und %code% immer an das Vergleichsprädikat in der gleichen Reihenfolge wie in der ursprünglichen Liste übergeben werden, sollte sich dies verhalten identisch mit %code% oben:
%Vor%Nun ist es natürlich wichtig, dass %code% %code% mit %code% vereinigt, wenn die beiden "Schlüssel" gleich sind. Darüber hinaus ist das Verhalten implementierungsabhängig und nur identisch mit dem Beispiel %code% , wenn %code% die ursprüngliche Reihenfolge der Elemente beim Übergeben an das Vergleichsprädikat beibehält.
Frage Stimmt das?
Frage Gibt es einen Standard, der diesen Aspekt von %code% abdeckt?