Klauseln anordnen / Schlussketten

Das neue Programm soll Wenn-Dann-Beziehungen zu Schlussketten kombinieren, die von einer 'Bedingung' B zu einer 'Folgerung' F führt. Dazu werden zunächst die grundlegenden Wenn-Dann-Beziehungen mit einem Prädikat ein aufgenommen: Dies geschieht mit dem vordefinierten Prädikat readln, das allerdings Eingaben in eine Liste von Zeichen zerlegt. Alternativ könnte man auch das Prädikat read nutzen, was bei Texteingaben die Klammerung mit ' und den Abschluss mit einem Punkt erfordert. Da read umständlicher als readln zu handhaben ist, wird readln vorgezogen, auch wenn die Ausgabe von Texten in Listenform geschieht.
Da lediglich demonstriert werden soll, wie eine Schlusskette entsteht, kann man bei Bedingungen und Folgerungen auf Zahlen beschränken (vgl. Foto).

Programmablauf

Jeweils eine 'Bedingung' B und eine 'Folgerung' F werden mit dem Prädikat ein in einer Klausel dat(B,F) abgelegt. Die dat-Klauseln werden dabei in der Reihenfolge der Eingabe gespeichert. Gibt man nach Aufruf von impl eine Bedingung A und eine Folgerung E vor, so versucht das Programm, E schrittweise über die eingegebenen Beziehungen mit A zu verbinden, also eine Schlusskette zu erzeugen. Dies geschieht durch den rekursiven Aufruf des Prädikats dimp(B,F):
dimp sucht zu einer Folgerung F eine Bedingung A, zu der dat(A,F) existiert, und ersetzt dann bei einem erneuten Aufruf F durch A. Dabei wird dat(A,F) aus der Klauselliste gelöscht und an Ende wieder angehängt. Hierdurch wird erreicht, dass diese Klausel bei einem neuen Suchlauf erst sehr spät untersucht wird.

Um unnötigen Programmtext zu vermeiden, sind zur Ein- und Ausgabe die Prädikate din und aus formuliert. Die zweite Klausel dimp(B,_) ist entbehrlich, ermöglicht aber eine schönere Ausgabe der Schlusskette.

Dadurch, dass die dat-Klauseln bei jedem Aufruf ihren Platz im Programm ändern, werden bei erneuten Aufrufen von impl alternative Schlussketten gebildet.

Hinweis: Das Programm lässt sich ausbauen: Man speichere als dritten Parameter von dat eine Bewertungszahl ab, z.B. die Anzahl bzw. die Häufigkeit der Zugriffe. Statt eine dat-Klausel nach dem Löschen an das Ende der Klauselliste zu hängen, kann sie entsprechend ihrer Bewertung in die Liste eingeordnet werden.
Alternativ kann man als Bewertung die Haüfigkeit nehmen, mit der die gebildeten Schlussketten akzeptiert werden. Dabei lässt sich die Akzeptanz in der zweiten dimp-Klausel abfragen.
Der Einsatz von Bewertungen ermöglicht eine Funktionsweise, wie sie für neuronale Netze typisch ist (vgl. unten).

Die Werkzeuge

Zum Löschen einer Klausel kann man das Prädikat erase(S) einsetzen. Dabei gibt S die Position an, wo die zu löschende Klausel gespeichert ist. S lässt sich als weiterer Parameter u.a. der Prädikate assert und clause gewinnen, also zum Beispiel durch clause(dat(B,F),true,S).
Zusammen mit assert bzw. asserta kann man erase nutzen, um Klauseln in die Klauselliste entsprechend einer Bewertung (z.B. der Zugriffshäufigkeit) einzuordnen und die Liste somit zu sortieren.

Das Programm

aus(B,V,F):-write(B),write(V),write(F).
din(B,F):-write('Bedingung: '),readln(B),
       write('Folgerung: '),readln(F).
ein:-din(B,F),not(clause(dat(B,F),true)),
       asserta(dat(B,F)),aus(B,'=>',F),nl,
       write('Weiter(j/n) '),readln(A),nl,
       A=[j],ein.
dimp(B,F):-clause(dat(A,F),true,X),
       erase(X),assert(dat(A,F)),
       aus(F,'<=',''),dimp(B,A).
dimp(B,_):-write(B).
impl:-din(B,F),dimp(B,F).
Prädikat zur Ausgabe von B und F, dazwischen Text V
Prädikat zur Texteingabe von Bedingung B und Folgerung F

Eingabe von B,F ,Test, ob dat(B,F) noch nicht existiert
falls dat nicht existent, dann neues dat(B,F), Kontrollausgabe
Frage nach Fortsetzen der Eingabe
falls ja, rekursiver Aufruf von Prädikat ein
Zwischenziel dat(A,F) suchen, Speicheradresse in X kopieren
dat(A,F) von Speicher X löschen, neu eingliedern
Ausgabe von Folgerung F, rekursiever Aufruf von dimp(B,A)
falls dat(A,F) nicht gefunden, Ausgabe der Bedingung B
Eingabe einer Bedingung B und Folgerung F,
  Schlusskette von B nach F durch Aufruf von dimp erzeugen


Das Programm findet man unter datki.pl. Man kann das Programm zum Testen nutzen oder es nach eigenen Vorstellungen erweitern. Eventuell ist es günstiger, die dat-Klauseln in einer Liste zu speichern. Die Ausgabe einer Zeichenliste kann wie im letzten Kapitel über ein eigenes Prädikat realisiert werden. Um Ein- und Ausgabe insgesamt zu verbessern, sei auf die Anbindung an Windows hingewiesen.
Eine Programmversion, die die Akzeptanz von Schlussketten bei deren Bewertung berücksichtigt, findet man unter datkie.pl. Eine Sortierung der Klauselliste ist dort nicht realisiert.

Aufgabe: Man versuche, die vorgeschlagenen Verbesserungen zur realisieren.