Zeichenketten (Strings)

Bei dem Expertensystem im vorigen Kapitel hätte man auch Texte mit dem Prädikat read(A) einlesen können. Das hätte das Prädikat ausl überflüssig gemacht. Allerdings müssten die Texte in " eingeschlossen werden mit anschließendem Punkt, eine nicht sehr elegante Lösung. Trotzdem werden wir es hier versuchen: Die Unterscheidung von Nachfolgefrage und Diagnose hätte sich vereinfacht, wenn man Fragen mit ? beendet, Diagnosen aber nicht: Man müsste in der ersten Klausel nur nach dem Fragezeichen suchen.

Die Werkzeuge

SWI-Prolog stellt verschieden Prädikate für die Textverarbeitung zur Verfügung:

string_to_atom(S,A)
string_to_list(S,L)
string_length(S,N)
string_concat(A,B,S)
sub_string(S,B,N,R,E)
ein String S wird zu einem Atom A
ein String S wird zu einer Zeichenliste L
die Zeichenzahl N eines Strings s
zwei Strings A und B werden zu einem String S zusammengefügt
ein String S wird ab Position B aufgeteilt in einen Teilstring E der Länge N und dem nachfolgenden Reststring

Werden alle Parameter in einer Klausel durch konkrete Werte ersetzt, so testet die Klausel, ob die vorgegebenen Werte zusammen passen, also die Klausel den Wahrheitswert true hat. Werden Parameter nicht vorgegeben, so sucht Prolog passende Werte, so dass die Klausel wahr wird.

Das kann man nutzen, um mit dem Prädikat sub_string ein Zeichen Z zu suchen:
sub_string(T,_,_,_,Z)      wird wahr, wenn das Zeichen Z in T gefunden wird, sonst falsch. Die restlichen Parameter in sub_string haben für die Suche keine Bedeutung und werden daher durch _ ersetzt.

Das Programm

exp(F):-not(sub_string(F,_,_,_,"?")),write("Diagnose:"),write(F),nl.
exp(F):-write(F),read(A),clause(dat(F,A,Fn),true),exp(Fn).
exp(F):-write("Antwort wiederholen oder #:"),read(A),
    write("Neue Frage:"),read(Fn),asserta(dat(F,A,Fn)),exp(Fn).
anf:-exp("krank?").
enthält F nicht ?, so ist F eine Diagnose und wird ausgegeben
sonst zu F Antwort erfragen und, falls Nachfolgefrage Fn vorhanden, exp(Fn) aufrufen
wenn Nachfolgefrage fehlt, neue Nachfolgefrage/Diagnose aufnehmen

Startfrage, dabei "krank?" als Text vorgegeben


Das Programm gibt es zum Testen unter expstr.pl. Man denke beim Eingeben von Texten, dass diese in " eingeschlossen werden mit nachfolgendem Punkt!