• No results found

Výukový program pro předmět Gramatiky a automaty

N/A
N/A
Protected

Academic year: 2022

Share "Výukový program pro předmět Gramatiky a automaty"

Copied!
72
0
0

Loading.... (view fulltext now)

Full text

(1)
(2)
(3)
(4)
(5)

Poděkování

Na tomto místě bych chtěl poděkovat panu Doc. Mgr. Ing. Václavu Zádovi CSc. za odborné vedení mé práce. Dále bych chtěl poděkovat studentům, kteří byli ochotni ujmout se testování aplikace a v neposlední řadě bych rád poděkoval mým přátelům, rodině a kolegům, kteří mě při tvorbě této práce i samotném studiu podporovali a motivovali.

Martin Sobotka

(6)

Abstrakt

Hlavním cílem této práce bylo seznámení se základní problematikou konečných automatů a regulárních gramatik, představení základních operací spojených s konečnými automaty, vyhodnocení moţnosti realizace operací pomocí výukové aplikace a samotná tvorba, odladění a prezentace vlastního řešení, které usnadní studentům předmětu „Gramatiky a automaty“

pochopení této problematiky.

Práce se dělí na dvě hlavní části, kdy první se zabývá teoretickým rozborem základních moţných operací na konečném automatu a mezi více konečnými automaty. Popisuje jednotlivé operace, které student bude potřebovat během studia předmětu a s kterými se setká ve výukovém programu. Ve druhé části na tento teoretický základ navazuje realizace samotné aplikace, kdy se uţivatel seznámí s jednotlivými částmi aplikace a jejich funkcí.

Výsledkem práce je aplikace v jazyce C#. Ta je vhodná ke znázornění výuky i k samostudiu studentů, kterým umoţňuje si ověřit a porovnávat jejich řešení. Aplikace byla se studenty průběţně prakticky testována a byl brán zřetel na jejich připomínky. Důraz je kladen na snadnou přístupnost funkcí a jednoduché ovládání. V aplikaci je dále přítomný server pro příjem poţadavků jiných zařízení. Kompletní výpis podporované funkcionality naleznete v příloze B.

Klíčová slova

Konečný automat, Výuková aplikace, C#, .NET

(7)

Abstract

The primary focus of this thesis was to familiarize with the elemental issues of finite automata and regular grammars, introduce fundamental operations connected with finite automata, evaluate possible realization of operations using the educational applications and creation, debug and presentation of my own solution, which makes it easier for the students of „Grammar and automatons“ to understand these issues.

The thesis is divided into two main parts, where the first concentrates on a theoretical analysis of possible elementary operations on the finite automaton and between more finite automata. It describes each operation, which student will need during the course and with which he will encounter in the educational application. In the second part on this theoretical basis is connected the realization of the application, where the user is familiarized with each part of the application and its function.

The result of this thesis is the application in the C# language. This application is suitable for the representation of the teaching and also for self-study for students to whom it enables a verification and comparison of their own solutions. Application was tested in practice together with the students and their comments were taken in consideration. Emphasis was given to the easy accessibility of the functions and on easy control. Furthermore, a server for receiving requests of other devices is present in the application. A complete list of supported functions can be found in attachment B.

Keywords

Finite automata, Educational application, C#, .NET

(8)

Obsah

Úvod ... 12

1 Konečné automaty ... 13

1.1 Formální jazyk ... 13

1.2 Konečný automat ... 13

1.3 Deterministický automat ... 14

1.4 (Zobecněný) nedeterministický automat ... 15

1.5 Znázornění konečného automatu ... 16

1.6 Vznik konečného automatu ... 18

1.7 Základní operace pro jeden automat ... 20

1.8 Základní operace pro dva (a více) automatů ... 27

2 Existující projekty ... 33

2.1 Webové aplikace ... 33

2.2 Automata editor ... 35

2.3 JFLAP ... 36

3 Aplikace ... 38

3.1 Uţivatelské prostředí ... 38

3.2 Rozbor vybraných částí kódu ... 48

3.3 Struktura ukládaných souborů ... 53

3.4 Poţadavky jiných zařízení ... 54

4 Závěr ... 58

Použitá literatura a zdroje informací ... 60

Přílohy ... 63

A Ukázkový příklad řešený aplikací ... 63

B Současná funkcionalita aplikace ... 68

C Hlavní obrazovka aplikace ... 69

D Zobrazení vzorců pro práci s regulárními rovnicemi ... 70

(9)

Seznam obrázků

Obrázek 1: Ukázka deterministického automatu ... 15

Obrázek 2: Ukázka nedeterministického automatu ... 16

Obrázek 3: Ukázka zakreslení stromem ... 17

Obrázek 4: Substituční pravidla regulárního výrazu ... 19

Obrázek 5: Automat z regulárního výrazu ... 19

Obrázek 6: Determinizace – vstupní automat A1 ... 20

Obrázek 7: Determinace – výsledný deterministický automat A2 ... 21

Obrázek 8: Minimalizovaný automat A2 ... 21

Obrázek 9: Automat A3 ... 22

Obrázek 10: Minimalizovaný automat A3 ... 24

Obrázek 11: Nenormovaný automat A3 ... 24

Obrázek 12: Úvod normalizace ... 25

Obrázek 13: Průběh normalizace ... 25

Obrázek 14: Normovaný automat A3 ... 25

Obrázek 15: Reverzovaný automat A2 ... 26

Obrázek 16: Negace automatu A2 ... 26

Obrázek 17: Automat A4 ... 27

Obrázek 18: Iterovaný automat A4 ... 27

Obrázek 19: Automat A5 ... 27

Obrázek 20: Automat A6 ... 27

Obrázek 21: Automat pro sjednocení A5 s A6 ... 29

Obrázek 22: Průnik automatů A6 s automatem z operace sjednocení ... 30

Obrázek 23: Zřetězení automatů A5 a A6 ... 32

Obrázek 24: Webový parser na serveru HackingOff ... 33

Obrázek 25: Nedeterministický automat a+b vygenerovaný serverem HackingOff ... 34

Obrázek 26: Deterministický automat a+b vygenerovaný serverem HackingOff ... 34

Obrázek 27: Program „Automata editor“ ... 35

Obrázek 28: Automata editor – první pokus studenta ... 36

Obrázek 29: JFLAP úvodní menu ... 36

Obrázek 30: JFLAP simulace průchodu slova ... 37

Obrázek 31: Redesignované GUI... 39

Obrázek 32: Vstup regulárním výrazem ... 40

Obrázek 33: Automat nový nebo zaloţený na exitujícím ... 41

(10)

Obrázek 34: Tabulkový editor přechodové funkce ... 41

Obrázek 35: Grafový editor ... 42

Obrázek 36: Komponenta pro textový výpis ... 43

Obrázek 37: Výstup grafem ... 43

Obrázek 38: Rozloţený graf... 44

Obrázek 39: Komponenta pro uloţené automaty ... 44

Obrázek 40: Operace na jednom automatu ... 45

Obrázek 41: Testování výrazů pro rozpoznání automatem ... 45

Obrázek 42: Změna abecedy automatu ... 46

Obrázek 43: Operace na dvou automatech ... 46

Obrázek 44: Výsledek ekvivalence ... 47

Obrázek 45: Operace na více automatech ... 47

Obrázek 46: GraphDisplay ... 52

Obrázek 48: Aplikace XmlTester ... 57

Seznam tabulek

Tabulka 1: Zápis konečného automatu tabulkou... 17

Tabulka 2: Determinizace – konstrukce podmnoţin ... 21

Tabulka 3: Determinizace – substituce ... 21

Tabulka 4: Počátek minimalizace ... 22

Tabulka 5: První průchod minimalizace ... 23

Tabulka 6: Rozdělení stavů po prvním průchodu minimalizace ... 23

Tabulka 7: Konečný výsledek minimalizace ... 23

Tabulka 8: Tabulka podmnoţinové konstrukce pro více automatů ... 28

Tabulka 9: Dořešení výstupů pro operaci sjednocení ... 28

Tabulka 10: Průnik automatů A5 a A6 ... 29

Tabulka 11: Průnik automatů ... 30

Tabulka 12: Neúspěšná ekvivalence (automaty A5 a A6) ... 31

Tabulka 13: Úspěšná ekvivalence ... 31

Seznam rovnic

Rovnice 1: Zápis automatu regulárními rovnicemi ... 17

(11)

Seznam zdrojových kódu

Zdrojový kód 1: Kořenový element XML ... 53

