Строковые операции

редактировать

В информатике, в области теории формального языка, часто используются различные строковые функции ; однако используемые обозначения отличаются от обозначений, используемых для компьютерного программирования, и некоторые часто используемые функции в теоретической области редко используются при программировании. В этой статье дается определение некоторых из этих основных терминов.

Содержание

  • 1 Строки и языки
  • 2 алфавит строки
  • 3 Подстановка строк
  • 4 Гомоморфизм струны
  • 5 Проекция струны
  • 6 Правое частное
  • 7 Синтаксическое отношение
  • 8 Правильная отмена
  • 9 префиксов
  • 10 См. Также
  • 11 Примечания
  • 12 Ссылки

Строки и языки

Строка - это конечная последовательность символов. Пустая строка обозначается. Конкатенация двух строк и обозначается или короче. Конкатенация с пустой строкой не имеет никакого значения:. Конкатенация строк является ассоциативной :. ε {\ displaystyle \ varepsilon} s {\ displaystyle s} т {\ displaystyle t} s т {\ displaystyle s \ cdot t} s т {\ displaystyle st} s ε знак равно s знак равно ε s {\ Displaystyle s \ cdot \ varepsilon = s = \ varepsilon \ cdot s} s ( т ты ) знак равно ( s т ) ты {\ Displaystyle s \ cdot (t \ cdot u) = (s \ cdot t) \ cdot u}

Например,. ( б л ) ( ε а час ) знак равно б л а час знак равно б л а час {\ displaystyle (\ langle b \ rangle \ cdot \ langle l \ rangle) \ cdot (\ varepsilon \ cdot \ langle ah \ rangle) = \ langle bl \ rangle \ cdot \ langle ah \ rangle = \ langle blah \ rangle}

Язык является конечным или бесконечным множеством строк. Помимо обычных операций над множествами, таких как объединение, пересечение и т. Д., Конкатенация может применяться к языкам: если оба и являются языками, их конкатенация формально определяется как набор конкатенаций любой строки из и любой строки из. И снова точка конкатенации часто опускается для краткости. S {\ displaystyle S} Т {\ displaystyle T} S Т {\ Displaystyle S \ cdot T} S {\ displaystyle S} Т {\ displaystyle T} S Т знак равно { s т s S т Т } {\ Displaystyle S \ cdot T = \ {s \ cdot t \ mid s \ in S \ land t \ in T \}} {\ displaystyle \ cdot}

Язык, состоящий только из пустой строки, следует отличать от пустого языка. Конкатенация любой язык с бывшим не делает каких - либо изменений:, в то время как конкатенация с последним всегда дает пустой язык:. Стечение языков ассоциативно. { ε } {\ Displaystyle \ {\ varepsilon \}} { } {\ Displaystyle \ {\}} S { ε } знак равно S знак равно { ε } S {\ Displaystyle S \ cdot \ {\ varepsilon \} = S = \ {\ varepsilon \} \ cdot S} S { } знак равно { } знак равно { } S {\ Displaystyle S \ cdot \ {\} = \ {\} = \ {\} \ cdot S} S ( Т U ) знак равно ( S Т ) U {\ Displaystyle S \ CDOT (Т \ CDOT U) = (S \ CDOT T) \ CDOT U}

Например, сокращая набор всех трехзначных десятичных чисел, получается как. Набор всех десятичных чисел произвольной длины является примером бесконечного языка. D знак равно { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } {\ displaystyle D = \ {\ langle 0 \ rangle, \ langle 1 \ rangle, \ langle 2 \ rangle, \ langle 3 \ rangle, \ langle 4 \ rangle, \ langle 5 \ rangle, \ langle 6 \ rangle, \ langle 7 \ rangle, \ langle 8 \ rangle, \ langle 9 \ rangle \}} D D D {\ Displaystyle D \ cdot D \ cdot D}

Алфавит строки

Алфавит строки является набором всех символов, которые происходят в определенной последовательности. Если s - строка, ее алфавит обозначается как

Альф ( s ) {\ displaystyle \ operatorname {Alph} (s)}

