(*************************************************************************) (* Kuenstliche Intelligenz ? *) (* EXPSYS, aus CHIP-SPECIAL Turbo 2 *) (*************************************************************************) PROGRAM ExpertenSystem; TYPE Eintrag = RECORD CASE Endknoten : boolean OF true : (Vermutung : STRING[40]); false: (Frage : RECORD Zeile : STRING[40]; ja, nein : integer END) END; VAR EintrFile :FILE OF Eintrag; PROCEDURE NormZeile(VAR z); VAR Zeile: String[40] Absolute z; BEGIN Zeile[1]:=upcase(Zeile[1]); IF Zeile[length(Zeile)]='?' THEN delete(Zeile,length(Zeile),1); END; PROCEDURE LiesEintrag(Nummer : integer;VAR tEintr : Eintrag); BEGIN seek (EintrFile,Nummer-1);read(EintrFile,tEintr) END; PROCEDURE SchreibEintrag(Nummer : integer; tEintr : Eintrag); BEGIN seek(EintrFile,Nummer-1);write(EintrFile,tEintr) END; PROCEDURE StartDialog; VAR tEintr : Eintrag; BEGIN Clrscr; WITH tEintr, Frage DO BEGIN Endknoten:=false; write('Bitte geben Sie die erste Frage ein! '); readln(Zeile); NormZeile(Zeile); ja:=2; nein:=3 END; SchreibEintrag(1,tEintr); WITH tEintr DO BEGIN Endknoten:=true; writeln('Worum handelt es sich wenn diese Frage bejaht wird? '); readln(Vermutung); END; SchreibEintrag(2,tEintr); WITH tEintr DO BEGIN Endknoten:=true; writeln('Worum handelt es sich,wenn diese Frage verneint wird? '); readln(Vermutung); END; SchreibEintrag(3,tEintr); END; FUNCTION JaNein : char; VAR c: char; BEGIN write('J/N ? '); REPEAT read(kbd,c);c:=upcase(c) UNTIL c IN ['J','N']; writeln(c); JaNein:=c; END; {$A-} PROCEDURE Dialog(Nummer : integer); VAR tEintr, wEintr: Eintrag; Nr1, Nr2 : integer; BEGIN LiesEintrag(Nummer,tEintr); WITH tEintr DO CASE Endknoten OF true: BEGIN Endknoten:=false; writeln('Vermutlich handelt es sich um >',Vermutung,'<.'); writeln; write('Ist das richtig? '); CASE JaNein OF 'J': writeln(#10#13'Ich hoffe,Ihnen geholfen zu haben.'); 'N': BEGIN WITH wEintr DO BEGIN Endknoten:=true; writeln; write('Worum handelt es sich dann? '); readln(Vermutung);writeln; END; Nr1:=FileSize(EintrFile)+1; SchreibEintrag(Nr1,wEintr); WITH wEintr DO BEGIN Endknoten:=true; Vermutung:=tEintr.Frage.Zeile; END; Nr2:=FileSize(EintrFile)+1; SchreibEintrag(Nr2,wEintr); write('Bitte geben Sie eine Frage ein,wodurch '); write('es sich von >',wEintr.Vermutung); writeln('< unterscheidet !'); readln(Frage.Zeile); writeln; NormZeile(Frage.Zeile); write('Und wie lautet die Antwort?'); WITH Frage DO CASE JaNein OF 'J': BEGIN ja:=Nr1; nein:=Nr2 END; 'N': BEGIN ja:=Nr2; nein:=Nr1 END; END; SchreibEintrag(Nummer,tEintr); END; END; END; False: WITH Frage DO BEGIN write(Zeile); CASE JaNein OF 'J': Dialog(ja); 'N': Dialog(nein); END; END; END; {case} END; {Dialog} {$A+} BEGIN clrscr; writeln('EXPSYS - WISSEN & LERNEN'); writeln('========================');writeln; assign(EintrFile,'EXPSYS.EXP'); {$I-} reset(EintrFile) {$I+}; IF IOResult<>0 THEN BEGIN rewrite(EintrFile); StartDialog; END; REPEAT clrscr; Dialog(1);writeln;writeln; write('Weitermachen?') UNTIL JaNein='N'; close(EintrFile); END.