Zdrojový kód 2: Formát XML souboru ... 54

Zdrojový kód 3: Formát XML poţadavku ... 55

Zdrojový kód 4: Poţadavek REGEX ... 55

Zdrojový kód 5: Poţadavek ORIGIN ... 56

Zdrojový kód 6: Poţadavek EQUIVALENT ... 56

Zdrojový kód 7: Struktura XML odpovědi ... 56

Zdrojový kód 8: Ukázka odpovědi na chybný vstup ... 56

Seznam symbolů a zkratek

XML ... Extensible Markup Language (Rozšiřitelný značkovací jazyk) GUI ... Graphical User Interface (Grafické uţivatelské rozhraní) DKA ... Deterministický konečný automat

NKA ... Nedeterministický konečný automat ZNKA ... Zobecněný nedeterministický automat

(12)

Úvod

Tato práce si klade za cíl vytvořit jednoduše ovladatelnou, přehlednou výukovou aplikaci, která usnadní studium a pochopení konečných automatů. Problematika konečných automatů je nutná k pochopení navazujících problémů (jako příklad lze uvést překladače). Ne kaţdý je okamţitě schopen pochopit všechna základní znázornění, vyuţití či operace na deterministických a nedeterministických (zobecněných) automatech.

Existující aplikace, které byly nalezeny, se zaměřují zejména na grafické znázornění automatu spolu s ověřením vstupních slov, na akceptování či zamítnutí daným strojem – problematika se tak zabývá převáţně prací s grafem a vizualizací průchodu testovaného slova.

Méně častý je pak výskyt aplikací, které umoţní vytvořit automat pomocí regulárního výrazu.

Pokud uţ byla taková aplikace nalezena, nebyla volně dostupná, nebo nepodporovala základní operace na konečných automatech (s výjimkou převodu nedeterministického stroje na deterministický).

Nepodařilo se nalézt aplikaci, která by podporovala zadání (vytvoření) automatu více způsoby (tj. regulární výraz, tabulka přechodová funkce, graf), umoţnila automat znázornit standardními způsoby (tj, regulární rovnice, regulární gramatika, graf) a zároveň podporovala sadu základních operací uţívanou při výuce problematiky.

První část této práce si klade za cíl seznámit čtenáře s tím, co vůbec konečný automat je, představit jeho základní typy a podrobně vysvětlit všechny základní operace pro jeden a více strojů spolu s názornými příklady pro kaţdou z nich.

Následně bude představeno několik exitujících projektů a na základě jejich nedostatků a odlišností bude odvozeno, na co by se nová aplikace měla zaměřit.

Poté bude navazovat podrobný rozpis výsledného uţivatelského prostředí spolu s popisem funkcionality jednotlivých částí. Ten bude zaloţen na připomínkách a poţadavcích studentů, kteří se účastnili testování aplikace.

Dále bude popsáno vnitřní členění aplikace spolu s několika vybranými problémy interního kódu. V závěru praktické části bude podrobně popsána struktura souborů, se kterými aplikace pracuje. Na této struktuře bude stavět poslední bod aplikace, a to zasílání poţadavků z jiných zařízení, které uvedenou souborovou strukturu rozšíří o sekvence poţadavků a odpovědí.

(13)

1 Konečné automaty

Před vysvětlením samotného pojmu „konečný automat“ (v literatuře často uváděn pod zkratkou KA, v anglické FA nebo FSM – finite automata, finite state machine) je třeba se seznámit s několika základními pojmy, bez nichţ se student v předmětu neobejde. V této kapitole budu vycházet zejména ze znalostí získaných během studia předmětu Gramatiky a automaty s doc. Václavem Zádou (2012).

1.1 Formální jazyk

Formálním jazykem rozumíme množinu slov nad určitou abecedou znaků, v literatuře převáţně značenou Σ. Pro lepší představu uvaţujme abecedu obsahující dva symboly „a“ a „b“:

Σ = {a,b}. Slovo nad abecedou je pak libovolná kombinace těchto znaků, tedy např. „ab“,

„abb“, „abaaab“ atd. Neméně důleţitým pojmem je prázdné slovo, v této práci značené symbolem „e“ – jiné zdroje vyuţívají také „ε“ nebo „λ“. Prázdné slovo je takové slovo, které neobsahuje ţádný znak.

Ač je abeceda konečná mnoţina, jazyk jako takový konečný být nemusí. Jako jednoduchý příklad lze uvést jazyk, který rozpozná, ţe vstupem prošel alespoň jeden symbol „a“ – ve chvíli, kdy bude tato podmínka splněna, můţe pokračovat nekonečně dlouhá posloupnost libovolných znaků z abecedy. Délka slov tak nemusí být omezená shora.

Student se také často střetne se zápisem Σ* nebo Σ+. Σ* značí jazyk, který obsahuje všechna slova nad danou abecedou Σ. Σ+ odpovídá Σ*-e, tedy všechna slova nad danou abecedou Σ vyjma prázdného. Z toho vyplývá, ţe libovolný jazyk L nad abecedou Σ je podmnoţinou Σ*.

1.2 Konečný automat

Na základě předchozí podkapitoly lze konstatovat, ţe konečný automat je teoretický výpočetní model pro práci nad formálními jazyky. Automat se skládá z potřebného – konečného – mnoţství stavů, mezi kterými se přechází pomocí vstupních symbolů, znaků abecedy. Dále musí mít alespoň jeden vstup, výstup a musí být definována přechodová funkce mezi jednotlivými stavy, kdy existuje alespoň jedna cesta od vstupu na výstup.

(14)

Obecně lze konečný automat definovat jako uspořádanou pětici: (Q, Σ, δ, s, F), kde:

 Q (někdy značeno S) je konečná neprázdná mnoţina stavů v automatu;

 Σ je jiţ popsaná abeceda, tedy konečná neprázdná mnoţina vstupních symbolů;

 δ je přechodová funkce – ta popisuje pravidla pro přechod mezi jednotlivými stavy v automatu;

 s je počáteční stav, s ∈ Q;

 F je mnoţina výstupních stavů, F ⊆ Q.

Přechodová funkce a vstupní stav(y) mají u různých typů automatu rozdílné definice. Rozdíl deterministického a (zobecněného) nedeterministického automatu je popsán v následujících podkapitolách. Všechny ukázky automatů budou operovat s abecedou Σ = {a,b}.

Základním typům automatů Mealy a Moore se tato práce blíţe nevěnuje – jejich základní rozdíl spočívá v tom, v které době se přenáší hodnota na výstup, kdy v případě Mealyho automatu to je spolu s přechodem do stavu a v případě Moorova automatu aţ spolu se stavem.

1.3 Deterministický automat

Deterministický automat (DKA) je definován jako uspořádaná pětice (Q, Σ, δ, q0, F), kde:

 Q je konečná neprázdná mnoţina stavů v automatu;

 Σ je abeceda (konečná neprázdná mnoţina vstupních symbolů);

 δ je přechodová funkce;

 q0 je počáteční stav, q0 ∈ Q;

 F je neprázdná mnoţina výstupních stavů, F ⊆ Q.

Podstatné parametry pro deterministický automat jsou:

 právě jeden vstup;

 alespoň jedna cesta vedoucí ze vstupu automatu na jeho výstup;

o Pro účely aplikace je poţadováno, aby kaţdý automat měl alespoň jeden výstup, i kdyţ to není podmínkou obecné definice (kde můţe být výstupem i ∅). Automat bez výstupu by v současné podobě aplikace neměl pro studenty význam, je tak označován jako nevalidní.

 přechodová funkce Q × Σ → Q, tedy ţe kaţdým znakem abecedy Σ se automat přesune z aktuálního stavu do právě jednoho (jiného nebo stejného) stavu deterministického automatu.

(15)

Obrázek 1: Ukázka deterministického automatu

1.4 (Zobecněný) nedeterministický automat

Nedeterministický automat (NKA) je definován jako uspořádaná pětice (Q, Σ, δ, I, F), kde:

 Q je konečná neprázdná mnoţina stavů v automatu;

 Σ je abeceda (konečná neprázdná mnoţina vstupních symbolů);

 δ je přechodová funkce (podrobněji níţe);

 I je neprázdná mnoţina počáteční stav, I ⊆ Q;

 F je neprázdná mnoţina výstupních stavů, F ⊆ Q.

