Implementace konečného automatu v Prologu Tato část popisuje strukturu konkrétního automatu a bude se lišit pro každý automat. 1.Definice přechodové funkce: delta(stav1, vstup, stav2) Pokud ze stavu stav1 vede přechod do stavu stav2 při vstupním symbolu vstup. Tímto způsobem nadefinujeme všechny přechody. 2.Definice koncových stavů koncovy(stav) 1. Popis struktury automatu
Implementace konečného automatu v Prologu Nadefinujeme, jak pracuje konečný automat. Tato část bude pro všechny automaty stejná. Základem bude predikát prijme(Stav, Seznam), který bude odpovídat YES/NO na otázku, zdali automat přijme vstupní řetězec, který je reprezentován seznamem Seznam. Stav je počáteční stav, ze kterého automat startuje. Použijeme rekurzivní definici. 2. Specifikace práce automatu
Implementace konečného automatu v Prologu prijme(Stav, []) :- koncovy(Stav). % Prázdný vstupní řetězec je přijat, pokud je automat v koncovem stavu prijme(Stav1, [X|Zbytek]) :- delta(Stav1,X, Stav2), prijme(Stav2,Zbytek). % Řetězec skládající se z prvního symbolu X a zbytku je přijat automatem nacházejícím se ve stavu Q1 právě tehdy, když 1. existuje přechod ze stavu Q1 při tomto vstupním symbolu, 2. je přijat i zbytek řetězce. 2. Specifikace práce automatu
Implementace konečného automatu v Prologu Prolog nám díky možnostem svého vyhodnocování poskytuje několik možností práce s automatem: 1. Dotaz, jestli automat přijme zadaný řetězec z počátečního stavu, např.: ?- prijme(poc_stav, [1,0,1,1,1]). Prolog odpoví YES/NO 2. Dotaz, z kterých stavů lze přijmout zadaný řetězec: ?- prijme(Stav, [1,0,1,1,1]). Prolog vypíše všechny takové stavy. 3. Dotaz, které řetězce lze ze zadaného stavu přijmout, tedy např. ?- prijme(poc_stav, Vstup). vypíše všechny řetězce, které automat přijímá. 3. Použití automatu
Implementace konečného automatu v Prologu Automat Mealyho typu (tj. s výstupem při přechodu) jednoduše zrealizujeme úpravou přechodové funkce: delta(stav1, vstup, stav2):- write(‘Vystup BLA BLA’). Moorův automat provádí výstup ve stavech, je tedy třeba definovat tuto výstupní funkci pro každý stav vystup(stav1) :- write(‘Vystup BLA BLA’). vystup(stav2) :- write(‘Vystup2 BLA BLA’).... a zajistit její zavolání při navštívení stavu úpravou chování automatu: Výstup umístíme na první místo do prvního pravidla, které se nalezne při požadavku na přijetí řetězce, čímž zajistíme, že se vždy provede výstup, jakmile se dostaneme do příslušného stavu, tedy prijme(Stav, []) :- vystup(Stav), koncovy(Stav). 3. Automaty s výstupem
Implementace konečného automatu v Prologu Jako příklad si uvedeme automat na kávu, který přijímá mince 1 Kč, 2 Kč, 5 Kč a káva stojí 5 Kč. Výstupem automatu je množství vrácených peněz. Automat si nadefinujeme tabulkou (pro lepší pochopení funkce doporučujeme si automat překreslit graficky). Počáteční stav je označen šipkou a koncový stav je tučný. Příklad: automat na kávu – zadání
Implementace konečného automatu v Prologu Příklad: automat na kávu – tabulka přechodů StavVstup (Kč)Nový stavVýstup Q01Q1 Q0Q02Q2 Q05Q5Dávám kávu, vracím 0 Kč. Q11Q2 Q12Q3 Q15Q5Dávám kávu, vracím 1 Kč. Q21Q3 Q22Q4 Q25Q5Dávám kávu, vracím 2 Kč. Q31Q4 Q32Q5Dávám kávu, vracím 0 Kč. Q35Q5Dávám kávu, vracím 3 Kč.
Implementace konečného automatu v Prologu Příklad: automat na kávu– tabulka přechodů StavVstup (Kč)Nový stavVýstup Q41Q5Dávám kávu, vracím 0 Kč. Q42Q5Dávám kávu, vracím 1 Kč. Q45Q5Dávám kávu, vracím 4 Kč.
Implementace konečného automatu v Prologu delta(q0,1,q1). delta(q0,2,q2). delta(q0,5,q5) :- write('Davam kavu, vracim 0 Kc.'). delta(q1,1,q2). delta(q1,2,q3). delta(q1,5,q5) :- write('Davam kavu, vracim 1 Kc.'). delta(q2,1,q3). delta(q2,2,q4). delta(q2,5,q5) :- write('Davam kavu, vracim 2 Kc.'). delta(q3,1,q4). delta(q3,2,q5) :- write('Davam kavu, vracim 0 Kc.'). delta(q3,5,q5) :- write('Davam kavu, vracim 3 Kc.'). delta(q4,1,q5) :- write('Davam kavu, vracim 0 Kc.'). delta(q4,2,q5) :- write('Davam kavu, vracim 1 Kc.'). delta(q4,5,q5) :- write('Davam kavu, vracim 4 Kc.'). koncovy(q5). prijme(Stav, []) :- koncovy(Stav). prijme(Stav1, [X|Zbytek]) :- delta(Stav1,X, Stav2), prijme(Stav2,Zbytek). Příklad: automat na kávu – program v Prologu
Implementace konečného automatu v Prologu U konkrétních automatů je možné program rozšířit o další vhodnou funkcionalitu, např. u automatu na kávu bychom mohli ošetřovat situace, kdy je vhozena nedovolená mince, upozornit, že mince nestačily na vydání kávy a vypsat finanční rozdíl, atd... Příklad: automat na kávu – další možnosti