str. 20
S0 S1
0 1
S0 S2
Λ
1 S1 0
S0 S2
0, 1 S1 0, 1
S0 S2
a, b, c
a, b, c S1 b
7. Wstęp do języków regularnych 7.1. Trochę teorii
Alfabetem nazywamy dowolny skończony zbiór symboli (np. 1={0,1}, 2={a,b,c})
Słowem nad alfabetem nazywamy dowolny skończony ciąg symboli alfabetu (np. nad 1: A=01, nad 2: B=abbbcb,).
Długością słowa nad alfabetem nazywamy liczbę symboli alfabetu tworzących dane słowo (np. |A|=|01|=2).
Słowem pustym (ozn. Λ) nazywamy słowo o długości 0, tzn. słowo, w skład którego nie wchodzi żaden symbol alfabetu.
Słownikiem (domknięciem alfabetu) nazywamy zbiór wszystkich słów jakie można utworzyć nad danym alfabetem.
Słownik nad alfabetem oznaczamy przez * (np. 2*={ Λ, a, b, c, aa, ab, ac, ba, bb, bc, ca, cb, cc, aaa, …, baba, …}) Językiem formalnym nad alfabetem nazywamy dowolny podzbiór * (przykłady języków formalnych nad alfabetem
1: L1={1, 10, 100, …}, L2={Λ,10, 1010, 101010, …} , L3={00, 01, 10, 11}; przykłady języków formalnych nad alfabetem 2: L4={ab, bb, cb, aba, abb, …}, L5={ab, aabb, aaabbb, …}).
Językiem regularnym nazywamy język formalny generowany przez automat skończony lub wyrażenie regularne. Języki regularne to najprostsza klasa języków formalnych w hierarchii Chomsky’ego.
7.2. Automaty skończone
Automatem skończonym nazywamy model matematyczny, umożliwiający opisanie algorytmu decyzyjnego w skończonej liczbie kroków. Opisując automat wskazujemy: alfabet , zbiór stanów głowicy Q (z wyróżnionym stanem początkowym S0 i zbiorem stanów końcowych F) oraz funkcję 𝛿: 𝑄 × Σ → 𝑃(𝑄), która opisuje związek między symbolami a stanami.
Automat skończony składa się z:
- taśmy na której jest umieszczone konkretne słowo,
- głowicy, która może zmienić swój stan i przesunąć się w prawo,
- układu sterującego ruchy głowicy (wspomniana funkcja δ, opisana grafem lub tabelą).
Powiemy, że automat akceptuje słowo, gdy głowica zaczynając ruch od stanu początkowego (ozn. ), po całkowitym wczytaniu słowa, przejdzie jakąś drogą do jednego ze stanów końcowych (ozn. ). Piszemy wówczas, że 𝐴 ∈ L(𝑀).
Jeżeli wszystkie słowa danego języka (i tylko one) są akceptowane przez automat M to mówimy, że M generuje język L (ozn. L=L(M)).
Przykłady:
L1={1, 10, 100, …} – zbiór słów nad alfabetem 1={0,1}, których pierwszym symbolem jest 1 po którym może wystąpić dowolna liczba symboli 0. Wszystkie słowa tego języka (i tylko one), są akceptowane przez poniższy automat M1:
M1 np. dla A=100:
L2={Λ,10, 1010, …} – zbiór słów nad alfabetem 1={0,1}, które składają się z dowolnej liczby powtórzeń słowa 10.
Wszystkie słowa tego języka (i tylko one), są akceptowane przez M2:
L3={00, 01, 10, 11} – zbiór słów nad alfabetem 1={0,1}, których długość wynosi 2. Wszystkie słowa tego języka (i tylko one), są akceptowane przez M3:
L4={ab, bb, cb, aba, abb, …} – zbiór słów nad alfabetem 2={a,b,c}, których drugim symbolem jest b. Język ten jest generowany przez automat M4:
S0
1 0 0
S1
1 0 0
S1
1 0 0
S1
1 0 0
str. 20
S0 S1
0 1
S0 S1
b Λ
a
S0
S2
Λ b
a S1 Λ
7.3. Wyrażenia regularne
Wyrażeniem regularnym nazywamy słowo utworzone nad Σ ∪ {∅, Λ,∗,∙, +, (, )} o jednej z poniższych postaci:
∅, 𝚲, 𝐱 ∈ 𝚺 𝐥𝐮𝐛 (𝐀)∗, (𝐀) ∙ (𝐁), (𝐀) + (𝐁), gdzie A, B są wyrażeniami regularnymi.
Wyrażenia regularne to wzorce opisujące języki regularne. Wzorce piszemy boldem. Jeżeli wyrażenie regularne A opisuje wszystkie słowa danego języka L (i tylko je), to piszemy: L=L(A).
Przykłady
L1={1, 10, 100, …} – zbiór słów nad alfabetem 1={0,1}, których pierwszym symbolem jest 1 po którym może wystąpić dowolna liczba symboli 0. Wzorcem słów tego języka jest A1= 10* (0* oznacza dowolną liczbę wystąpień symbolu 0).
Zatem język L1 jest generowany przez automat skończony M1 i przez wyrażenie regularne A1
L2 = {Λ,10, 1010, …} = L(M2) = L ((10)*)
L3 = {00, 01, 10, 11} = L(M3) = L((a+b)∙(a+b)) = L((a+b)2) L4 = {ab, bb, cb, aba, abb, …} = L(M4) = L((a+b+c)∙b∙(a+b+c)*)
L5 = {ab, aabb, aaabbb, …} – zbiór słów nad alfabetem 2={a,b,c} postaci anbn. Ten język nie ma swojego wzorca ani automatu skończonego. Sprawdzenie, czy słowo jest akceptowane przez automat wymaga „zapamiętania” ile było symboli a. Ten język nie jest regularny.
Uwaga – język L6 = L(a*b*) = { Λ, a, aa, aaa, … b, bb, … ab, abb, aab, …} jest różny od L5, ponieważ * oznaczać może każdorazowo inną liczbę. Automatem generującym język L6 (ale nie L5) jest automat M6:
L7 = L(a*+ b*) = { Λ, a, aa, aaa, aaaa, … b, bb, bbb, … } – w odróżnieniu od języka L6, język ten nie zawiera ani jednego słowa, które zawierałoby i symbole a i b. Automatem generującym ten język jest M7. Dodatkowo zbudowana jest tabela.
a b Λ
S0 S1, S2
S1 S1
S2 S2
Alfabet ={a,b}, (pamiętaj: Λ∉ Σ) Zbiór stanów Q={ S0, S1, S2}, F={ S1, S2} L8= {A ∈ Σ∗: A zawiera podsłowo abc} = {abc, aaabc, abbcccbcabcbb, … . }
M8 – automat niedeterministyczny
M8’ – automat deterministyczny zupełny (DAS)
a b c
S0 S0, S1 S0 S0
S1 S2
S2 S3
S3 S3 S3 S3
a b c
S0 S1 S0 S0
S1 S1 S2 S0
S2 S1 S0 S3
S3 S3 S3 S3
L1=L(M1) = L (10*)
a, b, c
a b c
b, c a
c a
b
a b c
a, b, c a, b, c