Nedeterministický automat se liší od deterministického definicí vstupního stavu, kdy nedeterministický automat má definovanou neprázdnou mnoţinu vstupních stavů (můţe tedy začínat v libovolném stavu mnoţiny I). Z této vlastnosti plyne další rozdíl, a to ţe v nedeterministickém automatu se najednou zkouší i větší mnoţství cest. Pro splnění výstupu pak stačí, kdyţ se automat dostane ze vstupního do výstupního stavu alespoň jednou z těchto cest.

Podle přechodové funkce můţeme nedeterministické automaty dále rozdělit na nedeterministické a zobecněné nedeterministické. Nedeterministický automat můţe s jedním symbolem abecedy přecházet z jednoho stavu do mnoţiny dalších (oproti deterministickému, který přechází právě do jednoho). Navíc tato mnoţina můţe zůstat prázdná, tj. ţe se symbolem z jednoho stavu nepřechází do ţádného jiného. Přechodová funkce deterministického automatu se tak zapíše ve tvaru Q × Σ → P(Q), kde P(Q) je potenční mnoţina Q, tedy mnoţina všech podmnoţin mnoţiny Q (ostatní parametry viz výčet výše).

Zobecněný nedeterministický automat (ZNKA) přidává nedeterministickému automatu do přechodové funkce moţnost přejít i prázdným slovem. Přechodová funkce se pak zapíše ve tvaru: Q × (Σ ∪{e}) → P(Q), kde P(Q) je potenční mnoţina Q (ostatní parametry viz výčet výše). Samotný nedeterministický automat rozpoznává prázdné slovo, právě kdyţ I∩F. Přechod prázdným slovem u zobecněného nedeterministického automatu přidává jednu velmi důleţitou vlastnost. Pokud se automat dostane do stavu, z kterého vede do jiného stavu „e“ přechod, stav,

(16)

do kterého přechod vede, se ještě v tomto kroku stává aktivní. Takto lze přenést i výstup – pokud tedy automat obsahuje stav, z kterého vede prázdné slovo do výstupního stavu z mnoţiny F, bude automat i v tomto stavu ve výstupu (pozn. tyto vlastnosti platí i pro více „e“ přechodů za sebou).

Obrázek 2: Ukázka nedeterministického automatu

1.5 Znázornění konečného automatu

Existuje několik základních cest, jak konečný automat prezentovat.

1.5.1 Graf

Do grafu se zakreslují jednotlivé uzly reprezentující stavy automatu a orientované hrany (šipky) ohodnocené znaky z abecedy Σ (u zobecněného nedeterministického automatu i prázdným slovem) značící jednotlivé přechody. Označení vstupu se řeší jako šipka s volným začátkem bez označení, nebo s označením prázdného slova. Výstup se značí obdobně, šipkou vycházející z uzlu ven (volný konec), nebo dvojitou hranou stavu.

Ukázka zakreslení grafem je uvedena u deterministického a nedeterministického automatu výše (obrázky č.1 a č.2).

1.5.2 Strom

Strom se zapisuje od kořene, jehoţ hodnota reprezentuje stav vstupu, kdy se směrem dolů rozkreslují všechny přechody z daného stavu. Přechody jsou opět označeny příslušným znakem z abecedy Σ a vedou do následovníka (potomka). Následovník se dále větví stejným způsobem, pokud jiţ není rozepsán na jiném místě. V takovém případě se znovu nerozepisuje (značí se podtrţením). Vstupy a výstupy se mohou navíc opět znázornit šipkami jako v případě grafu.

(17)

Obrázek 3: Ukázka zakreslení stromem

1.5.3 Tabulka

Tabulkou lze zapsat přechodovou funkci automatu, kde sloupce označují symboly z abecedy Σ (a prázdného slova u zobecněného nedeterministického automatu) a řádky jednotlivé stavy.

Tabulka se pak vyplní pro kaţdý stav tak, ţe se do buňky vypíší stavy, do kterých se automat přechodem s daným symbolem dostane (u deterministického se jedná vţdy pouze o jeden stav).

Vstupy a výstupy se opět označí šipkami.

Tabulka 1: Zápis konečného automatu tabulkou Vstup /

výstup Stav Znaky abecedy Σ

„a“ „b“

vstup Q0 Q1 Q0

- Q1 Q2 Q0

výstup Q2 Q2 Q2

1.5.4 Regulární rovnice

Regulární rovnice se vytváří zvlášť pro kaţdý stav (jejich počet je tedy roven počtu stavů).

Je-li hrana ze stavu Q0 do stavu Q1 ohodnocena znakem „a“, zapíše se do rovnice stavu Q1

sčítanec „Q0a“. Následuje názorná ukázka:

Q0 = e +Q0b + Q1b Q1 = Q0a

Q2 = Q1a + Q2a + Q2b

Rovnice 1: Zápis automatu regulárními rovnicemi

(18)

Vstup se v tomto případě značí sčítancem prázdného slova. V předchozí ukázce je tak patrným vstupem stav Q0. Výstup sám o sobě ţádné speciální značení nemá, uţivatel musí vědět, který stav ho zajímá nebo ho nějakým způsobme dodatečně označit.

1.5.5 Regulární gramatika

Gramatika vyuţívá k zápisu přepisovací pravidla pro kaţdý stav. Rozdíl oproti zápisu regulárním výrazem spočívá v tom, ţe se v tomto případě ke stavu s operandem „|“ (or) vypíše, s jakým symbolem z abecedy Σ se sám přepíše na jiný stav. Zápis ukázkového automatu tedy bude vypadat takto:

Q0 = aQ1|bQ0

Q1 = aQ2|bQ0 Q2 = aQ2|bQ2|e

Rovnice 2: Zápis automatu regulární gramatikou

V případě gramatiky se nijak zvlášť neoznačují vstupní stavy automatu, ale k výstupním stavům se přidá „|e“. V příkladu je tedy patrným výstupem stav Q2.

1.6 Vznik konečného automatu

V předchozí kapitole je uvedeno, jak můţeme konečné automaty znázornit. Konečný automat můţeme vytvořit jakýmkoliv uvedeným způsobem, pokud známe jeho přechodovou funkci.

V následující podkapitole je uvedeno, jak vytvořit konečný automat z regulárního výrazu.

1.6.1 Automat z regulárního výrazu

V kapitole č.1.5.4 byly představeny regulární rovnice. Regulární rovnice popisují přechody mezi stavy, kdy průchod zadaného regulárního výrazu buď skončí ve výstupním stavu, pak patří do jazyka automatu, nebo ve výstupním stavu neskončí, a pak do jazyka nepatří. Pokud chceme naopak sestrojit konečný automat, který bude rozpoznávat zadaný regulární výraz, nejjednodušším algoritmem bude sestrojení zobecněného nedeterministického automatu podle tří základních substitučních pravidel:

(19)

1) r . s

2) r + s

3) r*

Obrázek 4: Substituční pravidla regulárního výrazu

V těchto pravidlech „r“ a „s“ odpovídají sekvencím znaků abecedy v regulárním výrazu, kdy se postupně rozepisují, dokud není vyuţit celý zadaný výraz (tzn. automat obsahuje pouze přechody pomocí znaků abecedy Σ ∪ e).

Obrázek 5: Automat z regulárního výrazu

Jako příklad je uveden zápis automatu „(a+b)a(a+b)*b*“. Jak můţete vidět z obrázku č.5, takto zakreslený automat je poměrně rozsáhlý a od pohledu je patrné, ţe minimálně některé přechody s prázdným slovem nejsou v tomto zobecněném nedeterministickém automatu zcela

(20)

potřebné. V následující kapitole je představeno několik základních algoritmů pro operace na jednom automatu počínaje determinizací, která nás nejen zbaví „e“ přechodů, ale zároveň udělá přechodovou funkci pro kaţdý stav a znak abecedy jednoznačnou.

1.7 Základní operace pro jeden automat

1.7.1 Determinizace automatu – algoritmus podmnožinové konstrukce

Deterministický a nedeterministický automat byly představeny v kapitolách č.1.3 a č.1.4.

Nyní je třeba se seznámit se základním algoritmem převodu (zobecněného) nedeterministického automatu na deterministický. Uvaţujme zobecněný nedeterministický automat A1:

Obrázek 6: Determinizace – vstupní automat A1 Determinizace bude probíhat následujícími kroky:

1. Vytvoření tabulky, kde řádky budou mnoţiny dostupných stavů a sloupce znaky abecedy Σ.

2. Jako mnoţinu dostupných stavů do prvního řádku dosadíme mnoţinu vstupů (tj. I) nedeterministického automatu a řádek označíme jako vstup.

