Řetězcové operace - String operations
V informatice se v oblasti teorie formálních jazyků často používá řada řetězcových funkcí ; použitý zápis se však liší od zápisu používaného pro počítačové programování a některé běžně používané funkce v teoretické oblasti se při programování používají jen zřídka. Tento článek definuje některé z těchto základních pojmů.
Obsah
Řetězce a jazyky
Řetězec je konečná posloupnost znaků. Prázdný řetězec je označen . Zřetězení dvou řetězců a je označeno nebo kratší . Zřetězení s prázdným řetězcem nehraje žádnou roli: . Zřetězení řetězců je asociativní: .
Například .
Jazyk je konečný nebo nekonečný soubor řetězců. Kromě obvyklých operací se sadami, jako je sjednocení, křižovatka atd., Lze zřetězení použít na jazyky: pokud jsou oba a jsou jazyky, jejich zřetězení je definováno jako sada zřetězení libovolného řetězce od a libovolného řetězce od , formálně . Znovu je tečka zřetězení kvůli stručnosti často vynechána.
Jazyk skládající se pouze z prázdného řetězce je třeba odlišit od prázdného jazyka . Zřetězení libovolný jazyk s bývalý nedělá žádné změny: při zřetězení s ním vždy dává prázdnou jazyk: . Zřetězení jazyků je asociativní: .
Například zkratkou se sada všech třímístných desetinných čísel získá jako . Sada všech desetinných čísel libovolné délky je příkladem pro nekonečný jazyk.
Abeceda řetězce
Abeceda řetězce je množina všech znaků, které se vyskytují v určitém řetězci. Pokud s je řetězec, jeho abeceda je označena
Abeceda jazyka je množina všech znaků, které se vyskytují v každém řetězci , formálně: .
Sada je například abeceda řetězce a výše uvedená je abeceda výše uvedeného jazyka i jazyka všech desetinných čísel.
Střídání řetězců
Nechť L je jazyk a nechť Σ je jeho abeceda. Substituce řetězce nebo jednoduše substituce je mapování f, které mapuje znaky v Σ na jazyky (případně v jiné abecedě). Tak například, daný znak a ∈ Σ, jeden má f ( a ) = L a kde L a ⊆ Δ * je nějaký jazyk, jehož abeceda je Δ. Toto mapování lze rozšířit na řetězce jako
- f (ε) = ε
pro prázdný řetězec ε a
- f ( sa ) = f ( s ) f ( a )
pro řetězec s ∈ L a znak a ∈ Σ. Substituce řetězců lze rozšířit na celé jazyky jako
Běžné jazyky jsou uzavřeny nahrazením řetězců. To znamená, že pokud je každý znak v abecedě běžného jazyka nahrazen jiným běžným jazykem, výsledkem je stále běžný jazyk. Podobně jsou bezkontextové jazyky uzavřeny substitucí řetězců.
Jednoduchým příkladem je převod f uc (.) Na velká písmena, který lze definovat např. Takto:
charakter | namapováno na jazyk | Poznámka |
---|---|---|
X | f uc ( x ) | |
< > | {< >} | mapovat malá písmena na odpovídající velká písmena |
< > | {< >} | namapujte velká písmena na sebe |
‹ Ss › | {‹ SS ›} | není k dispozici velká písmena, namapujte na řetězec se dvěma znaky |
‹0› | {ε} | namapujte číslici na prázdný řetězec |
‹!› | {} | zakázat interpunkci, namapovat na prázdný jazyk |
... | podobné pro ostatní znaky |
Pro rozšíření f uc na řetězce máme např
- f uc (‹Straße›) = {‹S›} ⋅ {‹T›} ⋅ {‹R›} ⋅ {‹A›} ⋅ {‹SS›} ⋅ {‹E›} = {‹STRASSE›},
- f uc (‹u2›) = {‹U›} ⋅ {ε} = {‹U›} a
- f uc (‹Go!›) = {‹G›} ⋅ {‹O›} ⋅ {} = {}.
Pro rozšíření f uc do jazyků, máme např
- f uc ({‹Straße›, ‹u2›, ‹Přejít!›}) = {‹STRASSE›} ∪ {‹U›} ∪ {} = {‹STRASSE›, ‹U›}.
Řetězcový homomorfismus
String homomorphism (často odkazoval se na jednoduše jako homomorfismu v teorii formálních jazyků ) je řetězec substituce taková, že každý znak je nahrazena jediným řetězcem. To znamená, kde je řetězec pro každý znak .
String homomorphisms jsou monoidu morphisms na volné monoid , konzervační prázdný řetězec a binární operaci na zřetězením řetězce . Vzhledem k tomu, jazyk , soubor se nazývá homomorfní obraz o . Inverzní homomorfní obraz z řetězce je definován jako
zatímco inverzní homomorfní obraz jazyka je definován jako
Obecně platí, že zatímco člověk má
a
pro jakýkoli jazyk .
Třída regulárních jazyků je uzavřena pod homomorfismy a inverzními homomorfismy. Podobně jsou bezkontextové jazyky uzavřeny pod homomorfismy a inverzními homomorfismy.
Řetězec homomorphism je řekl, aby byl ε-volný (nebo e-volný) jestliže pro všechny a v abecedě . Jednoduché jednopísmenné substituční šifry jsou příklady řetězcových homomorfismů (bez ε).
Příklad homomorfismu řetězce g uc lze také získat definováním podobné výše uvedené substituci: g uc (‹a›) = ‹A›, ..., g uc (‹0›) = ε, ale necháme g uc být nedefinováno na interpunkční znaky. Příklady inverzních homomorfních obrazů jsou
- g uc −1 ({‹SSS›}) = {‹sss›, ‹sß›, ‹ßs›}, protože g uc (‹sss›) = g uc (‹sß›) = g uc (‹ßs›) = ‹SSS› a
- g uc −1 ({‹A›, ‹bb›}) = {‹a›}, protože g uc (‹a›) = ‹A›, zatímco ‹bb› nelze dosáhnout pomocí g uc .
Pro tento druhý jazyk platí g uc ( g uc −1 ({‹A›, ‹bb›})) = g uc ({‹a›}) = {‹A›} ≠ {‹A›, ‹bb›} . Homomorfismus g uc není ε-free, protože mapuje např. ‹0› na ε.
Velmi jednoduchým příkladem řetězcového homomorfismu, který mapuje každý znak pouze na znak, je převod řetězce kódovaného EBCDIC na ASCII .
Řetězcová projekce
Pokud to je řetězec, a je abeceda je řetězec projekce ze sa je řetězec, který výsledky tím, že odstraní všechny znaky, které nejsou v . Je psán jako . Formálně je definován odstraněním znaků z pravé strany:
Zde označuje prázdný řetězec . Projekce řetězce je v podstatě stejná jako projekce v relační algebře .
Řetězcová projekce může být povýšena na projekci jazyka . Vzhledem k formálnímu jazyku L je jeho projekce dána vztahem
Správný kvocient
Právo kvocient ze znaku A z řetězce s je zkrácení znakové A v řetězci s , z pravé strany. Označuje se jako . Pokud řetězec nemá na pravé straně znak a , výsledkem je prázdný řetězec. Tím pádem:
Kvocient prázdného řetězce lze vzít:
Podobně, vzhledem k podmnožině monoidů , lze definovat podmnožinu podmnožin jako
Levé kvocienty lze definovat podobně, přičemž operace probíhají nalevo od řetězce.
Hopcroft a Ullman (1979) definují kvocient L 1 / L 2 jazyků L 1 a L 2 ve stejné abecedě jako L 1 / L 2 = { s | ∃ t ∈ L 2 . st ∈ L 1 }. Nejedná se o zobecnění výše uvedené definice, protože pro řetězec s a odlišné znaky a , b znamená Hopcroftova a Ullmanova definice { sa } / { b } poddajnost {}, spíše než {ε}.
Levý kvocient (definovaný podobně jako Hopcroft a Ullman 1979) singletonského jazyka L 1 a libovolného jazyka L 2 je známý jako Brzozowského derivát ; pokud L 2 je reprezentován regulárním výrazem , může to být i levý kvocient.
Syntaktický vztah
Právo kvocient podmnožiny z monoid definuje vztah rovnocennosti , nazvaný právo syntaktický vztah ze S . Je to dáno
Tento vztah má jednoznačně konečný index (má konečný počet tříd ekvivalence) právě tehdy, pokud jsou kvocienty rodinných práv konečné; to je, pokud
je konečný. V případě, že M je monoid slov nad nějakou abecedou, je S potom běžný jazyk , tj. Jazyk, který lze rozpoznat automatem konečného stavu . To je podrobněji popsáno v článku o syntaktických monoidech .
Správné zrušení
Právo zrušení ze znaku A z řetězce s je odstranění prvního výskytu znaku A v řetězci s , počínaje od pravé straně. Je označen jako a je rekurzivně definován jako
Prázdný řetězec je vždy zrušitelný:
Je zřejmé, že správné zrušení a promítání dojíždí :
Předpony
Tyto předpony řetězec je množina všech prefixů na provázku, s ohledem na daný jazyk:
kde .
Uzavření prefix jazyka je
Příklad:
Jazyk se nazývá předpona uzavřená, pokud .
Operátor uzavření předpony je idempotentní :
Vztah prefix je binární relace tak, že tehdy a jen tehdy, jestliže . Tato relace je konkrétním příkladem pořadí předpon .
Viz také
- Porovnání programovacích jazyků (řetězcové funkce)
- Leviho lema
- Řetězec (informatika) - definice a implementace základních operací na řetězcích
Poznámky
Reference
- Hopcroft, John E .; Ullman, Jeffrey D. (1979). Úvod do teorie automatů, jazyků a výpočtu . Reading, Massachusetts: Addison-Wesley Publishing. ISBN 978-0-201-02988-8 . Zbl 0426.68001 . (Viz kapitola 3.)