Prolog: wie Schreibe (und Verwendung) einer Funktion, die Listen alle Listen-Permutationen?
Habe ich gefunden, so ein Beispiel der naiven Art, geschrieben in prolog und ich bin versucht, es zu verstehen:
naive_sort(List,Sorted):-perm(List,Sorted),is_sorted(Sorted).
is_sorted([]).
is_sorted([_]).
is_sorted([X,Y|T]):-X=<Y,is_sorted([Y|T]).
perm(List,[H|Perm]):-delete(H,List,Rest),perm(Rest,Perm).
perm([],[]).
delete(X,[X|T],T).
delete(X,[H|T],[H|NT]):-delete(X,T,NT).
Naive_sort Aufruf korrekt funktioniert, aber ich kann einfach nicht herausfinden, warum. Das Hauptproblem ist die permutation. Wenn Sie aufgerufen wird, implizit, es gibt immer nur einen Wert. Wie ist es dann möglich, dass in naive_sort Funktion rufen Sie alle Permutationen überprüft werden? Auch, wie könnte ich das ändern perm-Funktion schreiben, die alle Permutationen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist wirklich eine naive Art-es durchläuft den Baum von allen möglichen Permutationen, bis es zum Glück findet eine sortierte ein. Das ist eine Komplexität von O(n!) ich nehme an :>
Über die permutation-Funktion -- es funktioniert "rückwärts" - beachten Sie, dass die definition nimmt den Kopf aus dem Ergebnis. Wenn Sie rund um Ihren point of view, werden Sie feststellen, dass anstatt zu löschen es tatsächlich fügt Werte durch arbeiten rückwärts. Wie der Algorithmus arbeitet nach hinten, damit die
H
ead gewählt, kann alles sein, die es erlauben, ein Ergebnis erstellt werden, damit alle verwendeten Wert aus der Liste.Grundsätzlich die permutation Algorithmus übersetzt die folgenden verfahrenstechnischen Umsetzung:
Diese Art der Erzeugung von Permutationen. Alle von Ihnen.
Kurz - perm erzeugt, die den gesamten Raum der möglichen Lösungen, indem Sie ausgehend von einem leeren Lösung und überprüfen, wie die gegebene Lösung möglich ist, aus einer gültigen löschen.
Prolog ist eine Sprache, die immer versucht, die an den Nachweis der Wahrheit einer Aussage, durch die sich diese mithilfe der Axiome (Fakten oder Regeln) gegeben.
perm
ist nicht eine Funktion im Sinne der prozeduralen Programmierung.perm
ist ein Prädikat, über die wir erzählen prolog zwei Dinge:List
ist eine permutation von[H|Perm]
wenn es eine ListeRest
so dassRest
erhält man durch löschen vonH
ausList
, undRest
ist eine permutation vonPerm
.Wenn Sie gefragt werden, ob einige Liste ist eine permutation eines anderen, prolog versucht, diese ableitungsschritte (rekursiv), um es zu beweisen. Wenn diese Rekursion erreicht eine Sackgasse, d.h. eine Aussage kann nicht bewiesen werden, da keine Regeln auf Sie angewendet werden kann, es backtracks.
verwenden Sie ein Semikolon (;) am Ende jeder permutation prolog geben würde Sie, bis es keine andere permutation, prolog sollte sagen Kein