Řetězcové operace - String operations - Wikipedia
v počítačová věda, v oblasti teorie formálního jazyka, často se používá celá řada řetězcové funkce; použitá notace se však liší od použité programování a některé běžně používané funkce v teoretické sféře se při programování používají jen zřídka. Tento článek definuje některé z těchto základních pojmů.
Ř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čen nebo kratší o Zřetězení s prázdným řetězcem nedělá žádný rozdíl: Zřetězení řetězců je asociativní: .
Například, .
A Jazyk je konečná nebo nekonečná sada řetězců. Kromě obvyklých operací množin, jako je sjednocení, křižovatka atd., lze na jazyky použít zřetězení: pokud oba a jsou jazyky, jejich zřetězení je definována jako sada zřetězení libovolného řetězce z a jakýkoli řetězec z formálně Znovu tečka zřetězení je pro stručnost často vynechán.
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í jakéhokoli jazyka s prvním jazykem nedělá žádné změny: , zatímco zřetězení s druhým vždy přináší prázdný jazyk: Zřetězení jazyků je asociativní: .
Například zkratka , sada všech třímístných desetinných čísel se získá jako . Sada všech desetinných čísel libovolné délky je příkladem pro nekonečný jazyk.
Abeceda řetězce
The abeceda řetězce je sada všech znaků, které se vyskytují v konkrétním řetězci. Li s je řetězec, jeho abeceda je označen
The abeceda jazyka je sada všech znaků, které se vyskytují v libovolném řetězci , formálně:.
Například sada je abeceda řetězce a výše je abeceda výše Jazyk stejně jako jazyk všech desetinných čísel.
Střídání řetězců
Nechat L být Jazyk, a nechť Σ je jeho abeceda. A substituce řetězce nebo jednoduše a substituce je mapování F který mapuje znaky v Σ na jazyky (případně v jiné abecedě). Tak například daný znak A One Σ, jeden má F(A)=LA kde LA ⊆ Δ* 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 charakter A ∈ Σ. Substituce řetězců lze rozšířit na celé jazyky jako [1]
Běžné jazyky jsou uzavřeny pod substitucí řetězce. To znamená, že pokud je každý znak v abecedě běžného jazyka nahrazen jiným běžným jazykem, výsledkem bude stále běžný jazyk.[2]Podobně, bezkontextové jazyky jsou uzavřeny pod substitucí řetězce.[3][poznámka 1]
Jednoduchým příkladem je převod Fvidíš(.) na velká písmena, která mohou být definována např. jak následuje:
charakter | namapováno na jazyk | Poznámka |
---|---|---|
X | Fvidíš(X) | |
‹A› | { ‹A› } | mapovat malá písmena na odpovídající velká písmena |
‹A› | { ‹A› } | namapujte velká písmena na sebe |
‹ß› | { ‹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í Fvidíš na struny, máme např.
- Fvidíš(‹Straße›) = {‹S›} ⋅ {‹T›} ⋅ {‹R›} ⋅ {‹A›} ⋅ {‹SS›} ⋅ {‹E›} = {‹STRASSE›},
- Fvidíš(‹U2›) = {‹U›} ⋅ {ε} = {‹U›} a
- Fvidíš(‹Go!›) = {‹G›} ⋅ {‹O›} ⋅ {} = {}.
Pro rozšíření Fvidíš do jazyků, máme např.
- Fvidíš({‹Straße›, ‹u2›, ‹Přejít!›}) = {‹STRASSE›} ∪ {‹U›} ∪ {} = {‹STRASSE›, ‹U›}.
Řetězcový homomorfismus
A řetězový homomorfismus (často označované jednoduše jako a homomorfismus v teorie formálního jazyka ) je substituce řetězce, takže každý znak je nahrazen jedním řetězcem. To znamená , kde je řetězec pro každý znak .[poznámka 2][4]
Řetězcové homomorfismy jsou monoidní morfismy na volný monoid, zachování prázdného řetězce a binární operace z zřetězení řetězce. Vzhledem k tomu, jazyk , sada se nazývá homomorfní obraz z . The inverzní homomorfní obraz řetězce je definován jako
zatímco inverzní homomorfní obraz jazyka je definován jako
Obecně, , zatímco jeden ano
a
pro jakýkoli jazyk .
Třída regulárních jazyků je uzavřena pod homomorfismy a inverzními homomorfismy.[5] Podobně jsou bezkontextové jazyky uzavřeny pod homomorfismy[Poznámka 3] a inverzní homomorfismy.[6]
Řetězcový homomorfismus se říká, že je bez ε (nebo e-free), pokud pro všechny A v abecedě . Jednoduché jedno písmeno substituční šifry jsou příklady (bez ε) řetězcových homomorfismů.
Příklad homomorfismu řetězce Gvidíš lze také získat definicí podobnou jako výše substituce: Gvidíš(‹A›) = ‹A›, ..., Gvidíš(‹0›) = ε, ale necháme Gvidíš být nedefinováno na interpunkčních znacích. Příklady inverzních homomorfních obrazů jsou
- Gvidíš−1({‹SSS›}) = {‹sss›, ‹sß›, ‹ßs›}, protože Gvidíš(‹Sss›) = Gvidíš(‹Sß›) = Gvidíš(‹Sss›) = ‹SSS› a
- Gvidíš−1({‹A›, ‹bb›}) = {‹a›}, protože Gvidíš(‹A›) = ‹A›, zatímco ‹bb› nelze dosáhnout Gvidíš.
U druhého jazyka Gvidíš(Gvidíš−1({‹A›, ‹bb›})) = Gvidíš({‹A›}) = {‹A›} ≠ {‹A›, ‹bb›}. Homomorfismus Gvidíš není ε-free, protože mapuje např. ‹0› až ε.
Velmi jednoduchým příkladem řetězcového homomorfismu, který mapuje každý znak pouze na znak, je převod znaku EBCDIC -kódovaný řetězec do ASCII.
Řetězcová projekce
Li s je řetězec a je abeceda, řetězcová projekce z s je řetězec, jehož výsledkem je odstranění všech znaků, které nejsou v . Je psán jako . Formálně je definován odstraněním znaků z pravé strany:
Tady označuje prázdný řetězec. Projekce řetězce je v podstatě stejná jako a projekce v relační algebře.
Řetězcová projekce může být povýšena na projekce jazyka. Vzhledem k formální jazyk L, jeho projekce je dána
Správný kvocient
The pravý kvocient postavy A z řetězce s je zkrácení postavy A v řetězci s, z pravé strany. Označuje se jako . Pokud řetězec nemá A na pravé straně je výsledkem prázdný řetězec. Tím pádem:
Kvocient prázdného řetězce lze vzít:
Podobně vzhledem k podmnožině monoidu , lze definovat podmnožinu kvocientu jako
Levé kvocienty lze definovat podobně, přičemž operace probíhají nalevo od řetězce.[Citace je zapotřebí ]
Hopcroft a Ullman (1979) definují podíl L1/L2 jazyků L1 a L2 přes stejnou abecedu jako L1/L2 = { s | ∃t∈L2. Svatý∈L1 }.[7]Nejedná se o zobecnění výše uvedené definice, protože pro řetězec s a odlišné znaky A, b, Hopcroftova a Ullmanova definice znamená {sa} / {b} dává {}, spíše než {ε}.
Levý kvocient (je-li definován podobně jako Hopcroft a Ullman 1979) singletonského jazyka L1 a libovolný jazyk L2 je známý jako Brzozowského derivát; -li L2 je reprezentován a regulární výraz, tak může být i levý kvocient.[8]
Syntaktický vztah
Správný kvocient podmnožiny monoidu definuje vztah ekvivalence, volal že jo syntaktický vztah z 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, S je pak a běžný jazyk, tj. jazyk, který lze rozpoznat podle a konečný stavový automat. To je podrobněji popsáno v článku o syntaktické monoidy.[Citace je zapotřebí ]
Správné zrušení
The správné zrušení postavy A z řetězce s je odstranění prvního výskytu postavy A v řetězci s, počínaje od pravé strany. Označuje se jako a je rekurzivně definována jako
Prázdný řetězec je vždy zrušitelný:
Je zřejmé, že správné zrušení a projekce dojíždět:
Předpony
The předpony řetězce je množina všech předpony na řetězec, s ohledem na daný jazyk:
kde .
The předpona uzavření jazyka je
Příklad:
Jazyk se nazývá předpona uzavřena -li .
Operátor uzavření předpony je idempotentní:
The relace předpony je binární relace takhle kdyby a jen kdyby . Tento vztah je konkrétním příkladem a pořadí prefixů.[Citace je zapotřebí ]
Viz také
- Porovnání programovacích jazyků (řetězcové funkce)
- Leviho lema
- Řetězec (informatika) - definice a implementace více základních operací s řetězci
Poznámky
- ^ Ačkoli každý regulární jazyk je také bezkontextový, předchozí věta není implikována současným, protože první přináší shaper výsledek pro regulární jazyky.
- ^ Přísně formálně homomorfismus poskytuje jazyk skládající se pouze z jednoho řetězce, tj. .
- ^ To vyplývá z výše zmíněné uzavření pod libovolnými substitucemi.
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.)
- ^ Hopcroft, Ullman (1979), oddíl 3.2, s. 60
- ^ Hopcroft, Ullman (1979), oddíl 3.2, věta 3.4, str.60
- ^ Hopcroft, Ullman (1979), oddíl 6.2, věta 6.2, s. 131
- ^ Hopcroft, Ullman (1979), oddíl 3.2, str. 60-61
- ^ Hopcroft, Ullman (1979), oddíl 3.2, věta 3.5, str.61
- ^ Hopcroft, Ullman (1979), oddíl 6.2, věta 6.3, str.132
- ^ Hopcroft, Ullman (1979), oddíl 3.2, s. 62
- ^ Janusz A. Brzozowski (1964). "Deriváty regulárních výrazů". J ACM. 11 (4): 481–494. doi:10.1145/321239.321249.