Алфавит языка является множество всех символов, которые происходят в любой строке, формально:. S {\ displaystyle S} S {\ displaystyle S} Альф ( S ) знак равно s S Альф ( s ) {\ displaystyle \ operatorname {Alph} (S) = \ bigcup _ {s \ in S} \ operatorname {Alph} (s)}

Например, набор представляет собой алфавит строки, а приведенный выше - алфавит указанного выше языка, а также языка всех десятичных чисел. { а , c , о } {\ displaystyle \ {\ langle a \ rangle, \ langle c \ rangle, \ langle о \ rangle \}} c а c а о {\ Displaystyle \ langle какао \ rangle} D {\ displaystyle D} D D D {\ Displaystyle D \ cdot D \ cdot D}

Подстановка строк

Пусть L - язык, а Σ - его алфавит. Строка подстановки или просто подмена отображение F, которая отображает символы Е на языках (возможно, в другом алфавите). Так, например, для символа a ∈ Σ имеем f ( a) = L a, где L a ⊆ ∆ * - некоторый язык с алфавитом ∆. Это отображение может быть расширено до строк как

f (ε) = ε

для пустой строки ε и

f ( sa) = f ( s) f ( а)

для строки s ∈ L и символа a ∈ Σ. Подстановки строк могут быть распространены на целые языки как

ж ( L ) знак равно s L ж ( s ) {\ Displaystyle е (L) = \ bigcup _ {s \ in L} f (s)}

Обычные языки закрываются при подстановке строк. То есть, если каждый символ в алфавите обычного языка заменяется другим обычным языком, результатом все равно будет обычный язык. Точно так же контекстно-свободные языки закрываются при подстановке строк.

Простым примером является преобразование f uc (.) В верхний регистр, которое может быть определено, например, следующим образом:

персонаж сопоставлен с языком замечание
Икс f uc ( x)
lt; gt; {lt; gt;} сопоставить символ нижнего регистра с соответствующим символом верхнего регистра
lt; gt; {lt; gt;} сопоставить заглавные буквы себе
‹ Ss › {‹ SS ›} заглавные буквы отсутствуют, преобразовать в строку из двух символов
‹0› {ε} сопоставить цифру с пустой строкой
‹!› {} запретить пунктуацию, отобразить пустой язык
... аналогично для других символов

Для расширения f uc на строки мы имеем, например,

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

Для расширения f uc на языки, например,

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

Гомоморфизм струн

Струна гомоморфизм (часто называют просто как гомоморфизм в теории формальных языков ) является строкой замещения, так что каждый символ заменяется одной строкой. То есть, где - строка для каждого символа. ж ( а ) знак равно s {\ Displaystyle f (а) = s} s {\ displaystyle s} а {\ displaystyle a}

Струнные гомоморфизмы моноид морфизмов на свободном моноиде, сохраняющие пустую строку и бинарную операцию в конкатенации. С учетом языка, набор называется гомоморфное изображение из. Обратный гомоморфная строка определяются как L {\ displaystyle L} ж ( L ) {\ Displaystyle f (L)} L {\ displaystyle L} s {\ displaystyle s}

ж - 1 ( s ) знак равно { ш | ж ( ш ) знак равно s } {\ Displaystyle е ^ {- 1} (s) = \ {w | f (w) = s \}}

а обратный гомоморфный образ языка определяется как L {\ displaystyle L}

ж - 1 ( L ) знак равно { s | ж ( s ) L } {\ Displaystyle е ^ {- 1} (L) = \ {s | f (s) \ in L \}}

В общем, пока есть ж ( ж - 1 ( L ) ) L {\ Displaystyle е (е ^ {- 1} (L)) \ neq L}

ж ( ж - 1 ( L ) ) L {\ Displaystyle е (е ^ {- 1} (L)) \ substeq L}

и

L ж - 1 ( ж ( L ) ) {\ Displaystyle L \ substeq е ^ {- 1} (е (L))}

для любого языка. L {\ displaystyle L}

Класс регулярных языков замкнут относительно гомоморфизмов и обратных гомоморфизмов. Точно так же контекстно-свободные языки замкнуты относительно гомоморфизмов и обратных гомоморфизмов.

Гомоморфизм строк называется ε-свободным (или e-свободным), если для всех a в алфавите. Простые однобуквенные шифры подстановки являются примерами (ε-свободных) гомоморфизмов строк. ж ( а ) ε {\ Displaystyle е (а) \ neq \ varepsilon} Σ {\ displaystyle \ Sigma}

