Operacje na łańcuchach

W informatyce , w obszarze teorii języka formalnego , często wykorzystuje się różne funkcje łańcuchowe ; jednak używana notacja różni się od tej używanej do programowania komputerów , a niektóre powszechnie używane funkcje w sferze teoretycznej są rzadko używane podczas programowania. W tym artykule zdefiniowano niektóre z tych podstawowych terminów.

Struny i języki

Łańcuch to skończony ciąg znaków. Pusty ciąg jest oznaczony przez . Połączenie dwóch łańcuchów jest oznaczone przez krócej przez . Łączenie z pustym ciągiem nie ma znaczenia: . \ cdot (t \ cdot u) = (s \ cdot t ) } .

Na przykład .

Język to skończony lub nieskończony zbiór ciągów znaków . Oprócz zwykłych operacji na zbiorach, takich jak suma, przecięcie itp., Konkatenację można zastosować do języków: jeśli zarówno i są językami, ich konkatenacja zdefiniowany jako zbiór konkatenacji dowolnego ciągu z z , formalnie . Ponownie, kropka konkatenacji pomijana dla zwięzłości.

Język składający \ . Łączenie dowolnego języka z pierwszym nie powoduje żadnych zmian: , podczas gdy konkatenacja z tym ostatnim zawsze daje pusty język: . Łączenie języków jest asocjacyjne: .

Na przykład skrót , zbiór wszystkich trzycyfrowych liczb dziesiętnych otrzymuje się jako . Zbiór wszystkich liczb dziesiętnych o dowolnej długości jest przykładem języka nieskończonego.

Alfabet ciągu

Alfabet łańcucha to zbiór wszystkich znaków, które występują w określonym ciągu. Jeśli s jest ciągiem, jego alfabet jest oznaczony przez

Alfabet języka to zbiór wszystkich znaków, które występują w dowolnym ciągu Alph .

Na przykład zbiór to alfabet łańcucha , a powyższy alfabetem powyższego języka , a także języka wszystkich liczb dziesiętnych.

Podstawianie ciągów

Niech L będzie językiem , a Σ jego alfabetem. Podstawienie łańcucha lub po prostu podstawienie to odwzorowanie f , które odwzorowuje znaki w Σ na języki (prawdopodobnie w innym alfabecie). Zatem, na przykład, mając znak a ∈ Σ, mamy f ( a )= L a, gdzie L a ⊆ Δ * jest językiem, którego alfabetem jest Δ. To odwzorowanie można rozszerzyć na ciągi jako

fa (ε)=ε

dla pustego łańcucha ε i

fa ( sa ) ​​= fa ( s ) fa ( za )

dla ciągu s L i znaku a ∈ Σ. Podstawienia ciągów można rozszerzyć na całe języki, jak

Języki regularne są zamknięte pod podstawieniem łańcucha. Oznacza to, że jeśli każdy znak w alfabecie języka regularnego zostanie zastąpiony innym językiem regularnym, wynikiem jest nadal język regularny. Podobnie języki bezkontekstowe są zamknięte pod podstawieniem łańcucha.

Prostym przykładem jest konwersja f uc (.) na wielkie litery, którą można zdefiniować np. następująco:

postać odwzorowane na język uwaga
X f uc ( x )
a { ‹ A › } odwzoruj znak małej litery na odpowiedni znak wielkiej litery
‹A › _ _ { ‹ A › } mapuj wielkie litery na siebie
ß { ‹ SS › } brak dostępnych znaków wielkich liter, zamapuj na łańcuch dwuznakowy
‹0› {ε} mapuj cyfrę na pusty ciąg
‹!› {} zakazać interpunkcji, mapować na pusty język
... podobnie dla innych znaków

Dla rozszerzenia f uc na łańcuchy mamy np

  • f uc (‹Straße›) = {‹S›} ⋅ {‹T›} ⋅ {‹R›} ⋅ {‹A›} ⋅ {‹SS›} ⋅ {‹E›} = {‹STRASZA›},
  • f uc (‹u2›) = {‹U›} ⋅ {ε} = {‹U›}, oraz
  • f uc (‹Go!›) = {‹G›} ⋅ {‹O›} ⋅ {} = {}.

Dla rozszerzenia f uc na języki mamy np

  • f uc ({ ‹Straße›, ‹u2›, ‹Go!› }) = { ‹STRASSE› } ∪ { ‹U› } ∪ { } = { ‹STRASSE›, ‹U› }.

Homomorfizm strun

Homomorfizm ciągów (często określany po prostu jako homomorfizm w teorii języka formalnego ) to podstawienie ciągu znaków w taki sposób, że każdy znak jest zastępowany pojedynczym ciągiem. To znaczy gdzie znaków dla .

