В информатике , в области формальной теории языка , часто используются различные строковые функции ; однако, используемая нотация отличается от той, которая используется в компьютерном программировании , и некоторые часто используемые функции в теоретической области редко используются при программировании. В этой статье определяются некоторые из этих основных терминов.
Строка — это конечная последовательность символов. Пустая строка обозначается как . Конкатенация двух строк и обозначается как , или короче как . Конкатенация с пустой строкой не имеет значения: . Конкатенация строк ассоциативна : .
Например, .
Язык — это конечный или бесконечный набор строк. Помимо обычных операций над множествами, таких как объединение, пересечение и т. д., к языкам может применяться конкатенация: если и являются языками, их конкатенация определяется как набор конкатенаций любой строки из и любой строки из , формально . Опять же, точка конкатенации часто опускается для краткости.
Язык, состоящий только из пустой строки, следует отличать от пустого языка . Конкатенация любого языка с первым не вносит никаких изменений: , тогда как конкатенация со вторым всегда дает пустой язык: . Конкатенация языков ассоциативна: .
Например, сокращая , множество всех трехзначных десятичных чисел получается как . Множество всех десятичных чисел произвольной длины является примером для бесконечного языка.
Алфавит строки — это набор всех символов, которые встречаются в определенной строке. Если s — строка, ее алфавит обозначается как
Алфавит языка — это набор всех символов, которые встречаются в любой строке , формально: .
Например, множество — это алфавит строки , а указанное выше — это алфавит указанного выше языка, а также языка всех десятичных чисел.
Пусть L — язык , а Σ — его алфавит. Подстановка строк или просто подстановка — это отображение f , которое отображает символы из Σ в языки (возможно, в другом алфавите). Таким образом, например, для символа a ∈ Σ, имеем f ( a )= L a , где L a ⊆ Δ * — некоторый язык, алфавит которого — Δ. Это отображение можно расширить до строк следующим образом:
для пустой строки ε, и
для строки s ∈ L и символа a ∈ Σ. Подстановки строк могут быть расширены на целые языки как [1]
Регулярные языки закрыты относительно замены строк. То есть, если каждый символ в алфавите регулярного языка заменить другим регулярным языком, результатом все равно будет регулярный язык. [2] Аналогично, контекстно-свободные языки закрыты относительно замены строк. [3] [примечание 1]
Простым примером является преобразование f uc (.) в верхний регистр, которое можно определить, например, следующим образом:
Для расширения f uc на строки мы имеем, например,
Для расширения f uc на языки мы имеем, например,
Гомоморфизм строк ( часто называемый просто гомоморфизмом в формальной теории языка ) — это подстановка строк, при которой каждый символ заменяется одной строкой. То есть, , где — строка, для каждого символа . [примечание 2] [4]
Гомоморфизмы строк — это моноидные морфизмы на свободном моноиде , сохраняющие пустую строку и бинарную операцию конкатенации строк . При наличии языка множество называется гомоморфным образом . Обратный гомоморфный образ строки определяется как
в то время как обратный гомоморфный образ языка определяется как
В общем, в то время как у кого-то есть
и
для любого языка .
Класс регулярных языков замкнут относительно гомоморфизмов и обратных гомоморфизмов. [5] Аналогично, контекстно-свободные языки замкнуты относительно гомоморфизмов [примечание 3] и обратных гомоморфизмов. [6]
Гомоморфизм строк называется ε-свободным (или e-свободным), если для всех a в алфавите . Простые однобуквенные подстановочные шифры являются примерами (ε-свободных) гомоморфизмов строк.
Пример гомоморфизма строки g uc также может быть получен путем определения, аналогичного приведенной выше замене: g uc (‹a›) = ‹A›, ..., g uc (‹0›) = ε, но позволяя g uc быть неопределенным на знаках препинания. Примерами обратных гомоморфных образов являются
Для последнего языка g uc ( g uc −1 ({ ‹A›, ‹bb› })) = g uc ({ ‹a› }) = { ‹A› } ≠ { ‹A›, ‹bb› }. Гомоморфизм g uc не является ε-свободным, поскольку он отображает, например, ‹0› в ε.
Очень простой пример гомоморфизма строк, который сопоставляет каждый символ просто с символом, — это преобразование строки в кодировке EBCDIC в ASCII .
Если s — строка, а — алфавит, строковая проекция s — это строка, которая получается путем удаления всех символов, отсутствующих в . Она записывается как . Формально она определяется путем удаления символов с правой стороны:
Здесь обозначает пустую строку . Проекция строки по сути то же самое, что и проекция в реляционной алгебре .
Проекция строки может быть повышена до проекции языка . Если задан формальный язык L , его проекция задается как
Правое частное символа a из строки s — это усечение символа a в строке s с правой стороны. Оно обозначается как . Если строка не имеет a с правой стороны, результатом будет пустая строка. Таким образом:
Частное от пустой строки можно взять:
Аналогично, если задано подмножество моноида , можно определить фактор-подмножество как
Аналогичным образом можно определить левые частные , при этом операции выполняются слева от строки. [ необходима ссылка ]
Хопкрофт и Ульман (1979) определяют частное L 1 / L 2 языков L 1 и L 2 по одному и тому же алфавиту как L 1 / L 2 = { s | ∃ t ∈ L 2 . st ∈ L 1 } . [7] Это не обобщение приведенного выше определения, поскольку для строки s и различных символов a , b определение Хопкрофта и Ульмана подразумеваетчто дает {}, а не { ε }.
Левое частное (определенное аналогично Хопкрофту и Ульману 1979) одноэлементного языка L 1 и произвольного языка L 2 известно как производная Бжозовского ; если L 2 представлен регулярным выражением , то таким же может быть и левое частное. [8]
Правое частное подмножества моноида определяет отношение эквивалентности , называемое правым синтаксическим отношением S. Оно задается как
Отношение, очевидно, имеет конечный индекс (имеет конечное число классов эквивалентности) тогда и только тогда, когда семейство правых частных конечно, то есть, если
конечен. В случае, если M — моноид слов над некоторым алфавитом, S — регулярный язык , то есть язык, который может быть распознан конечным автоматом . Это более подробно обсуждается в статье о синтаксических моноидах . [ требуется ссылка ]
Правое удаление символа a из строки s — это удаление первого вхождения символа a в строку s , начиная с правой стороны. Оно обозначается как и рекурсивно определяется как
Пустую строку всегда можно отменить:
Очевидно, что правильное аннулирование и проекция коммутируют :
Префиксы строки — это набор всех префиксов строки относительно данного языка:
где .
Префиксное закрытие языка — это
Пример:
Язык называется префиксно закрытым, если .
Оператор замыкания префикса является идемпотентным :
Префиксное отношение является бинарным отношением, таким, что тогда и только тогда, когда . Это отношение является частным примером префиксного порядка . [ требуется ссылка ]