Pochodna Brzozowskiego
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.