3. Pro kaţdý symbol z abecedy Σ vytvoříme mnoţinu stavů, do kterých automat se symbolem přechází.

4. Pokud ţádná mnoţina stavů definující řádek neodpovídá mnoţině z předchozího kroku, přidáme tuto mnoţinu jako nový řádek.

5. Kroky 3 a 4 je třeba opakovat, dokud přibývají nové záznamy v tabulce.

6. Pokud mnoţina stavů definující řádek obsahuje některý stav z mnoţiny F (tj. výstupní stavy), označíme tuto mnoţinu (řádek) jako výstupní.

7. Mnoţiny symbolů nyní definují deterministický automat. Poté je můţeme substituovat novým znakem (většinou přidělujeme indexy podle definic řádků).

Tabulka podmnoţin automatu A1 a výsledný deterministický automat A2 tedy budou vypadat následovně:

(21)

Tabulka 2: Determinizace – konstrukce podmnoţin Vstup /

výstup

Mnoţina stavů

Znaky abecedy Σ

„a“ „b“

vstup {Q0} {Q0,Q1} {Q0} - {Q0,Q1} {Q0,Q1,Q2} {Q0} výstup {Q0,Q1,Q2} {Q0,Q1,Q2} {Q0,Q2} výstup {Q0,Q2} {Q0,Q1,Q2} {Q0,Q2}

Tabulka 3: Determinizace – substituce Substituce

Mnoţina Stav

{Q0} Q0

{Q0,Q1} Q1

{Q0,Q1,Q2} Q2

{Q0,Q2} Q3

Obrázek 7: Determinace – výsledný deterministický automat A2

1.7.2 Minimalizace

Jak je patrné z předchozího příkladu, automat A2 má jeden nadbytečný výstup. Oba výstupy by se daly zapsat pouze jako jeden stav. Automat tedy není minimální, tj. nemá nejmenší moţný počet stavů k realizaci dané úlohy. Algoritmus minimalizace deterministického automatu je výborně popsán například v přednášce z Vysoké školy báňské v Ostravě (Kot et al. 2007) – stavy se v něm rozdělí do podmnoţin, které budou reprezentovat nový výsledný automat.

Odeberou se tak zbytečné a nedosaţitelné stavy. Je tedy zřejmé, jak pro poslední automat A2 bude vypadat jeho minimalizovaná verze – pouze je nutné vynechat stav Q3:

Obrázek 8: Minimalizovaný automat A2

(22)

Pro snadnější pochopení zvolíme další, názornější příklad. Uvaţujme následující automat nad abecedou Σ = {a,b}:

Obrázek 9: Automat A3 Minimalizace bude probíhat následujícími kroky:

1. Rozdělíme mnoţinu stavů do dvou podmnoţin, kdy první se skládá ze všech stavů vyjma výstupních a druhá pouze z výstupních.

2. Pro kaţdý stav zjistíme, do jaké podmnoţiny s kaţdým znakem abecedy přechází.

3. Pokud v jedné podmnoţině nepřecházejí stavy byť s jedním symbolem do stejné podmnoţiny, podmnoţinu rozdělíme pro kaţdý unikátní typ přechodu.

4. S novým rozdělením opakujeme od bodu 2 tak dlouho, dokud v bodě 3 dochází k rozdělení alespoň jedné mnoţiny.

Ukaţme si algoritmus prakticky na automatu A3. Začneme rozdělením na podmnoţiny dle vstupů a výstupů.

Tabulka 4: Počátek minimalizace

Vstup/výstup Stav Skupina

vstup/výstup Q0

výstup Q4 I

- Q1

II

- Q2

- Q3

Nyní pro kaţdý stav v podmnoţině zjistíme, do které skupiny přechází.

(23)

Tabulka 5: První průchod minimalizace

Stav Skupina Přechod do mnoţiny se symbolem abecedy Σ

„a“ „b“

Q0

I II II

Q4 II II

Q1

II

II II

Q2 II I

Q3 I I

Z tabulky č.5 lze vidět, ţe podmnoţinu I uţ nemusíme dále dělit, protoţe se přechody pro všechny symboly abecedy Σ shodují. Situace je naprosto odlišná v podmnoţině II, kde budeme muset provést rozdělení rovnou na tři nové podmnoţiny. Lze pozorovat, ţe z trojice stavů Q1, Q2 a Q3 nemůţeme vybrat ani dva se stejnými přechody pro všechny znaky abecedy. Musíme proto vytvořit nové rozdělení skupin prezentované tabulkou č.6:

Tabulka 6: Rozdělení stavů po prvním průchodu minimalizace

Stav Skupina

Q0

I Q4

Q1 II

Q2 III

Q3 IV

Pokračujeme opět krokem č.2, tedy vyplněním přechodu stavů do podmnoţin. Nyní vidíme, ţe ţádná ze čtyř skupin jiţ další rozdělení nepotřebuje. Tabulka č.7 nám tedy zobrazuje zápis výsledného automatu A4, zobrazeného na obrázku č.10.

Tabulka 7: Konečný výsledek minimalizace

Stav Skupina Přechod do mnoţiny se symbolem abecedy Σ

„a“ „b“

Q0

I III II

Q4 III II

Q1 II IV I

Q2 III III IV

Q3 IV IV IV

(24)

Obrázek 10: Minimalizovaný automat A3

Mezi velmi časté otázky patří: „Co se stane v případě, kdy při inicializaci nemá mnoţina výstupů stejné přechody?“ Odpověď je jednoduchá – mnoţina výstupů se rozdělí také a automat bude mít více výstupních stavů. Pro takový příklad doporučuji navštívit stránku Old Dominion Univerzity (Toida 2013), ze které byl čerpán i předchozí příklad.

1.7.3 Normalizace

Normalizace se zabývá uvedením automatu do tzv. „normovaného tvaru“. Jedná se o předepsané označení stavů, kdy u deterministického automatu označíme počáteční stav nejniţším číslem (zpravidla 1 nebo 0 – tak jako v našem případě) a postupujeme postupně se symboly abecedy dle pořadí symbolů do dalších stavů. Pokud stav, kam jsme se symbolem přešli, není označen, přiřadíme mu další nejniţší moţné číslo. Takto postupujeme pro další stavy dle pořadí, dokud nejsou všechny stavy označeny.

Pokud bude mít automat 5 stavů, lze ho pojmenovat 5! způsoby. Normovaný tvar tak řeší problém výběru jednoznačného pojmenování stavů automatu a tím i přechodové funkce.

Připomeňme si (neminimalizovaný) automat A3:

(25)

Vstupní stav se označí jako Q0 (obrázek č.12) a stavy, kam lze přejít dle pořadí v abecedě, dalšími nejniţšími čísly (obrázek č.13). Zatím ale nejsou označeny všechny stavy, a proto se pokračuje od dalšího stavu v pořadí, tj. stavu Q1. Opět se postupně označí všechny stavy dle pořadí přechodů a nastane situace, kdy mají všechny stavy své označení – automat je v normovaném tvaru (obrázek č.14). Proto lze algoritmus ukončit, jinak by pokračoval přechody stavu Q2 atd.

Obrázek 12: Úvod normalizace Obrázek 13: Průběh normalizace

Obrázek 14: Normovaný automat A3

Další příklad převodu do normovaného tvaru lze nalézt např. v jiţ zmiňované přednášce doktora Kota (et al 2007).

1.7.4 Reverzace (zrcadlení)

Reverzace konečného automatu spočívá v otočení směru přechodové funkce. Pokud tedy automat přechází symbolem „a“ ze stavu Q0 do stavu Q1, po reverzaci bude symbolem přecházet z Q1 do Q0. Zároveň se v automatu prohodí vstupy a výstupy. Pokud původní automat rozeznával sekvence {abb,aabb,aaab,...}, zrcadlený automat bude rozeznávat sekvence {bba,bbaa,baaa,...}. Tato operace změní většinu deterministických automatů na nedeterministické.

(26)

Obrázek 15: Reverzovaný automat A2

1.7.5 Negace (doplněk)

Negací automatu budeme v této práci zamýšlet jeho doplněk, tedy komplementární záměnu jeho výstupů – tj. stavy, které výstupními nebyly, nově budou, ale naopak stavy, které výstupem byly, nadále nebudou. Automat, který původně rozpoznával jazyk L, bude po této operaci rozpoznávat Σ*-L. Operace neovlivní typ automatu.