Пример строкового гомоморфизма g uc также можно получить, задав аналогично приведенной выше замене: g uc (‹a›) = ‹A›,..., g uc (‹0›) = ε, но оставив g uc неопределенным. по знакам препинания. Примеры обратных гомоморфных образов:

  • g uc −1 ({‹SSS›}) = {‹sss›, ‹sß›, ‹ßs›}, поскольку g uc (‹sss›) = g uc (‹sß›) = g uc (‹ßs›) = ‹SSS› и
  • g uc −1 ({‹A›, ‹bb›}) = {‹a›}, поскольку g uc (‹a›) = ‹A›, в то время как ‹bb› недоступен с помощью g uc.

Для последнего языка g uc ( g uc −1 ({‹A›, ‹bb›}) = g uc ({‹a›}) = {‹A›} ≠ {‹A›, ‹bb›}. Гомоморфизм g uc не является ε-свободным, поскольку он отображает eg ‹0› в ε.

Очень простой пример гомоморфизма строк, который отображает каждый символ только на символ, - это преобразование строки в кодировке EBCDIC в ASCII.

Проекция струны

Если s это строка, и является алфавитом, то строка проекция из S является строкой, что результаты, удалив все символы, которые не являются в. Он записывается как. Формально это определяется удалением символов с правой стороны: Σ {\ displaystyle \ Sigma} Σ {\ displaystyle \ Sigma} π Σ ( s ) {\ Displaystyle \ pi _ {\ Sigma} (s) \,}

π Σ ( s ) знак равно { ε если  s знак равно ε  пустая строка π Σ ( т ) если  s знак равно т а  и  а Σ π Σ ( т ) а если  s знак равно т а  и  а Σ {\ displaystyle \ pi _ {\ Sigma} (s) = {\ begin {cases} \ varepsilon amp; {\ t_dv {if}} s = \ varepsilon {\ t_dv {пустая строка}} \\\ pi _ {\ Sigma} (t) amp; {\ t_dv {if}} s = ta {\ t_dv {and}} a \ notin \ Sigma \\\ pi _ {\ Sigma} (t) a amp; {\ t_dv {if}} s = та {\ t_dv {и}} а \ in \ Sigma \ end {case}}}

Здесь обозначает пустую строку. Проекция строки по сути такая же, как и проекция в реляционной алгебре. ε {\ displaystyle \ varepsilon}

Строковую проекцию можно превратить в проекцию языка. Для формального языка L его проекция дается формулой

π Σ ( L ) знак равно { π Σ ( s )   |   s L } {\ Displaystyle \ pi _ {\ Sigma} (L) = \ {\ pi _ {\ Sigma} (s) \ \ vert \ s \ in L \}}

Правое частное

Правый фактор символа а из строки s является усечение символа а в строке s, с правой стороны. Он обозначается как. Если строка не имеет на правой стороне, то результат будет пустая строка. Таким образом: s / а {\ displaystyle s / a}

( s а ) / б знак равно { s если  а знак равно б ε если  а б {\ displaystyle (sa) / b = {\ begin {case} s amp; {\ t_dv {if}} a = b \\\ varepsilon amp; {\ t_dv {if}} a \ neq b \ end {cases}}}

Можно взять частное от пустой строки:

ε / а знак равно ε {\ Displaystyle \ varepsilon / а = \ varepsilon}

Точно так же, учитывая подмножество моноида, можно определить фактор-подмножество как S M {\ displaystyle S \ subset M} M {\ displaystyle M}

S / а знак равно { s M   |   s а S } {\ Displaystyle S / a = \ {s \ in M ​​\ \ vert \ sa \ in S \}}

Аналогично можно определить левые частные, при этом операции выполняются слева от строки.

Хопкрофт и Ульман (1979) определяют фактор L 1 / L 2 языков L 1 и L 2 по тому же алфавиту, как L 1 / L 2 = { s | ∃ t ∈ L 2. st ∈ L 1 }. Это не является обобщением приведенного выше определения, поскольку для строки s и различных символов a, b определение Хопкрофта и Уллмана подразумевает { sa } / { b }, дающее {}, а не {ε}.

Левое частное (определенное аналогично Хопкрофту и Ульману 1979) одноэлементного языка L 1 и произвольного языка L 2 известно как производная Бжозовского ; если L 2 представлен регулярным выражением, то может быть и левое частное.

Синтаксическое отношение

Право частного подмножества моноида определяет отношение эквивалентности, называемое правое синтаксическое соотношением из S. Это дается S M {\ displaystyle S \ subset M} M {\ displaystyle M}

S знак равно { ( s , т ) M × M   |   S / s знак равно S / т } {\ Displaystyle \ sim _ {S} \; \, = \, \ {(s, t) \ в M \ times M \ \ vert \ S / s = S / t \}}

Очевидно, что отношение имеет конечный индекс (имеет конечное число классов эквивалентности) тогда и только тогда, когда правые частные семейства конечны; то есть, если

{ S / м   |   м M } {\ Displaystyle \ {С / м \ \ верт \ м \ в М \}}

конечно. В случае, если M - моноид слов в некотором алфавите, тогда S будет регулярным языком, то есть языком, который может быть распознан конечным автоматом. Более подробно это обсуждается в статье о синтаксических моноидах.

Правильная отмена

Право отмены символа а из строки s является удаление первого вхождения символа а в строке s, начиная с правой стороны. Он обозначается как и рекурсивно определяется как s ÷ а {\ displaystyle s \ div a}

( s а ) ÷ б знак равно { s если  а знак равно б ( s ÷ б ) а если  а б {\ displaystyle (sa) \ div b = {\ begin {case} s amp; {\ t_dv {if}} a = b \\ (s \ div b) a amp; {\ t_dv {if}} a \ neq b \ end { case}}}

Пустая строка всегда может быть отменена:

ε ÷ а знак равно ε {\ Displaystyle \ varepsilon \ div a = \ varepsilon}

Понятно, что правильная отмена и проецирование сменяют друг друга :

π Σ ( s ) ÷ а знак равно π Σ ( s ÷ а ) {\ Displaystyle \ pi _ {\ Sigma} (s) \ div a = \ pi _ {\ Sigma} (s \ div a)}

Префиксы

В префиксов строки есть множество всех префиксов в строке, в отношении данного языка:

Pref L ( s ) знак равно { т   |   s знак равно т ты  для  т , ты Альф ( L ) * } {\ displaystyle \ operatorname {Pref} _ {L} (s) = \ {t \ \ vert \ s = tu {\ t_dv {for}} t, u \ in \ operatorname {Alph} (L) ^ {*} \}}

где. s L {\ displaystyle s \ in L}

Закрытия префикс языка является

Pref ( L ) знак равно s L Pref L ( s ) знак равно { т   |   s знак равно т ты ; s L ; т , ты Альф ( L ) * } {\ displaystyle \ operatorname {Pref} (L) = \ bigcup _ {s \ in L} \ operatorname {Pref} _ {L} (s) = \ left \ {t \ \ vert \ s = tu; s \ in L; t, и \ in \ operatorname {Альф} (L) ^ {*} \ right \}}

Пример: L знак равно { а б c }  затем  Pref ( L ) знак равно { ε , а , а б , а б c } {\ Displaystyle L = \ left \ {abc \ right \} {\ t_dv {then}} \ operatorname {Pref} (L) = \ left \ {\ varepsilon, a, ab, abc \ right \}}

Язык называется закрытым префиксом, если. Pref ( L ) знак равно L {\ displaystyle \ operatorname {Pref} (L) = L}

Оператор замыкания префикса идемпотентен :

Pref ( Pref ( L ) ) знак равно Pref ( L ) {\ displaystyle \ operatorname {Pref} (\ operatorname {Pref} (L)) = \ operatorname {Pref} (L)}

Приставка отношение является бинарным отношением, например, что, если и только если. Это отношение является частным примером порядка префиксов. {\ displaystyle \ sqsubseteq} s т {\ displaystyle s \ sqsubseteq t} s Pref L ( т ) {\ displaystyle s \ in \ operatorname {Pref} _ {L} (t)}

Смотрите также

Ноты

Ссылки

Последняя правка сделана 2023-03-21 08:49:25
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте