Somit müssen neue Klauseln sofort in eine Datei geschrieben werden und zwar so, dass sie später durch andere Programmklauseln wieder eingelesen und mit assert in das Programm integriert werden können. Letzteres erfordert spezielle Maßnahmen, die in anderen Programmiersprachen nicht nötig sind.
Um die entsprechenden Prädikate in ihrer Wirkung vorzustellen, werden wir ein kleines Datenbankprogramm nutzen, das zu einem Namen N zusätzliche
Eigenschaften E speichert. In der Fassung ohne Dateisicherung besteht das Programm aus nur zwei Klauseln:
|
ein(N,E):-assert(dat(N,E)). aus(N,E):-clause(dat(N,E),true). |
Namen N und Eigenschaft E in das Programm eingliedern Vorgabe N bzw. E suchen, nicht vorgegebene Daten ausgeben |
Eine zweite Möglichkeit besteht darin, eine Datei zum Schreiben mit tell(F)
bzw. append(F) zu öffnen und dann mit told
zu schließen bzw. zum Lesen mit see(F) zum Lesen zu öffenen und dann mit
seen zu schließen, wobei F wiederum der Dateipfad ist. Man kann dann allerdings nicht mehrere Dateien oder Geräte gleichzeitig nutzen.
tell überschreibt eine Datei mit neuen Daten, append fügt einer Datei neue Daten hinzu. Ist die Datei noch nicht vorhanden, so legen tell und append diese neu an.
Beim Einlesen unserer Datenbankdaten sollen neue Klauseln erzeugt werden. Dies erfordert, dass die Daten in einer Form gespeichert werden, die beim Einlesen als Klauseln
erkannt werden. write entfernt die Zeichen ' und " , writeq behält sie. Letzteres benötigen
wir, damit nicht Wörter mit großen Anfangsbuchstaben als Variable interpretiert werden.
Zudem ist dafür zu sorgen, dass jede in einer Datei gespeicherte Klausel mit einem Punkt endet.
Beim Einlesen ist nicht bekannt, wann keine Daten mehr gelesen werden können. Dies muss getestet werden, damit das Programm nicht mit einer Fehlermeldung abbricht. Als Wahrheitswert liefert das Prädikat at_end_of_stream den Wert true, wenn keine Daten mehr gelesen werden können.
Mit diesen Werkzeugen lässt sich nun das Programm ergänzen:
|
ein(N,E):-asserta(dat(N,E)),append('c:/dat.pl'), writeq(dat(N,E)),write('.'),nl,told. aus(N,E):-clause(dat(N,E),true).
inf:-see('c:/dat.pl'),in. |
neue Daten aufnehmen, Datei zum Schreiben öffnen Daten in Datei schreiben, Datei schließen Daten suchen und ausgeben
Datei zum Lesen öffnen, Aufruf von Prädikat in |
Aufgabe: Man versuche, das Expertensystem zu ergänzen, dass Daten gespeichert und gelesen werden können.