Obrázek 16: Negace automatu A2

1.7.6 Iterace

Iterace automatu, operátor „*“, vede na jeho opakované provedení. Pokud by automat rozpoznával pouze sekvenci „ab“ (automat A4, obrázek č.17), po iteraci by se rozeznávaná sekvence změnila na „(ab)*“ (obrázek č.18), tj. automat by nyní rozeznával i nekonečně dlouhou sekvenci „abababab...“. Nejjednodušší způsob, jak iterace dosáhnout, je vytvořit zobecněný nedeterministický automat, který k původnímu automatu přidá „e“ přechod z výstupního do vstupního stavu.

(27)

Obrázek 17: Automat A4 Obrázek 18: Iterovaný automat A4

1.8 Základní operace pro dva (a více) automatů

1.8.1 Podmnožinová konstrukce množinových operací a ekvivalence

Před uvedením samotných základních mnoţinových operací, které lze s automaty provádět (tj. sjednocení, průnik a rozdíl), objasníme algoritmus podmnoţinové konstrukce pro více automatů. Algoritmus bude probíhat stejně jako algoritmus vyuţitý k determinizaci automatu popsanému v kapitole č.1.7.1 pouze s tím rozdílem, ţe tentokrát se vytváří mnoţina dostupných stavů (tj. nové řádky tabulky) ze všech automatů účastnících se operace. Následuje elementární příklad pro operaci mezi dvěma automaty A5 a A6 (další se mohou přidat analogicky):

Obrázek 19: Automat A5 Obrázek 20: Automat A6

Z grafu je patrné, ţe konečný automat A5 rozeznává sekvenci „aa“ a automat A6 „a+b“.

Tabulka přechodové funkce pak bude vypadat následovně (pozn. věnujte pozornost faktu, ţe automat A6 má stavy označené apostrofem):

(28)

Tabulka 8: Tabulka podmnoţinové konstrukce pro více automatů Vstup /

výstup Mnoţina stavů Znaky abecedy Σ

„a“ „b“

vstup {Q0,Q0‘} {Q1,Q1‘} {Q3,Q1‘}

? {Q1,Q1‘} {Q2,Q2‘} {Q3,Q2‘}

? {Q3,Q1‘} {Q3,Q2‘} {Q3,Q2‘}

? {Q2,Q2‘} {Q3,Q2‘} {Q3,Q2‘}

? {Q3,Q2‘} {Q3,Q2‘} {Q3,Q2‘}

Vstup se jako inicializační mnoţina oproti algoritmu pro jeden automat nezměnil. Rozdílně se ale v závislosti na operaci zpracují výstupy vzniklého automatu. Tabulku přechodové funkce tak ponechme v tuto chvíli bez výstupů, postupně bude doplněna u kaţdé operace.

1.8.2 Sjednocení

Sjednocením dvou či více automatů získáme automat rozpoznávající jazyk tvořený sjednocením jazyků původních automatů. To znamená, ţe pokud vstupní výraz nějaký automat rozpozná, rozpozná ho i automat, který byl vytvořen jeho sjednocením s jiným. Pokud mají automaty vstupující do operace rozdílné abecedy, pak i abeceda Σ výsledného automatu odpovídá sjednocení jednotlivých vstupních automatů.

Dořešení příkladu pro operaci sjednocení tedy výstupy nastaví následovně:

Tabulka 9: Dořešení výstupů pro operaci sjednocení Vstup /

výstup Mnoţina stavů Znaky abecedy Σ

„a“ „b“

vstup {Q0,Q0‘} {Q1,Q1‘} {Q3,Q1‘}

výstup {Q1,Q1‘} {Q2,Q2‘} {Q3,Q2‘}

výstup {Q3,Q1‘} {Q3,Q2‘} {Q3,Q2‘}

výstup {Q2,Q2‘} {Q3,Q2‘} {Q3,Q2‘}

- {Q3,Q2‘} {Q3,Q2‘} {Q3,Q2‘}

(29)

Obrázek 21: Automat pro sjednocení A5 s A6

1.8.3 Průnik

Průnikem dvou či více automatů získáme automat rozpoznávající jazyk tvořený průnikem jazyků původních automatů. Tedy – vstupní výraz musí rozpoznat všechny automaty vstupující do operace, následně ho rozpozná i automat výsledný. Pro abecedy platí totéţ, co u operace sjednocení, tj. abeceda Σ výsledného automatu je sjednocením abeced všech automatů vstupujících do operace.

Tabulka 10: Průnik automatů A5 a A6

Průnikem automatů můţe být i ∅ – takový automat sice můţe existovat, nicméně nesplňuje omezení daná výukovým programem. Automat bez výstupu nedává pro výuku smysl, a proto je nyní označován jako nevalidní.

Jak je z tabulky č.10 patrné, jedná se i o případ našeho původního příkladu. Jako validní příklad tak bude uveden průnik automatu A6 spolu s automatem, který byl vytvořen u operace sjednocení:

Vstup /

výstup Mnoţina stavů Znaky abecedy Σ

„a“ „b“

vstup {Q0,Q0‘} {Q1,Q1‘} {Q3,Q1‘}

- {Q1,Q1‘} {Q2,Q2‘} {Q3,Q2‘}

- {Q3,Q1‘} {Q3,Q2‘} {Q3,Q2‘}

- {Q2,Q2‘} {Q3,Q2‘} {Q3,Q2‘}

- {Q3,Q2‘} {Q3,Q2‘} {Q3,Q2‘}

(30)

Tabulka 11: Průnik automatů

Obrázek 22: Průnik automatů A6 s automatem z operace sjednocení

1.8.4 Rozdíl

Pro vyjádření rozdílu vyuţijeme výrokové logiky a přepíšeme zápis rozdílu „L1-L2“, kde L jsou jazyky rozpoznávané danými automaty do tvaru „L1∩(-L2)“. Z tohoto zápisu je jiţ patrné, jak budeme postupovat. Provedeme negaci automatu rozpoznávajícího jazyk L2 a následně provedeme operaci průniku. Jelikoţ všechny potřebné operace jiţ byly vysvětleny, není nutné uvádět nový příklad.

Vstup /

výstup Mnoţina stavů Znaky abecedy Σ

„a“ „b“

vstup {Q0,Q0‘} {Q1,Q1‘} {Q2,Q1‘}

výstup {Q1,Q1‘} {Q3,Q2‘} {Q4,Q2‘}

výstup {Q2,Q1‘} {Q4,Q2‘} {Q4,Q2‘}

- {Q3,Q2‘} {Q4,Q2‘} {Q4,Q2‘}

- {Q4,Q2‘} {Q4,Q2‘} {Q4,Q2‘}

(31)

1.8.5 Ekvivalence

Dva automaty jsou ekvivalentní, právě tehdy kdyţ rozpoznávají stejný jazyk L (tzn. rozpoznávají stejná slova). Ekvivalence se taktéţ zjišťuje pomocí algoritmu podmnoţinové konstrukce. Podmínka je následující: pokud je ve výstupním stavu jeden z analyzovaných automatů, musí být ve výstupním stavu i druhý automat. Pokud tato podmínka neplatí, pak automaty nejsou ekvivalentní.

Tabulka 12: Neúspěšná ekvivalence (automaty A5 a A6)

Jak je patrné z původního příkladu, automaty A5 a A6 nejsou ekvivalentní. Tento fakt je zjištěn jiţ u druhé vkládané mnoţiny a algoritmus vytváření tabulky by nemusel dále pokračovat. Jako ukázku ekvivalentních automatů pouţijeme ukázky deterministického automatu spolu s ukázkou determinizace. Pro připomenutí grafy:

Tabulka 13: Úspěšná ekvivalence

Ekvivalence Mnoţina stavů Znaky abecedy Σ

„a“ „b“

vyhovující {Q0,Q0‘} {Q1,Q1‘} {Q3,Q1‘}

NEEKVIVALENTNÍ {Q1,Q1‘} {Q2,Q2‘} {Q3,Q2‘}

... {Q3,Q1‘} {Q3,Q2‘} {Q3,Q2‘}

... {Q2,Q2‘} {Q3,Q2‘} {Q3,Q2‘}

... {Q3,Q2‘} {Q3,Q2‘} {Q3,Q2‘}

Ekvivalence Mnoţina stavů Znaky abecedy Σ

„a“ „b“

vyhovující {Q0,Q0‘} {Q1,Q1‘} {Q0,Q0‘}

vyhovující {Q1,Q1‘} {Q2,Q2‘} {Q0,Q0‘}

