Wie Sie access-Liste Permutationen in prolog?
Ich möchte die access-Liste permutation und übergeben Sie Sie als argument an andere Funktionen übergeben werden.
Dies ist die permutation code:
takeout(X,[X|R],R).
takeout(X,[F|R],[F|S]) :-
takeout(X,R,S),
write(S).
perm([X|Y],Z) :-
perm(Y,W),
takeout(X,Z,W).
perm([],[]).
Bitte erklären Sie Ihr problem klar werden. Was werden Sie ausgeführt, was nicht funktioniert? Was wollen Sie sehen, aber nicht sehen, oder sehen, dass Sie nicht sehen wollen?
Ich möchte, um eine Liste der Anzahl von Benutzer, und zeigen Sie alle max-heap-Bäume, so brauche ich die Vertauschung der Liste und senden Sie es als ein parametr max-heap-Funktion,(sorry für mein schlechtes Englisch)
Ich möchte, um eine Liste der Anzahl von Benutzer, und zeigen Sie alle max-heap-Bäume, so brauche ich die Vertauschung der Liste und senden Sie es als ein parametr max-heap-Funktion,(sorry für mein schlechtes Englisch)
InformationsquelleAutor BeginnerProgrammer | 2012-02-03
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
So starten Sie mit, lassen Sie uns definieren Sie Ihre Prädikate, so dass Sie nicht tun, jede unnötige I/O:
Nun haben Sie alles, was gelten könnte als einen "reinen" permutation-Funktion:
So, angenommen, Sie haben eine max_heap Funktion, die eine Liste von Werten und erzeugt einen Baum. Ich lasse Sie befürchten, dass, so lasst uns einfach postulieren, dass es vorhanden ist und genannt wird
max_heap/2
und lassen Sie uns weiter daran arbeiten, dass Sie einen Weg, um dieses attraktiv genanntdisplay_heap/1
. Zu "nehmen", die permutation und "senden" Sie es als parameter an diese Funktionen, sind Sie wirklich sagen, in Mathe-ese: angenommen, P ist eine permutation von X, let ' s machen ein max_heap mit es und zeigt es an. Oder, angenommen, P ist eine permutation von X, H ist ein max-heap aus X, let ' s display H:Dieser sagt das gleiche wie meine englischen Satz: angenommen, P ist eine permutation der Liste, dann H ist ein heap-Darstellung, dann zeigt es. Technisch
display_heap/1
ist immer noch ein Prädikat, das könnte wahr sein, oder falsch für eine bestimmte heap. In der Praxis, es wird immer wahr sein, und wenn Sie diese ausführen, müssen noch die Treffer;
immer wieder zu sagen, gib mir eine andere Lösung, es sei denn, Sie verwenden einen failure-driven-loop oder ein extralogical Prädikat wiefindall/3
zu verursachen, dass alle Lösungen gefunden werden.Bearbeiten: Lassen Sie uns besprechen, failure-driven-loops und
findall/3
. Zunächst lassen Sie mich fügen Sie einige neue Prädikate, weil ich nicht genau wissen, was Sie tun, aber es spielt keine Rolle, für unsere Zwecke.So, jetzt habe ich ein Prädikat
double/2
eine Verdoppelung der Werte in der Liste und ein Prädikatshowlist/1
druckt die Liste auf der standard-Ausgabe aus. Wir können es ausprobieren, wie so:Wenn Sie
;
du sagst, "oder?" zu Prolog. In anderen Worten, Sie sagen, "was sonst?" Du erzählst Prolog, in der Tat, dies ist nicht die Antwort, die ich will, versuchen Sie und finden Sie mir eine andere Antwort, die ich besser gefällt. Sie können formalisieren diesen Prozess mit einem failure-driven loop:So, jetzt siehst du die Ausgabe von jeder permutation durchgelaufen
double/2
da, und dann Prolog berichtet falsch. Das ist, was man mit etwas wie dieses:Schauen, wie das funktioniert:
Die andere option ist die Verwendung
findall/3
, das sieht eher aus wie diese:Verwenden diese um Ihr problem zu lösen, ist wahrscheinlich über den Rahmen was auch immer Hausaufgaben ist es, Sie arbeiten aber.
Ich fügte hinzu, eine Erklärung, die auf meine Antwort.
InformationsquelleAutor Daniel Lyons
Können wir definieren
list_permutation/2
basierend aufsame_length/2
undselect/3
wie diese:Dank
same_length/2
, die folgenden beiden Abfragen1,2 beenden universell:So weit, So gut. Aber was hat die Antwort-Reihenfolge Aussehen, wenn es doppelte Elemente der Liste?
5/6 Antworten sind überflüssig! Was können wir tun? Wir haben einfach verwenden
selectd/3
stattselect/3
!Let ' s re-run über Abfrage, gab uns 5 redundante Lösungen vor!
Besser! Alle redundanten Antworten verschwunden sind.
Vergleichen wir die Lösung für einige Beispiel-Fall:
OK! Wie über empirische Messungen zur Laufzeit mit einem problem von einer etwas größeren Größe?
Wir verwenden
call_time/2
für die Messung der Laufzeit in milli-SekundenT_ms
.OK! Und mit der richtigen Zusammenstellung von
if_/3
und(=)/3
,list_permuted/2
ist noch schneller!Fußnote 1: Mit SICStus Prolog version 4.3.2 (x86_64-linux-glibc2.12).
Fußnote 2: Die Antworten von Prolog toplevel wurden, nach der Verarbeitung, der Lesbarkeit zuliebe.
InformationsquelleAutor repeat
Wenn Sie wollen einfach nur erkunden Sie die Permutationen ohne die "False" am Ende, dieser code könnte hilfreich sein,
So, die Ausgabe von perm([a,b],B) wäre
InformationsquelleAutor Tabare