Języki, automaty i obliczenia/Ćwiczenia 8: Dalsze algorytmy dla języków regularnych. Problemy rozstrzygalne: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
m Zastępowanie tekstu – „<math> ” na „<math>”
m Zastępowanie tekstu – „,...,” na „,\ldots,”
 
Linia 85: Linia 85:
Zauważmy, że jeśli do stanu <math>s_t</math> wchodzą strzałki prowadzące ze
Zauważmy, że jeśli do stanu <math>s_t</math> wchodzą strzałki prowadzące ze
stanów <math>s_{i_1}, s_{i_2}, ..., s_{i_n}</math> odpowiednio z etykietami
stanów <math>s_{i_1}, s_{i_2}, ..., s_{i_n}</math> odpowiednio z etykietami
<math>a_1, a_2,..., a_n</math> (i tylko takie), to
<math>a_1, a_2,\ldots, a_n</math> (i tylko takie), to
<center><math>L_t=\sum_{j=1}^n L_{i_j}a_j</math>.</center>
<center><math>L_t=\sum_{j=1}^n L_{i_j}a_j</math>.</center>


Linia 91: Linia 91:
wyrażenia regularnego na podstawie automatu. Będziemy budować układ
wyrażenia regularnego na podstawie automatu. Będziemy budować układ
równań, w którym każde równanie będzie postaci <math>L_i=\sum_{j \in
równań, w którym każde równanie będzie postaci <math>L_i=\sum_{j \in
I}L_ja_j</math>, <math>I=\{i_1,i_2,...,i_n\}</math>
I}L_ja_j</math>, <math>I=\{i_1,i_2,\ldots,i_n\}</math>
, gdzie <math>L_i</math> traktowane są jak
, gdzie <math>L_i</math> traktowane są jak
niewiadome. Następnie układ taki rozwiążemy ze względu na każdą
niewiadome. Następnie układ taki rozwiążemy ze względu na każdą
Linia 128: Linia 128:
   19  '''end''' '''for'''
   19  '''end''' '''for'''
   20  '''rozwiąż''' <math>\{L_i = \sum_{t \in S} L_t
   20  '''rozwiąż''' <math>\{L_i = \sum_{t \in S} L_t
\}_{i=0,...,|S|-1}</math>;
\}_{i=0,\ldots,|S|-1}</math>;
   21  <math>r \leftarrow \sum_{s_i \in T} L_i</math>;
   21  <math>r \leftarrow \sum_{s_i \in T} L_i</math>;
   22  '''return''' <math>r</math>;
   22  '''return''' <math>r</math>;

Aktualna wersja na dzień 21:57, 15 wrz 2023

Ćwiczenie 1

Zastosuj algorytm Automat2GReg do automatu o następującej funkcji przejść:

fs0s1s2s3as1s2s0s2bs3s2s2s2

gdzie s0 jest stanem początkowym oraz T={s0,s2}.

Rozwiązanie

Ćwiczenie 2

Zbuduj automaty akceptujące języki generowane następującymi gramatykami (vi oznaczają symbole nieterminalne, a,b -- terminalne):

1. v0av0, v0bv1, v0bv2, v1bv0, v1av2, v2av0, v21.

2. v0av1, v0b, v1bv0, v1av1, v11.

Rozwiązanie punktu 1
Rozwiązanie punktu 2

W wykładzie podany został algorytm Automat2WR1 budujący wyrażenie regularne na podstawie zadanego automatu. Opiszemy teraz inną metodę rozwiązania tego problemu, wykorzystującą równania na językach.

Dany niech będzie automat 𝒜=(S,A,f,s0,T). Chcemy zbudować wyrażenie regularne opisujące język akceptowany przez 𝒜. Do wyprowadzenia metody potrzebować będziemy lematu Ardena.

Lemat 0.1. [Arden]

Niech RA+ i SA* będą językami regularnymi. Wtedy równanie
X=XR+S

posiada jedyne rozwiązanie X=SR*, które jest językiem regularnym.

Zdefiniujmy najpierw Li jako język tych słów, które byłyby

akceptowane przez

𝒜

, gdyby stanem końcowym był stan

si

, tzn. gdyby

T={si}

:

Li={wA*: f(s0,w)=si}.

Zauważmy, że jeśli do stanu st wchodzą strzałki prowadzące ze stanów si1,si2,...,sin odpowiednio z etykietami a1,a2,,an (i tylko takie), to

Lt=j=1nLijaj.

Obserwacja ta jest podstawą do konstrukcji metody otrzymywania wyrażenia regularnego na podstawie automatu. Będziemy budować układ równań, w którym każde równanie będzie postaci Li=jILjaj, I={i1,i2,,in} , gdzie Li traktowane są jak niewiadome. Następnie układ taki rozwiążemy ze względu na każdą zmienną Li (tu pomocny będzie lemat Ardena). Szukanym przez nas wyrażeniem regularnym będzie wyrażenie postaci iILi, gdzie I jest zbiorem indeksów i stanów końcowych si automatu 𝒜.

Można postawić w tym momencie pytanie, czy budowany układ równań ma rozwiązanie, a jeśli tak, to czy jest ono jedyne. Okazuje się że w rozważanej przez nas sytuacji ma to miejsce, choć dowód tego faktu nie jest natychmiastowy. Fakt ten, podobnie jak lemat Ardena, podajemy tutaj bez dowodu.