vyhovující {Q2,Q2‘} {Q2,Q2‘} {Q3,Q2‘}

vyhovující {Q3,Q2‘} {Q2,Q2‘} {Q3,Q2‘}

(32)

1.8.6 Zřetězení (součin)

Zřetězení značí poskládání automatů za sebe do série. To zrealizujeme velmi jednoduše – přivedeme výstupy předchozího automatu na vstup následujícího.

Pro naše ukázkové automaty A5 a A6 tak vznikne nový automat, který rozpoznává jazyk L=L(A5).L(A6) = L(A5.A6) – tedy pro náš příklad jazyk L rozpoznávající slovo „aa(a+b)“.

Obrázek 23: Zřetězení automatů A5 a A6

Tím byly shrnuty všechny základní operace pro jeden a více automatů, které byly nalezeny v materiálech českých vysokých škol (Barták 2013; Češka 2014; Dostál 2008; Kocur 2000;

Kot at al. 2007; Záda 2012). Nyní bude pozornost zaměřena na jiţ realizovaná řešení.

(33)

2 Existující projekty

Neţ se začneme zabývat samotnou aplikací, je důleţité se seznámit s jiţ existujícími projekty, které danou problematiku zpracovávají. Pro vyhledání existujících projektů bylo vyuţito standardních vyhledávačů (př. Google), databáze (př. Science Direct) a v neposlední řadě interní vyhledávače stránek, které uchovávají veřejně dostupné programy s otevřeným zdrojovým kódem (př. Sorceforge.net či CodePlex). V této kapitole jsou zmíněny tři projekty – přesněji – dva konkrétní projekty a jeden typový příklad.

2.1 Webové aplikace

Na internetu se vyskytuje řada projektů, které se zabývají převodem regulárního výrazu na nedeterministický automat – případně vygenerovaný nedeterministický automat dále převedou na deterministický. Jako ukázkový projekt v tomto bodě zmíníme webovou aplikaci na serveru HackingOff (2012).

Obrázek 24: Webový parser na serveru HackingOff

Z webových aplikací, které byly během tvorby práce vyhledány, má zřejmě nejpokročilejší parser a přehledné uţivatelské rozhraní. Tato aplikace vytvoří z regulárního výrazu nedeterministický automat a zároveň rovnou zobrazí i jeho deterministický ekvivalent. Bohuţel, jak je často u zahraničních projektů zvykem, u deterministických automatů nezobrazuje

„odpadní stav“, tj. stav, kde se schází nevalidní zadání, po kterých automat jiţ nemůţe v ţádném případě do výstupního stavu.

(34)

Na následujících obrázcích si názorně ukáţeme zadání z obrázku č.24, tj. výrazu „a+b“

(zapsáno syntaxí „a|b“, jak je zvykem ve většině případů zahraničních prací a projektů). Dále je potřeba zmínit, ţe sluţba generuje obrázky ve formátu *.svg, a u sloţitějšího zadání bychom zjistili, ţe generovaný výsledek není v minimálním tvaru.

Obrázek 25: Nedeterministický automat a+b vygenerovaný serverem HackingOff

Obrázek 26: Deterministický automat a+b vygenerovaný serverem HackingOff Jak je vidět z obrázku č.26, validní deterministický automat by v našem podání musel mít ještě stav Q3, který by pro znaky „a“ i „b“ cykloval a kam by se zároveň sbíhaly přechody

„a“ i „b“ ze stavů Q1 a Q2. Na jedné straně můţe být zápis bez těchto přechodů výrazně jednodušší a přehlednější, na stranu druhou můţe uţivatele zmást, kdy bude přechod marně hledat nebo na první pohled nepochopí problém. Proto bude v případě této práce volen druhý přístup, tj. kompletní zápis včetně „odpadního stavu“.

Funkcionalita serveru HackingOff však nekončí převodem regulárního výrazu na konečný automat. Dále se zde dá mimo jiné najít samotný převod nedeterministického stroje na deterministický (nedeterministický automat se pak zadává ve formátu JSON) a vytvoření automatu z gramatiky. Nebyla nalezena webová aplikace, která by podporovala více sluţeb, neţ tento zmíněný portál.

(35)

2.2 Automata editor

Obrázek 27: Program „Automata editor“

Automata editor (Kříţ 2010) byl nejlepší volně dostupný program, který se podařilo během práce nalézt. Je dostupný z webu sorceforge.net pod licencí GPLv2 a autorem je Čech – Milan Kříţ (FEL ČVUT).

Jedná se o vektorový editor, který podporuje i základní operace pro práci s automaty, navíc je moţné program rozšířit pomocí pluginů (tj. zásuvných modulů). Seznam operací i vizáţ prostředí je znázorněna na předchozím obrázku č.27.

Základním formátem pro uloţení jsou soubory *.tex, případně lze exportovat *.svg, *.eps,

*.gml nebo běţné obrázky formátu *.png či *.bmp. Volba formátu je tak velmi bohatá a přinejmenším zajímavá při psaní delších prací.

Při práci se studenty se bohuţel ukázalo, ţe program pro mnohé není tak pochopitelný (intuitivní), jak by se na první pohled mohlo zdát. Samotné zadání automatu zabere poměrně

(36)

dlouhý čas, navíc při práci s dvěma automaty (operace sjednocení a průnik) musí uţivatel jeden uloţit a následně u operace na druhém navolit cestu k danému souboru. To uţivatele zdrţuje, a pokud potřebuje udělat více neţ jednu operaci, můţe brzy mezi soubory ztratit přehled, nehledě na jejich nepříjemné rychlé nabývání.

Pro ilustraci přikládám na obrázku č.28, jak dopadla první snaha jednoho ze studentů při prvním otevření programu.

Obrázek 28: Automata editor – první pokus studenta

2.3 JFLAP

Posledním programem je JFLAP (2005). Jedná se o program vyvíjený od roku 1995 na Duke University (soukromá univerzita v Durhamu v americkém státě Severní Karolína) – jeho historie se však datuje jiţ od roku 1990, kdy vývoj započal na Rensselaer Polytechnic Institute (vysoká technická škola ve městě Troy v americkém státě New York).

JFLAP je taktéţ edukativní projekt, který je k dispozici pod Creative Commons Attribution- NonCommercial-ShareAlike 2.5 licencí. Projekt jiţ dávno přerostl oblast samotných konečných automatů a kromě této funkcionality nabídne Mealyho a Moorovy stroje, zásobníkové automaty, Turingovy stroje, práci s gramatikami atd. Více ukáţe úvodní výběrové menu programu:

