Замкнутость КС-языков относительно различных операций — различия между версиями
AMaltsev (обсуждение | вклад) м |
AMaltsev (обсуждение | вклад) м |
||
| Строка 13: | Строка 13: | ||
Построим [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|КС-грамматику]] для языка <tex> L_1 \cup L_2 </tex>. Для этого рассмотрим соответствующие КС-грамматики для языков <tex> L_1 </tex> и <tex> L_2 </tex>. Пусть стартовые символы в них имеют имена <tex> S </tex> и <tex> T </tex> соответственно. Тогда стартовый символ для <tex> L_1 \cup L_2 </tex> обозначим за <tex> S' </tex> и добавим правило <tex> S' \to S\,|\,T </tex>. | Построим [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|КС-грамматику]] для языка <tex> L_1 \cup L_2 </tex>. Для этого рассмотрим соответствующие КС-грамматики для языков <tex> L_1 </tex> и <tex> L_2 </tex>. Пусть стартовые символы в них имеют имена <tex> S </tex> и <tex> T </tex> соответственно. Тогда стартовый символ для <tex> L_1 \cup L_2 </tex> обозначим за <tex> S' </tex> и добавим правило <tex> S' \to S\,|\,T </tex>. | ||
| − | Покажем, что <tex> S' \Rightarrow^{*} w \iff S \Rightarrow^{*} w \lor T \Rightarrow^{*} w | + | Покажем, что <tex> S' \Rightarrow^{*} w \iff S \Rightarrow^{*} w \lor T \Rightarrow^{*} w </tex>. |
| − | + | <tex>\Rightarrow</tex> | |
| + | : Поскольку <tex> S \Rightarrow^{*} w </tex> и есть правило <tex> S' \to S </tex>, то, по определению <tex> \Rightarrow^{*} </tex> получаем, что <tex> S' \Rightarrow^{*} w </tex>. Аналогично и для <tex> T </tex>. | ||
| + | |||
| + | <tex>\Leftarrow </tex> | ||
| + | : Пусть <tex> S' \Rightarrow^{*} w </tex>. Поскольку <tex> S' \to S\,|\,T </tex> — единственные правила, в которых нетерминал <tex> S' </tex> присутствует в правой части, то это означает, что либо <tex> S' \Rightarrow S \Rightarrow^{*} w </tex>, либо <tex> S' \Rightarrow T \Rightarrow^{*} w </tex>. | ||
}} | }} | ||
| Строка 24: | Строка 28: | ||
|statement= <tex> L_1 L_2 </tex> — КС-язык. | |statement= <tex> L_1 L_2 </tex> — КС-язык. | ||
|proof=Аналогично предыдущему случаю построим КС-грамматику для языка <tex> L_1 L_2 </tex>. Для этого добавим правило <tex> S' \to S T </tex>, где <tex> S </tex> и <tex> T </tex> — стартовые символы языков <tex> L_1 </tex> и <tex> L_2 </tex> соответственно. | |proof=Аналогично предыдущему случаю построим КС-грамматику для языка <tex> L_1 L_2 </tex>. Для этого добавим правило <tex> S' \to S T </tex>, где <tex> S </tex> и <tex> T </tex> — стартовые символы языков <tex> L_1 </tex> и <tex> L_2 </tex> соответственно. | ||
| − | |||
}} | }} | ||
| Строка 34: | Строка 37: | ||
}} | }} | ||
| − | === Прямой и обратный | + | === [[Основные определения, связанные со строками#Гомоморфизм языков | Прямой и обратный гомоморфизмы]] === |
| − | [[Файл:Homo.png|300px|thumb|]] | + | [[Файл:Homo.png|300px|thumb|right]] |
| − | + | {{ Утверждение | |
| − | + | |statement= КС-языки замкнуты относительно прямого гомоморфизма. | |
| + | |proof= | ||
| + | Построим КС-грамматику, в которой каждый символ <tex> x \in \Sigma </tex> заменим на <tex> h(x) </tex>. | ||
| + | }} | ||
| + | {{ Утверждение | ||
| + | |statement= КС-языки замкнуты относительно обратного гомоморфизма. | ||
| + | |proof= | ||
Для доказательства замкнутости [[Основные определения: алфавит, слово, язык, конкатенация, свободный моноид слов; операции над языками#Гомоморфизм языков|обратного гомоморфизма]] будем делать аналогично [[Замкнутость регулярных языков относительно различных операций|доказательству]] для регулярных языков. Построим [[Автоматы с магазинной памятью|МП-автомат]] для <tex> h^{-1}(L) = \{ w \mid h(w) \in L \} </tex> на основе МП-автомата для языка <tex> L </tex> (назовем его <tex> M </tex>). Новый автомат <tex> M' </tex> будет действовать следующим образом: | Для доказательства замкнутости [[Основные определения: алфавит, слово, язык, конкатенация, свободный моноид слов; операции над языками#Гомоморфизм языков|обратного гомоморфизма]] будем делать аналогично [[Замкнутость регулярных языков относительно различных операций|доказательству]] для регулярных языков. Построим [[Автоматы с магазинной памятью|МП-автомат]] для <tex> h^{-1}(L) = \{ w \mid h(w) \in L \} </tex> на основе МП-автомата для языка <tex> L </tex> (назовем его <tex> M </tex>). Новый автомат <tex> M' </tex> будет действовать следующим образом: | ||
| Строка 56: | Строка 65: | ||
* Допускающими состояниями <tex> M' </tex> являются состояния <tex> (q, \varepsilon)</tex>, где <tex> q \in T </tex>. | * Допускающими состояниями <tex> M' </tex> являются состояния <tex> (q, \varepsilon)</tex>, где <tex> q \in T </tex>. | ||
Таким образом получаем, что <tex>(s, h(w), Z_0) \vdash_M^{*} (p, \varepsilon, \gamma) \Leftrightarrow ((s, \varepsilon), w, Z_0) \vdash_{M'}^{*} ((p, \varepsilon), \varepsilon, \gamma)</tex>, то есть автомат <tex> M' </tex> допускает те и только те слова, которые принадлежат языку <tex> h^{-1}(L) </tex>. | Таким образом получаем, что <tex>(s, h(w), Z_0) \vdash_M^{*} (p, \varepsilon, \gamma) \Leftrightarrow ((s, \varepsilon), w, Z_0) \vdash_{M'}^{*} ((p, \varepsilon), \varepsilon, \gamma)</tex>, то есть автомат <tex> M' </tex> допускает те и только те слова, которые принадлежат языку <tex> h^{-1}(L) </tex>. | ||
| − | + | }} | |
=== Разворот === | === Разворот === | ||
| − | + | {{ Утверждение | |
| + | |statement= <tex> L^{R} = \{ w^{R} \mid w \in L \}</tex> контекстно-свободна. | ||
| + | |proof= | ||
| + | Для того, чтобы построить <tex> L^{R} </tex>, необходимо развернуть все правые части правил грамматики для <tex> L </tex>. | ||
Покажем, что <tex>w \in L \iff w^{R} \in L^{R}</tex>. Докажем (<tex>\Rightarrow</tex>) индукцией по длине порождения в грамматике <tex>L</tex>. В обратную сторону (<tex>\Leftarrow</tex>) рассуждения аналогичны. | Покажем, что <tex>w \in L \iff w^{R} \in L^{R}</tex>. Докажем (<tex>\Rightarrow</tex>) индукцией по длине порождения в грамматике <tex>L</tex>. В обратную сторону (<tex>\Leftarrow</tex>) рассуждения аналогичны. | ||
| Строка 70: | Строка 82: | ||
'''Переход'''. Пусть в порождении <tex>n</tex> шагов, <tex>n > 1</tex>. Тогда оно имеет вид <tex>A \underset{L}{\Rightarrow}Y_1 Y_2...Y_m \underset{L}{\Rightarrow}^*w</tex>, где <tex> Y_i \in N \cup \Sigma </tex>. Цепочку <tex> w </tex> можно разбить на <tex>w_1 w_2...w_m</tex>, где <tex> Y_i \underset{L}{\Rightarrow}^*w_i</tex>. Так как каждое из порождений <tex> Y_i \underset{L}{\Rightarrow}^*w_i </tex> содержит менее <tex> n </tex> шагов, к ним можно применить предположение индукции и заключить, что <tex> Y_i \underset{L^{R}}{\Rightarrow}^*w_i^{R} </tex>. Так как <tex>A \underset{L}{\Rightarrow}Y_1 Y_2...Y_m</tex>, то <tex>A \underset{L^{R}}{\Rightarrow}Y_m Y_{m - 1}...Y_1</tex>, откуда следует, что <tex> A \underset{L^{R}}{\Rightarrow}^* w^{R} </tex>. | '''Переход'''. Пусть в порождении <tex>n</tex> шагов, <tex>n > 1</tex>. Тогда оно имеет вид <tex>A \underset{L}{\Rightarrow}Y_1 Y_2...Y_m \underset{L}{\Rightarrow}^*w</tex>, где <tex> Y_i \in N \cup \Sigma </tex>. Цепочку <tex> w </tex> можно разбить на <tex>w_1 w_2...w_m</tex>, где <tex> Y_i \underset{L}{\Rightarrow}^*w_i</tex>. Так как каждое из порождений <tex> Y_i \underset{L}{\Rightarrow}^*w_i </tex> содержит менее <tex> n </tex> шагов, к ним можно применить предположение индукции и заключить, что <tex> Y_i \underset{L^{R}}{\Rightarrow}^*w_i^{R} </tex>. Так как <tex>A \underset{L}{\Rightarrow}Y_1 Y_2...Y_m</tex>, то <tex>A \underset{L^{R}}{\Rightarrow}Y_m Y_{m - 1}...Y_1</tex>, откуда следует, что <tex> A \underset{L^{R}}{\Rightarrow}^* w^{R} </tex>. | ||
| − | + | }} | |
'''Пример разворота''': | '''Пример разворота''': | ||
| Строка 89: | Строка 101: | ||
{{ Утверждение | {{ Утверждение | ||
| − | |statement= Язык тандемных повторов <tex> L = \{ww \mid w \in \Sigma^{*} \} </tex> не является КС-языком | + | |statement= Язык тандемных повторов <tex> L = \{ww \mid w \in \Sigma^{*} \} </tex> не является КС-языком. |
| + | |proof= | ||
| + | Это доказывается с помощью [[Лемма о разрастании для КС-грамматик|леммы о разрастании]]. | ||
| + | }} | ||
| + | {{ Утверждение | ||
| + | |statement= Дополнение к языку тандемных повторов <tex>\overline{L}</tex> является КС-языком. | ||
|proof= | |proof= | ||
| − | |||
Для упрощения рассмотрим этот язык на бинарном алфавите <tex>\Sigma = \{a,b\}</tex>. | Для упрощения рассмотрим этот язык на бинарном алфавите <tex>\Sigma = \{a,b\}</tex>. | ||
| − | |||
| − | |||
| − | |||
Для <tex> \overline{L} </tex> можно составить следующую [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|КС-грамматику]] <tex>G</tex>: | Для <tex> \overline{L} </tex> можно составить следующую [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|КС-грамматику]] <tex>G</tex>: | ||
Версия 19:40, 6 ноября 2016
В отличие от регулярных языков, КС-языки не замкнуты относительно всех теоретико-множественных операций. К примеру, дополнение и пересечение КС-языков не обязательно являются КС-языками.
Здесь и далее считаем, что и — КС-языки.
Содержание
Операции с КС-языками
Объединение
| Утверждение: |
является КС-языком. |
|
Построим КС-грамматику для языка . Для этого рассмотрим соответствующие КС-грамматики для языков и . Пусть стартовые символы в них имеют имена и соответственно. Тогда стартовый символ для обозначим за и добавим правило . Покажем, что .
|
Конкатенация
| Утверждение: |
— КС-язык. |
| Аналогично предыдущему случаю построим КС-грамматику для языка . Для этого добавим правило , где и — стартовые символы языков и соответственно. |
Замыкание Клини
| Утверждение: |
— КС-язык. |
| Если — стартовый символ КС-грамматики для языка , то добавим в КС-грамматику для языка новый стартовый символ и правила . |
Прямой и обратный гомоморфизмы
| Утверждение: |
КС-языки замкнуты относительно прямого гомоморфизма. |
| Построим КС-грамматику, в которой каждый символ заменим на . |
| Утверждение: |
КС-языки замкнуты относительно обратного гомоморфизма. |
|
Для доказательства замкнутости обратного гомоморфизма будем делать аналогично доказательству для регулярных языков. Построим МП-автомат для на основе МП-автомата для языка (назовем его ). Новый автомат будет действовать следующим образом:
Если рассмотреть более формально, пусть , тогда .
|
Разворот
| Утверждение: |
контекстно-свободна. |
|
Для того, чтобы построить , необходимо развернуть все правые части правил грамматики для . Покажем, что . Докажем () индукцией по длине порождения в грамматике . В обратную сторону () рассуждения аналогичны. База. . В грамматике существует правило и, так как мы развернули все правые части правил, то . Предположение индукции. Пусть менее чем за шагов, тогда . Переход. Пусть в порождении шагов, . Тогда оно имеет вид , где . Цепочку можно разбить на , где . Так как каждое из порождений содержит менее шагов, к ним можно применить предположение индукции и заключить, что . Так как , то , откуда следует, что . |
Пример разворота:
Пусть задана КС-грамматика для языка со следующими правилами:
В таком случае КС-грамматика для языка выглядит следующим образом:
Дополнение, пересечение и разность
В отличие от регулярных языков, дополнение до КС-языка, пересечение КС-языков и разность КС-языков может не быть КС-языком.
| Утверждение: |
Язык тандемных повторов не является КС-языком. |
| Это доказывается с помощью леммы о разрастании. |
| Утверждение: |
Дополнение к языку тандемных повторов является КС-языком. |
|
Для упрощения рассмотрим этот язык на бинарном алфавите . Для можно составить следующую КС-грамматику : Докажем этот факт. Сначала заметим, что нетерминал порождает слова нечётной длины с центральным символом . В свою очередь нетерминал порождает слова нечётной длины с центральным символом . Таким образом, правило порождает все возможные слова нечётной длины. Докажем, что все слова, порождённые , есть в . , а также все слова нечётной длины не являются тандемными повторами. Рассмотрим произвольное слово чётной длины, сгенерированное при помощи правила . Пусть его часть, соответствующая , имеет длину , а часть, соответствующая , — длину . Таким образом, мы получили слово длины . Если оно является тандемным повтором, то символ, стоящий на позиции , должен быть равен символу на позиции . Но по построению это не так. Для правила доказательство аналогично. Докажем, что все слова из порождаются . С помощью можно вывести , а также любое слово нечётной длины. Далее рассмотрим произвольное слово чётной длины из . Докажем, что его можно разбить на два слова нечётной длины, имеющие различные центральные символы. Предположим, что это не так, то есть такого разбиения нет. Пусть это слово имеет длину . Тогда рассмотрим все его префиксы нечётной длины. Их центры находятся на позициях , а центры соответствующих им суффиксов — на позициях . Поскольку искомого разбиения не существует, то получается, что символ на позиции равен символу на позиции , символ на позиции равен символу на позиции , и так далее. Следовательно, первая половина слова равна его второй половине, т.е. оно является тандемных повтором. Получили противоречие, следовательно любое слово чётной длины из можно разделить на два слова нечётной длины с различными центральными символами. В свою очередь, такие слова могут быть сгенерированы при помощи грамматики и соединены при помощи правила . |
| Утверждение: |
Если , то не является КС-языком. |
|
По замкнутости КС-языков относительно конкатенации получаем, что и являются КС-языками. Но , что по лемме о разрастании для КС-языков не является КС-языком. |
Для разности достаточно заметить, что , поэтому разность КС-языков также необязательно является КС-языком.
Более того, задачи определения того, является ли дополнение КС-языка КС-языком и проверки непустоты пересечения КС-языков являются алгоритмически неразрешимыми.
Половины тандемных повторов
| Определение: |
Операция также не сохраняет КС-язык таковым. Покажем это на примере.
Рассмотрим язык .
Заметим, что он может быть сгенерирован при помощи следующей КС-грамматики:
Докажем, что не является КС-языком.
Пусть . Отсюда следует, что:
А значит, , и , и по лемме о разрастании КС-языком не является.
Операции над КС-языком и регулярным языком
Пересечение
Тем не менее, хоть пересечение двух КС-языков не обязательно является КС-языком, но пересечение КС-языка и регулярного языка — всегда КС-язык. Для доказательства этого построим МП-автомат для пересечения регулярного языка и КС-языка.
Пусть регулярный язык задан своим ДКА, а КС-язык — своим МП-автоматом c допуском по допускающему состоянию. Построим прямое произведение этих автоматов так же, как строилось прямое произведение для двух ДКА.
Более формально, пусть — регулярный язык, заданный своим ДКА , и — КС-язык, заданный своим МП-автоматом: . Тогда прямым произведением назовем следующий автомат:
- . Иначе говоря, состояние в новом автомате — пара из состояния первого автомата и состояния второго автомата.
- Стековый алфавит остается неизменным.
- . Допускающие состояния нового автомата — пары состояний, где оба состояния были допускающими в своем автомате.
- . При этом на стек кладется то, что положил бы изначальный МП-автомат при совершении перехода из состояния ,
видя на ленте символ и символ на вершине стека.
Этот автомат использует в качестве состояний пары из двух состояний каждого автомата, а за операции со стеком отвечает только МП-автомат. Слово допускается этим автоматом слово допускается и ДКА и МП-автоматом, то есть язык данного автомата совпадает с .
Разность
Разность КС-языка и регулярного языка выражается следующим образом: , а, поскольку регулярные языки замкнуты относительно дополнения, то разность можно выразить через пересечение.
См. также
- Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора
- Замкнутость регулярных языков относительно различных операций
- Основные определения, связанные со строками
Источники информации
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — C. 302-304 : ISBN 5-8459-0261-4 (рус.)