Frage

Ich bin Prolog-Neuling, stecke aber bei diesem vermeintlich einfachen Befehl fest.Ich habe eine Wissensbasis ohne Fehler geladen und wann immer ich es versuche, behaupten (und selbst helfen) Ich bekomme die folgende Nachricht:

uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}

Was fehlt mir genau?Geschätzt.

War es hilfreich?

Lösung

Verwenden assertz/1 oder asserta/1 stattdessen.GNU-Prolog bietet nicht assert/1 weil nur asserta/1 Und assertz/1 sind im Standard definiert.

Beachten Sie, dass während asserta/1 hatte immer eine klare Interpretationsbedeutung Fügen Sie die Klausel am Anfang hinzu, die Bedeutung von assertz/1 war schwieriger zu lösen, da „eine Klausel am Ende hinzufügen“ die Semantik der Ziele, die vor der Geltendmachung der Klausel aufgerufen wurden, nicht vollständig bestimmt.

Mit ISO-Prolog können zuvor aufgerufene Ziele erreicht werden assertz/1 (aber auch retract/1) bleiben davon unberührt.Dies ist als bekannt Logische Update-Ansicht.Um den Standard zu zitieren (ISO/IEC 13211-1:1995):

7.5.4 Ein logisches Datenbank-Update

Jede Änderung in der Datenbank, die dadurch entsteht
Ausführen eines Ziels (z. B. wenn der Aktivator eines
Unterziel ist ein Aufruf von assertz/1 oder retract/1) wirkt sich aus
lediglich eine Aktivierung, deren Ausführung erst danach beginnt.Der
Die Änderung wirkt sich nicht auf die aktuelle Aktivierung aus
hingerichtet wird.

HINWEIS – Daher ist die Datenbank während der Ausführung von eingefroren
ein Ziel, und die Liste der Klauseln, die eine Prädikation definieren, ist festgelegt
der Zeitpunkt seiner Ausführung (siehe 7.7.7 e).

Beachten Sie, dass das Handbuch in DECsystem 10 Prolog einen großen Unterschied gemacht hat assert/1 Und assertz/1.Im folgenden Zitat aus dem DECsystem 10-Benutzerhandbuch von 1978 wird der Begriff Implementierung definiert kann nur das bedeuten, was in der Norm als bekannt ist Implementierungsabhängig (was im Wesentlichen undefiniert bedeutet).

5.5 Metalogisch

...

assert(C)

Die aktuelle Instanz von C wird als Klausel interpretiert und hinzugefügt
zum aktuell interpretierten Programm (mit neuen privaten Variablen).
Ersetzen aller nicht instanziierten Variablen).Die Position des Neuen
Die Klausel innerhalb der betreffenden Prozedur ist durch die Implementierung definiert.
C muss als Nichtvariable instanziiert werden.

asserta(C)

Wie assert(C), außer dass die neue Klausel die erste wird
Klausel für das betreffende Verfahren.

assertz(C)

Wie assert(C), außer dass die neue Klausel die letzte wird
Klausel für das betreffende Verfahren.

Auch heute gibt es Systeme wo assert/1 Und assertz/1 abweichen.Z.B., .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top