Obrázek 29: JFLAP úvodní menu (převzato z: http://www.jflap.org/tutorial/fa/createfa/fa.html)

(37)

poskytne výborná webová dokumentace JFLAP Tutorial (2009). Nikde v dokumentaci ani tutoriálu se nepodařilo dohledat informace o moţnosti provedení operací více automatů (sjednocení, průnik atd.), coţ je vzhledem k rozsahu programu překvapující. Jedná se ale zjevně primárně o nástroj, který má zobrazovat jeden stroj a na něm ukázat, jak funguje.

Aplikace samotná je dostupná po vyplnění dotazníku, kde uţivatel musí vyplnit údaje jako je jeho univerzita nebo plánované uţití programu. Tento krok se poţaduje proto, aby univerzita mohla sledovat šíření a vyuţití programu. Na jiţ zmíněných stránkách programu lze nalézt informaci, ţe jen od roku 2005 získal program přes 480 000 zobrazení, je odkazován v několika publikacích a v roce 2007 se stal finalistou soutěţe „Premier Award for Excellence in Engineering Education Courseware“ vypsanou organizací „The National Engineering Education Delivery System“ (volně lze přeloţit jako: Cena o nejlepší výukový software vypsaná národní organizací pro zprostředkování technického vzdělání). Aktuálně se nachází ve verzi 7 a v dohledné době by měla být představena nová verze.

Obrázek 30: JFLAP simulace průchodu slova (převzato z:

http://www.jflap.org/tutorial/fa/createfa/fa.html)

Z výše uvedeného je patrné, ţe o aplikaci jako takovou je zájem. Přesto se mi nepodařilo najít aplikaci s jednoduchým ovládáním, která by umoţňovala efektivní práci s větším počtem konečných automatů.

(38)

3 Aplikace

V této kapitole se budeme zabývat samotnou vytvořenou aplikací. Díky studentům, kteří se podíleli na testování aplikace, bylo moţné její odladění. Významně se ujali testování od samotného počátku zejména: Bc. Jaroslav Jakoubě a Bc. Tomáš Košek.

Nejprve je nutné definovat, co se od výukové aplikace očekává. Samozřejmostí by mělo být snadno ovladatelné, intuitivní prostředí, které student pochopí pokud moţno bez dalšího vysvětlování. Díky tomu by měl odpadnout čas nutný ke školení v ovládání aplikace, který často není zanedbatelný. Student by měl být neustále informován, jaká data má k dispozici, a co nejjednodušeji by měl být schopen zjistit, co s nimi můţe dělat.

K samotným datům se pak váţe nutnost mít moţnost data jednoduše vloţit, editovat, zobrazit a případně uloţit, přenést a načíst. Aplikace by měla být pokud moţno snadno přenositelná.

Ideální stav tak můţe znamenat jeden soubor, který sebou můţe student přenášet na malém externím disku.

Práce tedy bude primárně zaměřena na:

 snadno ovladatelné uţivatelské prostředí;

 efektivní vkládání dat;

 přehledný výpis dat;

 rychle přístupné operace a funkce;

 přenositelnost.

Aplikace byla napsána v jazyce C# s frameworkem .NET, konkrétně verze 3.5. Program bude bez problémů fungovat na většině školních počítačů, které běţí převáţně na operačním systému Windows – majoritně verze 7, někde stále XP. Účast verze XP opodstatňuje zvolenou verzi frameworku 3.5 – z předchozí zkušeností víme, ţe verze 4 a novější občas působila problémy, přinejmenším bylo třeba doinstalovat aktualizaci rozhraní. Verze systému s posledním service packem (tj. balíkem aktualizací) by měla mít oficiální podporu verze 4, nicméně verzi 3.5 podporuje jiţ v základu.

Pro lepší moţnost vysvětlení fungování aplikace nejprve probereme uţivatelské rozhraní s jeho funkcemi a aţ poté se vrátíme k rozboru vnitřního fungování a členění programu.

3.1 Uživatelské prostředí

Původní návrh počítal s vlastními okny pro většinu funkcí, záhy se ale přišlo na nepraktičnost

(39)

s důrazem na udrţení co největšího mnoţství funkcí v hlavním okně aplikace. Toto řešení ale skrývalo další nebezpečí – hlavní okno by se díky tomu mohlo stát snadno nepřehledným a zejména při výskytu vícestupňových menu by uţivatel mohl marně hledat poţadované funkce.

Výsledkem tak je rozloţení v záloţkách, které obsahují samotnou ucelenou funkcionalitu.

Tyto záloţky nahradily více úrovňová menu a většinu samostatných oken funkcí. Uţivatelské rozhraní se tak dostalo do podoby, kterou společnosti s oblibou označují „just one click away“ – všechny ovládací prvky se nacházejí pouze jedno kliknutí od uţivatele.

Přes veškerou snahu popis nikdy nenahradí vizuální vjem, proto bude nejvhodnější uvést názorný snímek aplikace a v popisu pokračovat přímo na něm. Pro ukázku je k práci přiloţen i snímek jednoho okna z původního návrhu, který naleznete v příloze E.

Obrázek 31: Redesignované GUI

Uţivatelské rozhraní je moţné si podrobněji prohlédnout na obrázku v příloze C.

Zde v textu je obrázek nutný pro popis rozloţení.

V levé části obrázku č.31 je vidět část programu, která interně ukládá zpracované automaty a dovoluje s nimi pracovat dle přiděleného čísla. Jakkoliv je v aplikaci vytvořen či ze souboru nahrát konečný automat, je následně přidán do tohoto listu. V horní části jsou vidět tlačítka slouţící k načtení nebo uloţení do souboru spolu s dalšími moţnostmi, o kterých více ve vlastní podkapitole (č.3.1.3) věnované této komponentě.

Pravá část téhoţ obrázku se dělí na horní a dolní část s jednotlivými záloţkami. Dolní část se stará čistě o zobrazení vybraného automatu, v horní části najdeme záloţky týkající

(40)

se moţnosti vloţení nového automatu do programu spolu s panely pro ovládání jednotlivých operací na jiţ vloţených automatech. Bliţší popis následuje v dalších podkapitolách.

3.1.1 Vložení automatu do programu

Uţivatel má několik moţností, jak automat do programu vloţit (pozn. načtení ze souboru je věnována samostatná kapitola č.3.3). Konkrétně se jedná o vytvoření automatu z regulárního výrazu, zápisem přechodové funkce do tabulky nebo zakreslením automatu pomocí grafu.

Kaţdou z těchto moţností lze nalézt v samostatném panelu:

Automat z regulárního výrazu

Jak z regulárního výrazu vytvořit automat, je uvedeno v kapitole č.1.6.1. Proto zde není nutné zabývat se teorií, ale praktickou ukázkou samotného vstupu.

Obrázek 32: Vstup regulárním výrazem

Kromě zapsání samotného regulárního výrazu nabízí uţivateli komponenta moţnost zvolit abecedu, znak prázdného slova a zástupný symbol za jakýkoliv znak abecedy. Pro lepší představu, dle obrázku č.32, při pouţití symbolu Σ komponenta před zpracováním nahradí symbol zápisem „(a+b)“. U dvouprvkové abecedy se nejedná o tak velké zjednodušení, nicméně u abeced, které mají například čtyři a více znaků, ušetří uţivateli hodně psaní. V regulárním výrazu jsou standardně podporovány symboly „*“ pro iteraci a „+“ pro nebo (or).

Původně bylo moţné abecedu volit z jakýchkoliv symbolů. To se při testech neosvědčilo, a proto byla po konzultaci omezena pouze na písmena „a-z“ a „A-Z“. Uţivatel si také můţe zvolit výstupní tvar automatu. Jak je uvedeno v kapitole č.1.6.1 o vzniku automatu z regulárního výrazu, automat takto vzniklý bude nedeterministický. Málokdy ale uţivatel potřebuje pracovat s tímto nedeterministickým automatem, a proto je jako základní výstupní volba zvolena jako deterministický stroj, kdy komponenta rovnou zajistí převod nedeterministického stroje na deterministický a aţ ten pošle k uloţení. Ušetří se tak počet uloţených poloţek a zvýší se v nich přehlednost.

(41)

Automat zápisem přechodové funkce do tabulky

Další moţností je zapsat přechodovou funkci do tabulky. Tabulku můţeme vytvořit buď prázdnou nebo ji zaloţit na nějakém jiţ uloţeném automatu. Další informace jsou na obrázku záloţky, která se o vznik stará.

Obrázek 33: Automat nový nebo zaloţený na exitujícím

Z obrázku je patrné, ţe u nového automatu opět zvolíme abecedu a prázdné slovo. Spolu s tím zvolníme typ editoru, deterministický (DKA) nebo nedeterministický (NKA). To ovlivní vyvolaný editor – v závislosti na typu nám buď umoţní přechody pomocí prázdného slova a prázdná pole, nebo ne.

Obrázek 34: Tabulkový editor přechodové funkce

Na obrázku č.34 je znázorněna ukázka nedeterministického editoru, který byl vygenerován ze sloţitějšího automatu. Pro zmenšení ukázkového obrázku je ponechána část, která rozpoznává výraz „(a+b)a“. Jak je vidět, nedeterministický editor umoţňuje nechat některá pole prázdná, nebo naopak pouţít znak pro více neţ jeden přechod (přechod prázdného slova ze stavu Q0). Deterministický editor by neumoţňoval přechody prázdným slovem a pro kaţdé pole by byl vyţadován striktně jeden přechod. V pravém horním rohu je opět vidět výběrové menu výsledného typu, obdobně jako u zadávání regulárního výrazu.

(42)

Uţivatel má moţnost zadat regulární výraz, který automat rozpoznává. Toto pole není povinné, ale můţe usnadnit orientaci v uloţených strojích. Původ automatu je další moţný identifikátor, přednastavena je hodnota „Uţivatelský vstup“.

Při zadání poţadavku na uloţení je automat překontrolován pro základní nedostatky (chybí vstup, chybí výstup, neexistuje cesta ze vstupu na výstup), a pokud je některý z parametrů porušen, upozorní uţivatele bez uzavření editoru. Pokud automat projde kontrolou, je odeslán k uloţení a tím se mu přidělí globální identifikátor – editor se v tomto případě uzavře.

Okno editoru je vyvoláváno jako samostatné a neblokuje základní aplikaci. Uţivatel jich můţe mít otevřených dle své potřeby i více najednou.

Automat grafem

Poslední moţností vstupu je graf. Obrázek záloţky, která se stará o vytvoření editoru, není v tomto případě potřeba – byl by totoţný s ukázkou z předešlého vstupu. Pro jednoduchost je pouţita v základu stejná komponenta.

Obrázek 35: Grafový editor

Na obrázku č.35 je znázorněn grafový editor, který funguje podobně jako předchozí tabulkový editor. Uţivatel opět můţe zadat původ automatu a regulární výraz, přechody se tentokrát píší přímo mezi stavy. Navíc je přítomna spodní informační lišta, která uţivatele informuje o tom, jak s editorem zacházet dle navolené operace. Ke komponentě, která zajišťuje práci s grafem, se blíţe dostaneme v jedné z následujících kapitol.

3.1.2 Zobrazení automatu z programu

(43)

nebo vybere některý z uloţených k zobrazení, aplikace daný automat vypíše regulárními rovnicemi a gramatikou. K dispozici je i moţnost zobrazení grafem.

Výpis regulárními rovnicemi a gramatikou

Obrázek 36: Komponenta pro textový výpis

Automat se zobrazuje do pravé spodní části aplikace. Regulární rovnice i gramatika pouţívají stejnou komponentu, proto nám postačí jeden obrázek. Textový výpis zvýrazňuje vstupy a výstupy, vrchní informační část podává nejdůleţitější informace k danému automatu.

Na pravé straně najdeme moţnost uloţit výpis do schránky.

Vykreslení grafem

Obrázek 37: Výstup grafem

Pro výstup grafem je pouţita univerzální grafová komponenta, se kterou jsme se jiţ setkali při vkládání automatu grafem. Podrobněji se k této komponentě dostaneme v kapitole č.3.2.3.

Pro výstup je podstatné, ţe komponenta aktuálně nepodporuje automatické rozloţení.

Bylo vyzkoušeno několik algoritmů, výsledky ale nebyly zcela přesvědčivé a v určitých ohledech zcela vhodné. Po testech se studenty se od automatického rozloţení upustilo a přešlo se k jednoduchému manuálnímu rozloţení. V aktuální verzi je uţivatel vyzván, aby rozmístil daný počet stavů („nodů“). Kdyţ aplikace obdrţí poţadovaný počet bodů, rozmístí mezi ně přechody. Uţivatel pak můţe zobrazení resetovat (tj. zadat pro všechny nody nové pozice), nebo manuálně přemístit vrcholy a hrany grafu dle svého uváţení. Ve chvíli, kdy komponenta ztrácí focus (tj. uţivatel začne pracovat s jinou komponentou), aktuální rozloţení se uloţí.

(44)

Uţivatel tak při opětovném zobrazení automatu nemusí rozmisťovat nody znovu, ale automaticky se vyvolá uloţené rozloţení.

Informační část je totoţná jako u textového výpisu a přechodové hrany zde oproti vstupnímu editoru nelze upravovat. Rozloţený graf lze zhlédnout na následujícím obrázku.

Obrázek 38: Rozloţený graf

3.1.3 Interní ukládání

Obrázek 39: Komponenta pro uloţené automaty

Uloţené automaty uţivatel nalezne v levé části aplikace. Kaţdý má přidělen unikátní identifikátor (sloupec „#“), který ho identifikuje při zadávání operací. Dále je viditelný jeho typ, abeceda, prázdné slovo (první znak v závorce abecedy), původ a regulární výraz.

Dvojklikem je automat odeslán k zobrazení ve spodní pravé části aplikace (viz předchozí podkapitola). Také lze označit i více automatů a provést uloţení informací o nich do schránky, nebo kompletní automaty uloţit do souboru. Automaty lze ze souboru samozřejmě i načíst.

Pokud aplikace jiţ nějaké automaty obsahuje, je uţivatel dotázán, zda chce posunout identifikační čísla v původu automatů tak, aby odpovídala novým pozicím.

Dále má uţivatel moţnost nepotřebné automaty smazat nebo překrýt komponentu zobrazením vzorců, které se pouţívají při úpravě regulárních rovnic. Obrázek komponenty se vzorci je rozsáhlejší, a proto jej najdete v příloze D.

(45)

Operace na jednom automatu

Obrázek 40: Operace na jednom automatu

Komponenta pro operace na jednom automatu umoţňuje vybrat pomocí čísla uloţený automat a provést vybranou operaci. Operace byly představeny v kapitole č.1.7, a proto jim zde nebude věnován delší prostor. Komponenta pro operace obsahuje ale dvě další pomocné funkce a to: test výrazů a změnu abecedy na daném automatu.

Test výrazů

Obrázek 41: Testování výrazů pro rozpoznání automatem

První z přidaných funkcí je testování slov pro rozpoznání automatem. Uţivatel můţe zadat libovolný počet slov a okamţitě vidí, která jsou akceptována a která nejsou. Komponenta podporuje testování během psaní, pokud ji uţivatel ponechá aktivní. Jinak se testuje aţ při validaci buňky, tj při jejím opuštění.

Komponenta nijak neřeší abecedu testovaného automatu a nechá uţivatele zadat jakékoliv slovo. Pokud uţivatel do slova zadá znak, který není v abecedě, slovo samozřejmě bude zamítnuto. Viz obrázek č.41 a poslední řádek se znakem „c“ pro abecedu Σ = {a,b}.

Dovolíme si zde menší odbočku pro programátory – průběţného testování je dosaţeno pomocí interního časovače, který se spustí při začátku editace. Ten se v pravidelných intervalech pokouší udělat „dirty commit“ právě editované buňky a odeslat výraz k validaci.

(46)

Změna abecedy

Obrázek 42: Změna abecedy automatu

Moţnost manuální změny abecedy uţivatel ocení ve chvíli, kdy několik studentů pro jeden úkol zvolí různé abecedy a je třeba provést další operace, nebo přinejmenším provést test ekvivalence s kontrolním automatem (případně mezi sebou).

Změna abecedy se v aplikaci nevyskytuje pouze v manuální podobě, ale v některých částech probíhá úprava automaticky. Jako příklad lze uvést operace na dvou automatech, kdy do operace vstupují automaty s různými abecedami. O tomto problému více v další kapitole.

3.1.4 Operace na dvou automatech

Obrázek 43: Operace na dvou automatech

Tato komponenta se principiálně příliš neliší od předchozí zmiňované, tj. od komponenty zpracovávající operace pro jeden automat. Za upozornění stojí fakt, ţe u operací rozdíl a zřetězení záleţí výsledek na pořadí automatů. Operace ekvivalence nevytvoří nový automat – pouze zobrazí informační okno, zda jsou zadané automaty ekvivalentní či nikoliv. Popis všech operací je obsaţen v kapitole č.1.8.

Pokud výsledkem operace není validní automat (např. průnik automatů nemá výstup), aplikace uţivateli zobrazí varování spolu s textovým výpisem automatu, kterému ale nebude přidělen identifikátor a nebude v aplikaci uloţen pro další moţné operace.

References

Related documents

Cílem druhé části práce je vytvoření simulačního modelu dvojitého inverzního kyvadla, a fyzické kon- strukce dvojitého kyvadla, včetně bezdrátového

Jelikož byly všechny entity ukládány rovnou do výsledného pole, tak pokud první dlaždice měla například 15 entit, které jsem již uložil a druhá 10, při

Hyresvärden samordnar borttransport av avfall för flera hyresgästers verksamhet i fastigheten. Hyresgästen ska som tillägg till hyran till hyresvärden betala ersättning

Městský úřad v Lázních Bělohrad // Štěpán Mišurec Současná radnice a umístění nové stavby 5.. Ke stavbě nové radnice byly vybrány pozemky na severním

Výsledkem její práce je nyní úplný et zec metod, které vedou ke kompletní, v tšinou kvantitativní charakterizaci laserových

Navrhněte a realizujte program pro programovatelný automat Tecomat TC700, který bude obsluhovat semafory na modelu křižovatky virtuální úlohy Křižovatka..

Navrhněte a realizujte program pro programovatelný automat Tecomat TC700, který bude obsluhovat semafory na modelu křižovatky virtuální úlohy Šaldovo náměstí..

Na otázku, Jaký je třetí krok ošetření poranění o ostrý předmět uvedlo správnou variantu rána se dezinfikuje dezinfekčním prostředkem s virucidním účinkem