Homomorfizmy strunowe to morfizmy monoidalne na wolnej monoidzie , zachowujące pustą strunę i binarną operację konkatenacji strun . Biorąc język zbiór nazywa się L { Odwrotny homomorficzny obraz jest jako

podczas gdy odwrotny homomorficzny obraz języka jest zdefiniowany jako

Ogólnie , podczas gdy ma się

I

dla dowolnego języka .

Klasa języków regularnych jest zamknięta na homomorfizmy i homomorfizmy odwrotne. Podobnie języki bezkontekstowe są zamknięte na homomorfizmy i homomorfizmy odwrotne.

Mówi się, że homomorfizm strun jest wolny od ε (lub wolny od e), Σ { \ . Proste jednoliterowe szyfry podstawieniowe są przykładami (wolnych od ε) homomorfizmów łańcuchowych.

Przykładowy homomorfizm struny g uc można również otrzymać definiując podobnie do powyższego podstawienia: g uc (‹a›) = ‹A›, ..., g uc (‹0›) = ε, ale pozwalając g uc być niezdefiniowanym na znakach interpunkcyjnych. Przykładami odwrotnych obrazów homomorficznych są

  • g uc −1 ({ ‹SSS› }) = { ‹sss›, ‹sß›, ‹ßs› }, ponieważ g uc (‹sss›) = g uc (‹sß›) = g uc (‹ßs›) = ‹SSS›, i
  • g uc −1 ({ ‹A›, ‹bb› }) = { ‹a› }, ponieważ g uc (‹a›) = ‹A›, natomiast ‹bb› nie może być osiągnięte przez g uc .

Dla tego ostatniego języka g uc ( g uc −1 ({ ‹A›, ‹bb› })) = g uc ({ ‹a› }) = { ‹A› } ≠ { ‹A›, ‹bb› } . Homomorfizm g uc nie jest wolny od ε, ponieważ odwzorowuje np. ‹0› na ε.

Bardzo prostym przykładem homomorfizmu napisów, który odwzorowuje każdy znak tylko na jeden znak, jest konwersja łańcucha zakodowanego w EBCDIC na ASCII .

Projekcja strun

Jeśli s jest ciągiem, a , projekcja ciągu s jest ciągiem powstałym w wyniku usunięcia wszystkich znaków, których nie ma w displaystyle . Jest napisane jako . Jest to formalnie zdefiniowane przez usunięcie znaków z prawej strony:

Tutaj oznacza ciąg . Projekcja struny jest zasadniczo taka sama jak projekcja w algebrze relacyjnej .

Projekcja łańcuchowa może zostać podniesiona do projekcji języka . Biorąc pod uwagę język formalny L , jego projekcja jest dana przez

potrzebne źródło ]

Właściwy iloraz

Prawy iloraz znaku a z łańcucha s jest obcięciem znaku a w łańcuchu s , z prawej strony. Jest oznaczony jako . Jeśli łańcuch nie ma po prawej stronie, wynikiem jest pusty ciąg. Zatem:

Iloraz pustego łańcucha można przyjąć:

Podobnie, biorąc pod uwagę podzbiór monoidu , można zdefiniować podzbiór ilorazu jako

Lewe ilorazy można zdefiniować podobnie, przy czym operacje odbywają się po lewej stronie łańcucha. [ potrzebne źródło ]

Hopcroft i Ullman (1979) definiują iloraz L 1 / L 2 języków L 1 i L 2 w tym samym alfabecie jako L 1 / L 2 = { s | ∃ t L 2 . st L 1 }. Nie jest to uogólnienie powyższej definicji, ponieważ dla łańcucha s i różnych znaków a , b , definicja Hopcrofta i Ullmana implikuje { sa } / { b } plonowanie {} zamiast { ε }.

Lewy iloraz (zdefiniowany podobnie jak Hopcroft i Ullman 1979) języka singletonowego L 1 i dowolnego języka L 2 jest znany jako pochodna Brzozowskiego ; jeśli L 2 jest reprezentowane przez wyrażenie regularne , więc może być lewym ilorazem.

Relacja składniowa

Właściwy iloraz definiuje relację zwaną właściwą _ S . _ Podaje się przez

Relacja ma wyraźnie skończony indeks (ma skończoną liczbę klas równoważności) wtedy i tylko wtedy, gdy iloraz praw rodziny jest skończony; czyli jeśli

jest skończony. W przypadku, gdy M jest monoidem słów nad jakimś alfabetem, S jest wtedy językiem regularnym , to znaczy językiem, który może być rozpoznany przez automat skończony . Zostało to omówione bardziej szczegółowo w artykule na temat monoidów składniowych . [ potrzebne źródło ]

Właściwe anulowanie

Prawidłowe anulowanie znaku a z łańcucha s to usunięcie pierwszego wystąpienia znaku a w łańcuchu s , zaczynając od prawej strony. Jest oznaczony jako i jest definiowany rekurencyjnie jako

Pusty ciąg można zawsze anulować:

Oczywiście, prawe anulowanie i dojazd do projekcji :

potrzebne źródło ]

Przedrostki

Prefiksy łańcucha to zbiór wszystkich przedrostków łańcucha, w odniesieniu do danego języka:

gdzie .

Zamknięcie przedrostka języka to


Przykład:

Język nazywa się przedrostkiem zamkniętym , jeśli .

Operator zamknięcia przedrostka jest idempotentny :

Relacja przedrostkowa jest relacją binarną taką, że wtedy i tylko wtedy, gdy . Ta relacja jest szczególnym przykładem kolejności przedrostków . [ potrzebne źródło ]

Zobacz też

Notatki

  •    Hopcroft, John E.; Ullman, Jeffrey D. (1979). Wprowadzenie do teorii automatów, języków i obliczeń . Reading, Massachusetts: Wydawnictwo Addison-Wesley. ISBN 978-0-201-02988-8 . Zbl 0426.68001 . (Patrz rozdział 3.)