% Ein Prolog-Programm zur Simulation des deterministischen
% endlichen Automaten (DEA)
%
% pap    d.h.  delta(p,a)=p
% pbq          delta(p,b)=q
% qap          ...
% qbr
% rar
% rbr
% mit dem Anfangszustand p und dem einzigen Endzustand r
%
% Das Programm ist aufzurufen mit der Anfrage
%   ?- start.
% Dann ist jedes Zeichen des gewuenschten Eingabewortes und am Ende
% das Zeichen x jeweils gefolgt von der RETURN-Taste einzugeben, z.B.
%   a RETURN b RETURN a RETURN b RETURN b RETURN x RETURN
% fuer das Eingabewort  ababb.
% Das Programm antwortet dann, ob der Automat das Wort akzeptiert.


% start  startet den Automaten im Anfangszustand p.
start :-
	starte_im_Zustand(p).

% Die Uebergangsfunktion delta:  delta(p,a)=p, delta(p,b)=q, ...
delta(p,a,p).
delta(p,b,q).
delta(q,a,p).
delta(q,b,r).
delta(r,a,r).
delta(r,b,r).

% r ist Endzustand.
endzustand(r).

starte_im_Zustand(P) :-       %Starten des Automaten von einem Zustand P aus:
	write('Aktueller Zustand: '), write(P), nl,
	write('Naechstes Zeichen: '),
	lies_das_Zeichen(A),  %Lies das naechste Zeichen A und
	weiter(P,A).          %mache weiter im Zustand P nach Lesen von A!

lies_das_Zeichen(A) :-        %Naechstes Zeichen des Wortes; am Ende x.
	get_char(A),          %(in Prolog eingebaut)
	get_char('\n').       %Lies das Zeichen '\n' (RETURN-Taste)!

% Weitermachen, nachdem im Zustand P das Zeichen A gelesen wurde:
weiter(P,A) :-                %Wenn A ein Zeichen des Alphabets ist,
	delta(P,A,Q),         %bestimme mittels delta den Nachfolgezustand Q
	starte_im_Zustand(Q). %und starte den Automat im Zustand Q!
weiter(P,x) :-                %Sonst (Wort zu Ende) ist A = x.
	endzustand(P).        %Dann akzeptiere, wenn P ein Endzustand ist!



% Bemerkung: get_char wartet, bis Sie die RETURN-Taste betaetigt haben.
% Es geht aber auch ohne RETURN-Taste. Ersetzen Sie dazu die Definition
% von lies_das_Zeichen/1 etwa durch
%	lies_das_Zeichen(A) :-       %Naechstes Zeichen des Wortes; am Ende x.
%		get_single_char(Code),  %lies das eingegebene Zeichen (Code)
%		put_code(Code),         %zeige es am Bildschirm (Echoing)
%		nl,                     %neue Zeile
%		char_code(A,Code).      %Verwandle Character Code zu Zeichen A
% fuer SWI-Prolog oder durch
% 	lies_das_Zeichen(A) :-       %Naechstes Zeichen des Wortes; am Ende x.
%		get_key(Code),       %lies Eingabezeichen und mache Echoing
%		nl,                  %neue Zeile
%		char_code(A,Code).   %Verwandle Character Code zu Zeichen A
% fuer GNU-Prolog.
