Wie für das erstellen von globalen Variablen in prolog
Ich habe eine Liste, die ich erstellen Sie wie folgt:
tab([(top,left),(top,middle),(top,right),(center,left),(center,middle),
(center,right),(bottom,left),(bottom,middle),(bottom,right)]).
Ich möchte erstellen Sie eine Globale variable AllPosition eine Registerkarte. Also habe ich Folgendes gemacht:
tab(AllPos).
Ist das richtig?
Dann habe ich Folgen problem:
Ich habe eine Funktion, erhält einer der beiden in tab. Dass ich wünschte, zu entfernen. Also ich habe das:
place(Line, Column, Tab) :-
AllPos \== [_,_] /*while AllPos isn't empty - not sur if this is done this way*/-> (member((Line,Column), AllPos) -> (erase(AllPos, (Line,Column), AllPos)).
wo erase(List, Element, NewList)
löscht das element Element aus der Liste und erstellt eine neue Liste, NewList gleich Liste, aber ohne Element. Beide Funktionen member
und erase
arbeiten.
Die Sache ist die... Wie Sie vielleicht bemerkt haben, verwende ich AllPos
überall. Das ist, weil ich möchte, ich möchte es ändern, so kann ich später (nachdem er entfernt einige Elemente daraus), in einer anderen Funktion. Ist meine Logik richtig? Werde ich in der Lage sein, um modifizierte AllPos in einer anderen Funktion?
Dank
InformationsquelleAutor FriedRike | 2012-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
In SWI-Prolog, die Sie verwenden können:
b_setval(name, value)
undb_getval(name, value)
. Und falls Sie nicht wollen, dass die Werte wieder ändern, im Falle von backtracking, können Sie diese der tatsächlichen globalen mithilfe:nb_setval(name, value)
undnb_getval(name, value)
.So zum Beispiel, wenn Sie haben ein Programm, und Sie möchten, um zu überprüfen, wie oft ging es durch einen bestimmten Pfad, die Sie verwenden können:
Dies ist gut für einige experimentelle Fällen, aber im Allgemeinen werden Sie wollen, um zu vermeiden, Globale Variablen in Prolog, da Prolog bedeutet-Programmierung in Logik.
InformationsquelleAutor Yeti
hinzufügen zu Ian ' s Antwort:
in der Regel mit assert/retract langsam ist. viele prolog-Implementierungen haben effizientere Möglichkeiten für veränderliche Globale Variablen (zum Beispiel check swi-prolog ist lib )
nun, wenn Sie möchten, eine unveränderlich Globale variable, die kodiert werden können, fast wie Sie haben;
Sie wird "erklären" als
myvar(42).
aber, es zu benutzen Sie haben, dies zu tun:wieder mit veränderlichen globalen Variablen ist nicht wirklich vorgeschlagen, und kann führen sehr, sehr schlecht und schwer zu erkennen, bugs aufgrund von backtracking.
cheers, behoben!
InformationsquelleAutor Thanos Tintinidis
In Kürze: Nein, deine Logik nicht richtig. Es gibt verschiedene kleinere Probleme und bugs mit Ihrem code, aber das größere problem ist die grundlegende Voraussetzung. Es klingt, als ob du denkst, das problem der falsche Weg. Im Allgemeinen, wenn Sie versuchen, ein update globalen Zustand in einem Prolog-Programm, das Sie brauchen, um zu überdenken, Ihr Entwurf. Staat ist mehr in der Regel durchgeführt, indem die Argumente von Prädikaten, also eher als einigende
AllTabs
im Körper vonplace/4
hätte ich erwartet, daß der Satz von aktuellenTabs
übergeben zu werden, als ein argument.Wenn Sie wirklich möchten, aktualisieren Sie den globalen Status des Programms, dann müssen Sie schauen, um die
assert
undretract
Prädikate.Einige spezifische Punkte:
dieser erklärt ein Prädikat, das mit einem ungebundenen Variablen in den Kopf. Es ist mehr oder weniger bedeutungslos (Sie konnte Lesen, "ist es der Fall, dass
tab
wahr ist, von etwas, aber wir haben keine Informationen darüber, was es ist wahr").Dieser Verwendung
AllPos
ist in einem anderen Bereich zutab/1
, so dass abgesehen von teilen die gleiche Abfolge der Zeichen in der Variablen name, die beiden Verwendungen vonAllPos
haben keine Beziehung überhaupt.InformationsquelleAutor Ian Dickinson