Množina je soubor prvků, chápaných jako celek. Může být určena výčtem prvků, který uzavřeme do složených závorek: {a,b,c}. Na pořadí prvků nezáleží a každý z nich je v množině jenom jednou. Další způsob zápisu nekonečných či hodně velkých množin je zvolení určité základní (univerzální) množiny a upřesňujících podmínek, které udávají charakteristickou vlastnost prvků množiny. Jednotlivé části se oddělí středníkem „;“ a vše se uzavře do složených závorek: M = {x ∈ D; ν(x)} Prázdnou množinu {} označujeme symbolem ∅.
Posloupnost na rozdíl od množiny určuje i pořadí prvků. Prvky se mohou opakovat, liší se vždy minimálně svým pořadím v posloupnosti. Posloupnost určujeme výčtem uzavřeným do kulatých závorek: (a,c,c). Podle počtu prvků je posloupnost uspořádaná dvojice, trojice,…, n-tice.
Posloupnost znaků nazýváme řetězec -slovo a zapisujeme jej bez kulatých závorek a bez oddělovače prvků. Jen jednotlivé prvky zapíšeme za sebe: aab.
Abeceda Σ je konečná množina znaků. Obvykle předpokládáme, že není prázdná. Prvky abecedy nazýváme znaky (symboly).
Slovo nad danou abecedou (v dané abecedě) je libovolně dlouhá, konečná posloupnost znaků (symbolů) z nějaké abecedy Σ.
Prázdné slovo „“ neobsahuje žádný symbol. Značí se ε
Příklad 1:
Abeceda: Σ = {a, b}
Příklady slov v abecedě Σ: abaab, baa, aa, ab
Příklad 2:
Abeceda: Σ = {0, 1}
Příklady slov v abecedě Σ: 110, 011, 101
Ve smyslu proměnných budou malá písmena ze začátku anglické abecedy (a, b, c,…) s případnými indexy představovat znaky zkoumané abecedy. Jako proměnné pro slova budeme obvykle používat malá písmena z konce abecedy (u, v, w, x, y, z).
Délka slova je počet znaků ve slově. Délku slova w označujeme |w|. Prázdné slovo ε má délku 0. To znamená, že |ε| = 0. Výrazem |w|a označujeme počet výskytů symbolu a ve slově w.
Příklad 1:
Slovo u = abaab, má délku |u| = 5.
Příklad 2:
Slovo u = abaab, má počet výskytů symbolu „a“ |u|a = 3.
Příklad 3:
Slovo εab má délku |εab| = 2.
Zřetězení slov u = a1a2…an a v = b1b2…bn označujeme u·v, a definujeme je
Symbol „·“ je možné vypouštět. Lze tedy napsat abb·ab = abbab. Zřetězením slov abb a ab vznikne slovo abbab.
Zřetězení je asociativní, tj. pro libovolná tři slova u, v a w platí
což znamená, že při zápisu více zřetězení můžeme vypouštět závorky a psát například
místo
Zřetězení není komutativní, tj. obecně pro dvojici slov u a v neplatí rovnost
Příklad:
Zjevně pro libovolná slova v a w platí:
Pro libovolné slovo w a ε také platí, že:
Množinu všech slov nad konečnou abecedou Σ (tvořených symboly z abecedy Σ) označujeme Σ*. Patří mezi ně také prázdné slovo ε. Množinu všech neprázdných slov v abecedě Σ* označujeme Σ+.
Množinu všech slov z abecedy Σ = {0, 1} bychom vypsali takto:
ε, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, 100, 101, 110, 111, 1000,…
Formální jazyk, stručně jazyk nad abecedou Σ, je libovolná množina slov v abecedě Σ, tedy libovolná podmnožina Σ*:
Počet slov jazyka L značíme svislicemi: |L|. Prázdný jazyk {} (neobsahující žádná slova) označujeme ∅. Platí pro něj, že má délku 0, což zapisujeme |∅| = 0. Jazyk obsahující pouze prázdné slovo {ε} má délku jedna, tj. platí |ε| = 1. Oba jsou jazyky nad jakoukoliv abecedou.
Množina všech slov nad konečnou abecedou je nekonečná. Slova v dané abecedě můžeme totiž přirozeně uspořádat: nejprve podle délky a v rámci stejné délky podle abecedy, tj. podle zvoleného uspořádání na prvcích abecedy. Tak jsou slova seřazena do jedné posloupnosti, ve které je lze po řadě očíslovat přirozenými čísly.
Poznámka: Problém ale je, že podle předchozí definice mají mít slova konečnou délku. Bývá uváděno, že slova mohou mít délku konečnou i když libovolně velkou. Zde je na místě odlišit množiny potenciálně nekonečné od aktuálně nekonečných.
Je výhodné (a velmi potřebné) mít možnost definovat složitější jazyk prostřednictvím dvou jednodušších a nějaké operace, která je spojí. Protože jsou jazyky definovány jako množiny, můžeme na to používat běžné množinové operace.
Poznámka: Při operacích nad jazyky předpokládáme, že jazyky, se kterými operaci provádíme, používají tutéž abecedu Σ. Pokud abecedy Σ1, Σ2 jazyků L1, L2; stejné nejsou, můžeme výsledný jazyk chápat jako jazyk s abecedou Σ1 ᑌ Σ2.
Sjednocení jazyků L1 ᑌ L2 je jazyk tvořený slovy, která patří buď do jazyka L1 nebo do jazyka L2 (nebo do obou).
Dále můžeme definovat nové operace speciálně pro práci s jazyky. Např. je to zřetězení jazyků (odvozené od zřetězení slov) či iterace (tedy opakované řetězení):
Zřetězení jazyků L1, L2 je jazyk L1 · L2 = {uv ; u∈L1, v∈L2}, jenž tedy obsahuje všechna slova, která lze rozdělit na dvě části, z nichž první je z jazyka L1 a druhá z jazyka L2. Jinak řečeno jazyk všech slov, která začínají slovem z L1 a pokračují slovem z L2.
Zřetězení jazyků L1 a L2 označujeme L1 · L2.
Příklad:
L1 = {abb, ba}
L2 = {a, ab, bbb}
Jazyk L1 · L2 obsahuje slova:
abb·a abb·ab abb·bbb ba·a ba·ab ba·bbb.
(Aby bylo možné pochopit na první pohled způsob, jakým byla slova utvořena,
nebylo u tohoto příkladu vynecháno označení zřetězení.) Více možností zřetězení
slov již není.
Operace zřetězení jazyků obecně není komutativní.
Například zřetězení jazyků L2 · L1
z předchozího příkladu obsahuje slova:
a·abb a·ba ab·abb ab·ba bbb·abb bbb·ba
Iterace jazyka L, značená L*, je jazyk všech slov, která lze rozdělit na několik částí, z nichž každá patří do jazyka L. Do L* zařazujeme ε (chápané jako zřetězení 0 slov). Iterace jazyka je tedy jazyk tvořený slovy vzniklými zřetězením všech slov z jazyka L.
Induktivní definice iterace pro libovolné k ≥ 0:
Iterace jazyka L je jazyk
L* = L0 ᑌ L1 ᑌ L2 ᑌ L3 ᑌ …,
kde
L0 = {ε},
Lk+1 = Lk · L pro k ≥ 0.
Pro snazší pochopení lze definici zapsat následujícím způsobem:
L* = {ε} ᑌ L ᑌ L2 ᑌ L3 ᑌ L4 ᑌ L5 ᑌ …,
kde
L2 = L · L
L3 = L · L · L
L4 = L · L · L · L
L5 = L · L · L · L · L
….
Operací iterace je definitivně matematicky zaveden jazyk jako aktuálně nekonečná množina.
Příklad 1: Pokud L = {aa, b}, pak L3
obsahuje slova:
aa·aa·aa aa·aa·b aa·b·aa aa·b·b b·aa·aa b·aa·b b·b·aa b·b·b
Příklad 2: L = {aa, b}
L* = {ε, aa, b, aaaa, aab, baa, bb, aaaaaa, aaaab, aabaa, aabb,…}
Zatímco Σ* je množina všech slov nad abecedou Σ, L* je množina všech slov v jazyce L. To znamená ne úplně všech slov, které je možné vytvořit v abecedě Σ, ale jenom těch, které lze sestavit v jazyce L. (V abecedě totiž, chceme-li, lze sestavit všechna slova v dané abecedě, v jazyce to již možné není.)
Podle definice zavede iterace L* do množiny slov jazyka prázdné ε slovo jako „zřetězení nula slov z L“. Zřetězením nula slov vznikne prázdné slovo ε také v prázdném jazyce
Jazyk coby množinu slov definujeme obvykle formálním zápisem. U konečných jazyků stačí tato slova vypsat, ale u jazyků s nekonečným počtem slov to nejde. Jeden ze způsobů jak zapsat nekonečný jazyk jsme si ukázali v předchozím textu. Je to pomocí iterace, která vytváří libovolně dlouhá slova jakéhokoliv jazyka.
Příklad:
L = ǀ* je množina slov (tedy jazyk) nad abecedou
Σ = {ǀ},
v jazyce jsou všechna slova nad touto abecedou skládající se pouze ze symbolů
ǀ a prázdného znaku ε:
L = {ε, ǀ, ǀǀ, ǀǀǀ, ǀǀǀǀ, ǀǀǀǀǀ, }
Další způsob zápisu nekonečných či hodně velkých jazyků je zápis pomocí množin. Uvede se formální předpis a po oddělovači (to je obvykle středník, svislice nebo dvojtečka) upřesňující podmínky jak mají vypadat slova jazyka. V zápisu často používáme proměnné, které určují vazbu mezi formálním předpisem a upřesňujícími podmínkami:
L = {anbn;n ≥ 0}.
L je v tomto případě množina všech slov nad abecedou Σ = {a, b} takových, že první polovina slova obsahuje pouze symboly a, druhá pouze symboly b a symbolů a a b je vždy stejný počet. To jest:
L = {ε, ab, aabb, aaabbb, aaaabbbb, }.
Proměnná, která váže formální předpis s upřesňujícími podmínkami je n.