Prolog - fügen Sie einige Elemente, die gleiche Liste
Ich habe ein problem, um das hinzufügen von Elementen in einer Liste in Prolog. Ich benutze diese Regel:
add(X, L, [X|L]).
Dieser Regel fügen Sie ein element im Kopf der Liste.
Wenn ich möchte hinzufügen, einige element zu der Liste, ich habe dieses problem:
add(a, L, L1),
add(b, L1,L2),
add(c, L2,L3).
L3= [a,b,c]
Gibt es eine Methode zum hinzufügen von Elementen in einer Liste ändern Sie den Namen der Variablen... L1, L2, L3, aber indem Sie eine einzelne variable L?
Gibt es ein bestimmtes größeres problem-Kontext für dieses Szenario, das Sie im Sinn haben? Vielleicht gibt es einen anderen Weg, um Ihr Ziel zu erreichen.
InformationsquelleAutor Joachim Low | 2013-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort ist Nein: L würde zu vertreten, die auf verschiedenen Listen, was falsch ist in Prolog.
Aber Sie implementieren können, so etwas wie dieses:
Beispiel für die Nutzung:
Nein, aber Sie können fügen Sie am Ende der offenen Liste, als diese Antwort zeigt.
Mit dieser Lösung, um das hinzufügen der offenen Liste, nicht Sie müssen weiterhin mit neuen, nicht instanziierten Variablen? So nach dem Beispiel, fügen Sie
[6,7]
Sie hätteadd_list([6,7],Z,Y).
? So ist es vielleicht noch immer verlässt man mit dem hartnäckigen problem der Schaffung von neuen Variablen-Namen zu instanziieren.kümmert sich um alle dazwischen liegenden Variablen; es braucht nur noch zwei. Wenn Sie planen, ruft es mehrere Male, es gibt einen Grund dafür, einen Kontext für das, mit seinen logvars. Die Differenz-Listen-Technik braucht immer zwei-Variablen - Kopf und end_pointer. End_pointer änderungen, so dass jedes Prädikat, das instanziiert wird, muss wieder eine neue. So ist seinen Ergebnis stellt für uns eine neue nicht instanziierten logvar, die wir behandeln, wie end_pointer später im code. -- Die DCG-Schnittstelle macht diese beiden logvars implizit. Sie werden ausdrücklich in dem Aufruf
phrase(dcg_rule, List, Rest)
.InformationsquelleAutor NotAUser
Dass implizit gemacht, indem DCG, hinzufügen von (versteckt) Unterschied Liste Argumente auf, die nicht Klemmen.
Aber ohne ein paar mehr Details über Ihre Aufgabe, es ist schwer zu Tipp, dass eine sinnvolle Nutzung.
SWI-Prolog hat tatsächlich einige ernsthafte Fähigkeit, über nicht backtrackable Daten, Strukturen, Aufgaben zu erfüllen, mit "Nebenwirkungen" zu propagieren, durch die Lösung der Kette, aber ich bin mir nicht sicher, ob es opportun ist, um anzudeuten, Sie über diese Funktion...
Bearbeiten ein Beispiel für die Aktualisierung eines RBTree in einen Fehler getrieben Schleife:
Ich stellte ein kleines Beispiel.
danke. "propagieren ..." warf Sie mich komplett ab. "Häufung von Nebenwirkungen von Lösungen in einen Fehler getrieben loop" wäre einfacher zu verstehen.
InformationsquelleAutor CapelliC
Die kurze Antwort, wie erwähnt, KEINE.
Die längere Antwort: Sie können nicht hinzufügen von Elementen zu einer vorhandenen Liste (ohne eine neue Liste zu erstellen). Noch können Sie erhöhen einer Variablen wie Sie vielleicht in anderen Sprachen: Sie können nur eine neue variable, deren Wert die source-variable um 1 erhöht. Prolog-Datentypen sind alle unveränderlich. Prolog-Variablen, einmal gebunden ist, zu einem Wert, nicht mehr variable. Ihre Bindung wird rückgängig gemacht, wenn die Ausführung backtracks durch die Abtretung mitteilt.
InformationsquelleAutor Nicholas Carey
Obwohl Sie können nicht nur hinzufügen zu einer vorhandenen Liste, die dem entspricht, was die direkte Frage, gibt es einige Klassen von Problemen, die gelöst werden kann mit einem Prädikat, dessen Lösungen sind individuell Elemente, die Sie sammeln möchten, in eine Liste, und Sie sammeln, können Sie mit der ISO-Prädikat
findall
:Als ein triviales Beispiel für den Fall gegeben:
Welche generiert:
Ich Stimme bis zu einem Punkt, aber es hängt davon ab, was Sie suchen. Wo der Kommentar sagt, "Triviales Beispiel, um zu bestimmen, X" würde es eine Logik, die wählt Elemente einzeln zu der Liste hinzufügen. Als ich gebeten hatte, die OP und wie ich bereits in meiner Antwort, es hängt vom Kontext des Problems. Es ist möglich, das problem könnte sein, "zugeordnet", was ich zeige, aber ohne weitere Informationen von Kontext, ist es in der Tat schwierig zu sagen. Letztlich ist die OP versucht, erstellen Sie eine Liste.
InformationsquelleAutor lurker