Podręcznik
1. Pojęcia podstawowe
1.3. Język
Zbiór wszystkich słów nad ustalonym alfabetem V oznaczamy symbolem V* a dowolny niepusty podzbiór L tego zbioru nazywamy językiem. Do zbioru V* zaliczamy również słowo puste (oznaczane na ogół symbolem ε). Słowo puste ma długość 0. Zbiór V* jest oczywiście nieskończony ale przeliczalny, mamy bowiem
V* = {ε} ∪ V ∪ V2 ∪ ... ∪ Vn ∪ ...
W zbiorze V* definiujemy działanie dwuargumentowe  V* × V* → V* tzw. konkatenację (ang. concatenation). Jeśli α, β ∈ V* i α = a1a2...an β = b1b2...bn to z definicji mamy
 V* × V* → V* tzw. konkatenację (ang. concatenation). Jeśli α, β ∈ V* i α = a1a2...an β = b1b2...bn to z definicji mamy
a  b = a1a2...an
 b = a1a2...an  b1b2...bn
 b1b2...bn  a1a2...anb1b2...bn
  a1a2...anb1b2...bn
Jak widać konkatenacja jest zestawianiem słów np. ala konkatenowane z makota daje alamakota, podobnie kot z let daje kotlet.
Jak łatwo sprawdzić działanie konkatenacji jest łączne, tzn. dla każdego  α, β, γ ∈ V* mamy (α  β)
 β)  γ = α
 γ = α  (β
 (β  γ). Mamy ponadto dla każdego α ∈ V*; α
 γ). Mamy ponadto dla każdego α ∈ V*; α  ε = ε
 ε = ε  α = α  zatem słowo puste ε jest jedynką działania
 α = α  zatem słowo puste ε jest jedynką działania  : V* × V* → V*. Inaczej mówiąc konkatenacja ze słowem pustym dowolnego słowa α ∈ V* nie zmienia tego słowa. Zbiór ∈ V* z działaniem konkatenacji
: V* × V* → V*. Inaczej mówiąc konkatenacja ze słowem pustym dowolnego słowa α ∈ V* nie zmienia tego słowa. Zbiór ∈ V* z działaniem konkatenacji  : V* × V* → V jest więc monoidem (czyli półgrupą z jednością).
: V* × V* → V jest więc monoidem (czyli półgrupą z jednością). 
Widać natychmiast, że konkatenacja na ogół nie jest działaniem przemiennym w V*, ale zawsze jest działaniem łącznym, tzn. na ogół x  y ≠ y
 y ≠ y  x  dla x, y ∈ V*, ale zawsze tzn. dla każdego x, y, z ∈ V*, mamy:
 x  dla x, y ∈ V*, ale zawsze tzn. dla każdego x, y, z ∈ V*, mamy:
Język to dowolny podzbiór zbioru V*. Podzbiór ten można definiować na wiele sposobów np. za pomocą wyrażeń regularnych, notacją Backusa-Naura, gramatyką, automatem skończonym itd.. Wszystkie te sposoby poznamy w dalszym ciągu. Istnieje również wiele typów języków m.in. języki regularne, języki bezkontekstowe itd.
Złożeniem dwóch języków K i L, gdzie K, L ⊂ V* nazywamy język
KL  { x, y ∈ <em>V<sup>*</sup></em>;<em> </em>x, <em>y</em> ∈ <em>K</em> oraz <em>y</em> ∈ <em>L</em>}
 { x, y ∈ <em>V<sup>*</sup></em>;<em> </em>x, <em>y</em> ∈ <em>K</em> oraz <em>y</em> ∈ <em>L</em>}
Potęga języka. Potęgę L* języka definiujemy indukcyjnie następująco
L0  {ε}, L1
 {ε}, L1  L,  L2
 L,  L2  LL, Ln+1
 LL, Ln+1  LLn, ...
 LLn, ... 
Potęga liter. Potęgę liter definiujemy indukcyjnie następująco. Niech a będzie dowolną ustaloną literą a ∈ V* wówczas a0  {ε}, a1
 {ε}, a1  a, a2
 a, a2  aa, ..., an+1
 aa, ..., an+1  aan, ...
 aan, ... 
Potęga słów. Potęgę słów definiujemy indukcyjnie następująco. Niech w będzie dowolnym ustalonym słowem, w ∈ V*, wówczas w0  {ε}, w1
 {ε}, w1  w, w2
 w, w2  ww, ..., wn+1
 ww, ..., wn+1  wwn, ...
 wwn, ... 
Domknięcie języka (gwiazdeczka Kleen'a) L*. Niech V będzie ustalonym alfabetem a L językiem L ⊂ V*. Domknięciem języka L nazywamy zbiór L* ⊂ V*, gdzie