automat(Automat, Stan0,Stos0,StanyKoncowe,Przejscia) :- Automat=[Stan0,Stos0,StanyKoncowe,Przejscia]. migawka(Migawka, Stan,Stos,Dane) :- Migawka=[Stan,Stos,Dane]. migawka(Automat, Dane, Migawka) :- automat(Automat, Stan0, Stos0, _, _), migawka(Migawka, Stan0,[Stos0],Dane). przejdz(Przejscia, Migawka1, Migawka2) :- Przejscia = [Przejscie|_], Przejscie = [Stan1, StosP, DaneP, Stan2, StosQ], Migawka1 = [Stan1, Stos1, Dane1], append(StosP, Stos0, Stos1), append(StosQ, Stos0, Stos2), append(DaneP, Dane2, Dane1), !, Migawka2 = [Stan2, Stos2, Dane2]. przejdz(Przejscia, Migawka1, Migawka2) :- Przejscia = [_|Pozostale], przejdz(Pozostale, Migawka1, Migawka2). dzialaj(Automat, Migawka) :- wypisuj(Migawka), automat(Automat, _, _, _, Przejscia), przejdz(Przejscia, Migawka, Kolejna), !, dzialaj(Automat, Kolejna). dzialaj(Automat, Migawka) :- automat(Automat, _, _, StanyKoncowe, _), migawka(Migawka, Stan, _, Dane), Dane = [], memberchk(Stan, StanyKoncowe). uruchom(Automat, Dane) :- migawka(Automat, Dane, Migawka), dzialaj(Automat, Migawka). wypisuj(Migawka) :- migawka(Migawka, Stan, Stos, Dane), string_to_list(String, Dane), writef('Stan: <%t>', [Stan]),nl, writef('Stos: %t', [Stos]),nl, writef('Dane: "%t"', [String]), nl,nl. test :- automat(A, s, x, [k], [[s, [], "(", s, [n]], [s, [n], ")", s, []], [s, [x], "", k, []]]), D="(()())", uruchom(A, D).