Algorytm Automat2WR2 - buduje inną metodą wyrażenie regularne opisujące język akceptowany przez automat skończony



  1  Wejście: 𝒜=(S,A,f,s0,T) - automat akceptujący język L.
  2  Wyjście: r -- wyrażenie regularne opisujące język L.
  3  for each sS 
  4    for each tS 
  5      for each  aA
  6        Ls"";                                 wyrażenie puste
  7        if f(t,a)=s 
  8          if Ls=""
  9            LsLta;            podstawiamy wyrażenie regularne
 10          else
 11            LsLs+Lta;       podstawiamy wyrażenie regularne
 12          end if
 13        end if
 14      end for
 15    end for
 16    if s=s0  and  sT then
 17      LsLs+1;               podstawiamy wyrażenie regularne
 18    end if
 19  end for
 20  rozwiąż {Li=tSLt}i=0,,|S|1;
 21  rsiTLi;
 22  return r;



Funkcja rozwiąż w algorytmie Automat2Wr2 rozwiązuje układ równań (mający na podstawie wcześniejszych uwag jednoznaczne rozwiązania), zwraca obliczone języki Li, i=0,...,|S|1.

Rozwiązanie można wykonać metodą rugowania, przechodząc od Ln do L1. Równanie Li=tSLt rozwiązujemy, korzystając ze wzoru w lemacie Ardena (rolę X w lemacie odgrywa Li) i podstawiamy do pozostałych równań (tzn. równań dla i=0,,i1). Mając już wyliczone L0, wyliczamy kolejne Li idąc od 1 do |S|1. Dla lepszego zrozumienia metody przedstawiamy następujący przykład.

Przykład 1.1.

Dany niech będzie automat pokazany na rysunku 1 (pominęliśmy tu dla uproszczenia jedną strzałkę wychodzącą ze stanu s2 w celu uniknięcia zwiększenia liczby stanów, gdyż chcąc formalnie narysować automat deterministyczny, musielibyśmy dodać stan s3 i zdefiniować f(s2,a)=s3, f(s3,a)=f(s3,b)=s3, ale widać, że wcale nie trzeba wtedy obliczać języka L3, gdyż z tego stanu nie da się już wyjść - jest to tzw. sink state).

Rysunek 1

Ułóżmy równania do naszego układu równań. Mamy:


{L0=L0b+L2b+1L1=L0a+L1aL2=L1b{L0=L0b+L1bb+1L1=L0a+L1aL0=L0b+L0aa*bb*+1

Mamy więc L0=L0(b+a+bb)+1. Korzystając z lematu Ardena, otrzymujemy L0=1(b+a+bb)*=(b+a+bb)*. Podstawiając obliczone L0 do równania i obliczając pozostałe Li, otrzymujemy ostatecznie:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\{ \begin{array} {l} L_0 = (b+a^+bb)^* \\ L_1 = (b+a^+bb)^*a^+ \\ L_2 = (b+a^+bb)^*a^+b. \end{array} \right}

Ponieważ T={s0,s1,s2}, rozwiązaniem jest:

w=L0+L1+L2=(b+a+bb)*(1+a+(1+b)).

Ćwiczenie 3

Niech dany będzie automat 𝒜(S={s0,s1,s2,s3},A={a,b},f,s0,T={s0}) o następującej funkcji przejść:

fs0s1s2s3as1s2s0s3bs3s2s2s3

Wykorzystując algorytm Automat2WR2, wyznacz wyrażenie regularne odpowiadające językowi akceptowanemu przez 𝒜.

Rozwiązanie

Ćwiczenie 4

Dane niech będą automaty: nA-stanowy 𝒜 i nB-stanowy , oba nad alfabetem A i akceptujące odpowiednio języki L(𝒜) i L(). Pokaż, że problem stwierdzenia, czy dla dowolnego wA* zachodzi wL(𝒜)L(), jest rozstrzygalny:

  1. poprzez skonstruowanie niedeterministycznego automatu posiadającego O(nA+nB) stanów,
  2. poprzez skonstruowanie deterministycznego automatu nAnB-stanowego.
Rozwiązanie punktu 1
Rozwiązanie punktu 2

Ćwiczenie 5

Skonstruuj algorytm (oraz określ jego złożoność) dla następującego problemu (tym samym dowodząc jego rozstrzygalności):

Dany jest automat 𝒜=(S,A,f,s0,T). Czy L(𝒜)=?

Rozwiązanie


ZADANIA DOMOWE

Ćwiczenie 6

Zastosuj algorytm Automat2GReg do automatu o następującej funkcji przejść:

fs0s1s2s3as1s3s3s3bs2s2s0s0

gdzie s0 jest stanem początkowym oraz T={s1}.

Ćwiczenie 7

Zbuduj automaty akceptujące języki generowane następującymi gramatykami (vi oznaczają symbole nieterminalne, a,b -- terminalne):

1. v0av1, v0bv2, v0bv0, v1bv1, v1av0, v2bv0, v2bv2, v21.

2. v0bv2, v0b, v1bv0, v1av1, v11, v2av1.

Ćwiczenie 8

Zbuduj automaty (z pustymi przejściami) akceptujące poniższe języki:

  1. b((a+b)*+a),
  2. (a+b)*(a*b*),
  3. a(b*a*)*+1.
Wskazówka

Ćwiczenie 9

Niech dany będzie automat 𝒜(S={s0,s1,s2,s3},A={a,b},f,s0,T={s0}) o następującej funkcji przejść:

fs0s1s2s3as1s2s0s2bs3s2s2s2

Wykorzystując algorytm Automat2WR2, wyznacz wyrażenie regularne odpowiadające językowi akceptowanemu przez 𝒜.

Ćwiczenie 10

Skonstruuj algorytmy dla następujących problemów rozstrzygalnych:

  1. Równoważność dowolnych automatów 𝒜 i .
  2. Nieskończoność języka L(𝒜) dla dowolnego automatu 𝒜.
Wskazówka do punktu 1
Wskazówka do punktu 2