Pochodna Brzozowskiego

Pochodna Brzozowskiego (na czerwonym tle) ciągu słownikowego ustawionego względem ciągu „con”

W informatyce teoretycznej w szczególności w teorii języka formalnego , pochodna Brzozowskiego zbioru ciągów i łańcucha u \ gdzie jest zbiorem wszystkich ciągów, które można uzyskać z ciągu w przedrostka , jak pokazano na rysunku Formalnie: .

Został wprowadzony pod różnymi nazwami od późnych lat pięćdziesiątych. Dziś nosi imię informatyka Janusza Brzozowskiego , który zbadał jego właściwości i podał algorytm obliczania pochodnej uogólnionego wyrażenia regularnego .

Definicja

Chociaż pierwotnie badano ją pod kątem wyrażeń regularnych, definicja dotyczy dowolnych języków formalnych. dowolny język formalny alfabetem i dowolnym ciągiem , pochodną u ∈ w odniesieniu do jest zdefiniowany jako:

Pochodna Brzozowskiego jest szczególnym przypadkiem lewego ilorazu przez zbiór singletonowy zawierający tylko : .

Równoważnie dla wszystkich :

Z definicji dla wszystkich :

. dla S

Pochodna w odniesieniu do dowolnego ciągu sprowadza się do kolejnych ,

Język jest nazywany nullable wtedy i tylko zawiera pusty ciąg . Każdy język jest jednoznacznie określony przez możliwość zerowania jego pochodnych:

Język można postrzegać jako (potencjalnie nieskończone) drzewo z etykietą logiczną (patrz także drzewo (teoria mnogości) i automat drzewa nieskończonego ). Każdy łańcuch oznacza węzeł w drzewie, z etykietą w false w przeciwnym razie tej interpretacji pochodna względem symbolu poddrzewi otrzymanemu przez podążanie za krawędzią . Rozkład drzewa na korzeń i poddrzewa równości, która obowiązuje dla każdego języka :

Pochodne uogólnionych wyrażeń regularnych

Kiedy język jest określony przez wyrażenie regularne, koncepcja pochodnych prowadzi do algorytmu decydującego, czy dane słowo należy do wyrażenia regularnego.

uwagę skończony alfabet A symboli, uogólnione wyrażenie regularne R oznacza możliwie nieskończony zbiór ciągów o skończonej długości nad alfabetem A , zwanym językiem R , oznaczonym jako L ( R ).

Uogólnione wyrażenie regularne może być jednym z następujących (gdzie a jest symbolem alfabetu A , a R i S są uogólnionymi wyrażeniami regularnymi):

  • „∅” oznacza zbiór pusty: L (∅) = {},
  • „ε” oznacza zestaw singleton zawierający pusty ciąg: L (ε) = {ε},
  • a ” oznacza zestaw singleton zawierający ciąg pojedynczych symboli a : L ( a ) = { a },
  • " R S " oznacza sumę R i S : L ( R S ) = L ( R ) ∪ L ( S ),
  • R S ” oznacza przecięcie R i S : L ( R S ) = L ( R ) ∩ L ( S ),
  • „¬ R ” oznacza dopełnienie R (w odniesieniu do A *, zbioru wszystkich ciągów nad A ): L R ) = A * \ L ( R ),
  • RS ” oznacza konkatenację R i S : L ( RS ) = L ( R ) · L ( S ),
  • R *” oznacza zamknięcie Kleene’a R : L ( R *) = L ( R )*.

W zwykłym wyrażeniu regularnym ani ∧, ani ¬ nie są dozwolone.

Obliczenie

Dla dowolnego uogólnionego wyrażenia regularnego R i dowolnego łańcucha u , pochodna u −1 R jest ponownie uogólnionym wyrażeniem regularnym (oznaczającym język u −1 L ( R )). Można to obliczyć rekurencyjnie w następujący sposób.

( ua ) −1 R = za −1 ( u −1 R ) dla symbolu a i łańcucha u
ε -1 R = R

Stosując poprzednie dwie reguły, pochodna względem dowolnego ciągu znaków jest wyjaśniona przez pochodną względem ciągu jednosymbolowego a . To ostatnie można obliczyć w następujący sposób:

za- 1 za = ε
a - 1b = ∅ dla każdego symbolu b a
za −1 ε = ∅
za −1 = ∅
a −1 ( R *) = ( za −1 R ) R *
a -1 ( RS ) = ( za -1 R ) S ∨ ν ( R ) za -1 S
za −1 ( R S ) = ( za −1 R ) ∧ ( za −1 S )
za −1 ( R S ) = ( za −1 R ) ∨ ( za −1 S )
a −1 R ) = ¬( za −1 R )

Tutaj ν( R ) jest funkcją pomocniczą dającą uogólnione wyrażenie regularne, którego wynikiem jest pusty łańcuch ε, jeśli język R zawiera ε , a w przeciwnym razie daje ∅. Funkcję tę można obliczyć według następujących reguł:

ν( a ) = ∅ dla dowolnego symbolu a
ν( ε ) = ε
ν(∅) = ∅
ν( R *) = ε
ν( RS ) = ν( R ) ∧ ν ( S )
ν( R S ) = ν( R ) ∧ ν ( S )
ν( R S ) = ν( R ) ∨ ν ( S )
ν(¬ R ) = ε jeśli ν( R ) = ∅
ν(¬ R ) = ∅ jeśli ν( R ) = ε

Nieruchomości

Łańcuch u jest członkiem zbioru ciągów oznaczonego uogólnionym wyrażeniem regularnym R wtedy i tylko wtedy, gdy ε należy do zbioru ciągów określonego przez pochodną u −1 R .

Biorąc pod uwagę wszystkie pochodne ustalonego uogólnionego wyrażenia regularnego R daje tylko skończenie wiele różnych języków. Jeśli ich liczbę oznaczymy przez d R , wszystkie te języki można otrzymać jako pochodne R względem łańcuchów o długości mniejszej niż d R . Co więcej, istnieje kompletny deterministyczny automat skończony ze stanami d R , który rozpoznaje język regularny podany przez R , zgodnie z twierdzeniem Myhilla-Nerode'a .

Pochodne języków bezkontekstowych

Pochodne są również efektywnie obliczalne dla rekurencyjnie zdefiniowanych równań z operatorami wyrażeń regularnych, które są równoważne gramatyce bezkontekstowej . Ta wiedza została wykorzystana do wyprowadzenia analizowania dla języków bezkontekstowych . Implementacja takich algorytmów wykazała złożoność w czasie sześciennym , odpowiadającą złożoności parsera Earleya w ogólnych gramatykach bezkontekstowych.

Zobacz też