Замкнутость КС-языков относительно различных операций — различия между версиями
Строка 1: | Строка 1: | ||
− | В отличие от [[Замкнутость регулярных языков относительно различных операций|регулярных языков]], КС-языки не замкнуты относительно всех теоретико-множественных операций. К примеру, дополнение и пересечение КС-языков не обязательно являются КС-языками. | + | В отличие от [[Замкнутость регулярных языков относительно различных операций|регулярных языков]], [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|КС-языки]] не замкнуты относительно всех теоретико-множественных операций. К примеру, дополнение и пересечение КС-языков не обязательно являются КС-языками. |
− | Здесь и далее считаем, что <tex> L_1 и L_2 </tex> -- КС языки. | + | Здесь и далее считаем, что <tex> L_1 </tex> и <tex> L_2 </tex> -- КС языки. |
= Операции с КС-языками = | = Операции с КС-языками = | ||
Строка 22: | Строка 22: | ||
{{ Утверждение | {{ Утверждение | ||
− | |statement= <tex> L_1 L_2 </tex> -- КС-язык. | + | |statement= <tex> L_1 \cdot L_2 </tex> -- КС-язык. |
− | |proof=КС-грамматика для <tex> L_1 L_2 </tex> выглядит следующим образом: <tex> S' \to S T </tex>, и <tex> S </tex> -- стартовый символ. | + | |proof=КС-грамматика для <tex> L_1 \cdot L_2 </tex> выглядит следующим образом: <tex> S' \to S T </tex>, и <tex> S </tex> -- стартовый символ. |
Доказательство аналогично случаю с объединением. | Доказательство аналогично случаю с объединением. | ||
}} | }} | ||
Строка 36: | Строка 36: | ||
== Прямой и обратный гомоморфизм == | == Прямой и обратный гомоморфизм == | ||
− | В случае с прямым гомоморфизмом всё просто: строится КС-грамматика, в которой каждый символ <tex> x \in \Sigma </tex> заменяется на <tex> h(x) </tex>. Для обратного гомоморфизма | + | В случае с прямым гомоморфизмом всё просто: строится КС-грамматика, в которой каждый символ <tex> x \in \Sigma </tex> заменяется на <tex> h(x) </tex>. Для обратного гомоморфизма можно построить [[Автоматы с магазинной памятью|МП-автомат]] для <tex> h^{-1}(L) </tex> на основе МП-автомата для языка <tex> L </tex> (назовем его <tex> M </tex>). Считаем, что <tex> M </tex> допускает слова [[МП-автоматы, допуск по пустому стеку и по допускающему состоянию, эквивалентность|по пустому стеку]]. Новый автомат будет действовать следующим образом: |
+ | |||
+ | # Если входное слово закончилось, допускаем либо не допускаем его по пустому стеку. | ||
+ | # Иначе считываем символ <tex> x </tex>. | ||
+ | # Сохраняем <tex> h(x) </tex> в буффере. | ||
+ | # Запускаем <tex> M </tex> на слове, находящемся в буффере. | ||
+ | # После того, как <tex> M </tex> обработал весь буффер, переходим к пункту 2. | ||
+ | |||
+ | Пусть в автомате <tex> M </tex> было <tex> n </tex> состояний. Для того, чтобы научиться сохранять слова в буффере, создадим <tex> |\Sigma|^{k+1} n </tex> дополнительных состояний в новом автомате, где <tex> k = \max\limits_{c \in \Sigma} | h(c) | </tex>. Это позволит в состоянии кодировать слово, которое находится сейчас в буффере. Переходы в этих состояниях совершаются на основе того, что стоит на первом месте в буффере, состояния автомата и вершины стека. На ленту переходы в этих состояниях не смотрят. Из состояния, в котором буффер пуст, добавим <tex> \varepsilon </tex>-переход в начальное состояние. Необходима картинка. | ||
== Разворот == | == Разворот == | ||
Для того, чтобы построить КС-грамматику для языка <tex> L^{R} = \{ w^{R} \mid w \in L \} </tex>, необходимо развернуть все правые части правил грамматики для <tex> L </tex>. | Для того, чтобы построить КС-грамматику для языка <tex> L^{R} = \{ w^{R} \mid w \in L \} </tex>, необходимо развернуть все правые части правил грамматики для <tex> L </tex>. | ||
− | |||
− | |||
− | |||
− | |||
== Дополнение, пересечение и разность == | == Дополнение, пересечение и разность == | ||
Строка 54: | Строка 58: | ||
|proof= | |proof= | ||
− | То, что <tex> L </tex> -- не КС язык, доказывается с помощью леммы о | + | То, что <tex> L </tex> -- не КС язык, доказывается с помощью леммы о разрастании. Для <tex> \overline{L} </tex> можно составить [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|КС-грамматику]]. Предоставим это читателю в качестве упражнения. |
}} | }} | ||
Строка 62: | Строка 66: | ||
<tex> L_1 = \{ a^i b^i \} \cdot \{ c^j \}, L_2 = \{ a^i \} \cdot \{ b^j c^j \} </tex>. По замкнутости КС-языков относительно конкатенации получаем, что <tex> L_1 </tex> и <tex> L_2 </tex> являются КС-языками. | <tex> L_1 = \{ a^i b^i \} \cdot \{ c^j \}, L_2 = \{ a^i \} \cdot \{ b^j c^j \} </tex>. По замкнутости КС-языков относительно конкатенации получаем, что <tex> L_1 </tex> и <tex> L_2 </tex> являются КС-языками. | ||
− | Но <tex> L_1 \cap L_2 = \{ a^i b^i c^i \mid i \in \mathbb{N} \} </tex>, что по лемме о | + | Но <tex> L_1 \cap L_2 = \{ a^i b^i c^i \mid i \in \mathbb{N} \} </tex>, что по [[Лемма о разрастании для КС-грамматик|лемме о разрастании]] для КС-языков не является КС-языком. |
}} | }} | ||
Для разности достаточно заметить, что <tex> \overline{L} = \Sigma^{*} \setminus L </tex>, поэтому разность КС-языков также необязательно является КС-языком. | Для разности достаточно заметить, что <tex> \overline{L} = \Sigma^{*} \setminus L </tex>, поэтому разность КС-языков также необязательно является КС-языком. | ||
− | Более того, | + | Более того, задачи определения того, является ли дополнение КС-языка КС-языком и проверки непустоты пересечения КС-языков являются алгоритмически [[Разрешимые (рекурсивные) языки|неразрешимыми]]. |
== Примеры других операций == | == Примеры других операций == | ||
Строка 76: | Строка 80: | ||
}} | }} | ||
− | Операция <tex> Half </tex> также не сохраняет КС-язык таковым. Рассмотрим язык <tex> L = \{ a^n b a^n b a^m b a^l b a^k b a^k b \} </tex>. Посмотрим, что есть <tex> Half(L) </tex>. Пусть <tex> \alpha = a^n b a^n b a^m b a^l b a^k b a^k b = ww </tex>. Отсюда следует, что: | + | Операция <tex> Half </tex> также не сохраняет КС-язык таковым. Рассмотрим язык <tex> L = \{ a^n b a^n b a^m b a^l b a^k b a^k b \} </tex>. <tex> L </tex> -- КС-язык. Посмотрим, что есть <tex> Half(L) </tex>. Пусть <tex> \alpha = a^n b a^n b a^m b a^l b a^k b a^k b = ww </tex>. Отсюда следует, что: |
* <tex> n = l </tex> | * <tex> n = l </tex> | ||
* <tex> n = k </tex> | * <tex> n = k </tex> | ||
* <tex> m = k </tex> | * <tex> m = k </tex> | ||
− | А значит, <tex> n = l = k = m </tex>, и <tex> Half(L) = \{ a^n b a^n b a^n b \} </tex>, и по лемме о | + | А значит, <tex> n = l = k = m </tex>, и <tex> Half(L) = \{ a^n b a^n b a^n b \} </tex>, и по [[Лемма о разрастании для КС-грамматик|лемме о разрастании]] КС-языком не является. |
= Операции над КС-языком и регулярным языком = | = Операции над КС-языком и регулярным языком = | ||
+ | |||
+ | == Пересечение == | ||
Тем не менее, хоть пересечение двух КС-языков не обязательно является КС-языком, но пересечение КС-языка и регулярного языка -- всегда КС-язык. Для доказательства этого построим МП-автомат для пересечения регулярного языка и КС-языка. | Тем не менее, хоть пересечение двух КС-языков не обязательно является КС-языком, но пересечение КС-языка и регулярного языка -- всегда КС-язык. Для доказательства этого построим МП-автомат для пересечения регулярного языка и КС-языка. | ||
− | Пусть регулярный язык задан своим ДКА, а КС-язык -- своим МП-автоматом c допуском по допускающему состоянию. Построим прямое произведение этих автоматов также, как строилось прямое произведение для двух ДКА. | + | Пусть регулярный язык задан своим [[Детерминированные конечные автоматы|ДКА]], а КС-язык -- своим МП-автоматом c допуском по допускающему состоянию. Построим прямое произведение этих автоматов также, как строилось прямое произведение для двух ДКА. |
Более формально, пусть <tex> R </tex> -- регулярный язык, заданный своим ДКА <tex> \langle \Sigma, Q_1, s_1, T_1, \delta_1 \rangle </tex>, и <tex> L </tex> -- КС-язык, заданный своим МП-автоматом: <tex> \langle \Sigma, \Gamma, Q_2, s_2, T_2, z_0, \delta_2 \rangle </tex>. Тогда прямым произведением назовем следующий автомат: | Более формально, пусть <tex> R </tex> -- регулярный язык, заданный своим ДКА <tex> \langle \Sigma, Q_1, s_1, T_1, \delta_1 \rangle </tex>, и <tex> L </tex> -- КС-язык, заданный своим МП-автоматом: <tex> \langle \Sigma, \Gamma, Q_2, s_2, T_2, z_0, \delta_2 \rangle </tex>. Тогда прямым произведением назовем следующий автомат: | ||
Строка 97: | Строка 103: | ||
* <tex> \delta ( \langle q_1, q_2 \rangle, c, d) = \langle \delta_1 (q_1, c), \delta_2 (q_2, c, d) \rangle </tex>. При этом на стек кладется то, что положил бы изначальный МП-автомат при совершении перехода из состояния <tex> q_2 </tex>, | * <tex> \delta ( \langle q_1, q_2 \rangle, c, d) = \langle \delta_1 (q_1, c), \delta_2 (q_2, c, d) \rangle </tex>. При этом на стек кладется то, что положил бы изначальный МП-автомат при совершении перехода из состояния <tex> q_2 </tex>, | ||
видя на ленте символ <tex> c </tex> и символ <tex> d </tex> на вершине стека. | видя на ленте символ <tex> c </tex> и символ <tex> d </tex> на вершине стека. | ||
+ | |||
+ | Этот автомат использует в качестве состояний пары из двух состояний каждого автомата, а за операции со стеком отвечает только МП-автомат. Слово допускается этим автоматом <tex> \iff </tex> слово допускается и ДКА и МП-автоматом, то есть язык данного автомата совпадает с <tex> R \cap L </tex>. | ||
+ | |||
+ | == Разность == | ||
+ | |||
+ | Разность КС-языка и регулярного языка выражается следующим образом: <tex> L \setminus R = L \cap \overline{R} </tex>, а, поскольку регулярные языки замкнуты относительно дополнения, то разность можно выразить через пересечение. |
Версия 00:39, 20 декабря 2012
В отличие от регулярных языков, КС-языки не замкнуты относительно всех теоретико-множественных операций. К примеру, дополнение и пересечение КС-языков не обязательно являются КС-языками.
Здесь и далее считаем, что
и -- КС языки.Содержание
Операции с КС-языками
Объединение
Утверждение: |
также является КС-языком. |
Построим КС-грамматику для языка . Для этого рассмотрим соответствующие КС-грамматики для языков и . Пусть стартовые символы в них имеют имена и соответственно. Тогда стартовый символ для обозначим за и добавим правило .Покажем, что В обратную сторону, пусть . В левую сторону: коли и есть правило , то, по определению получаем, что . Аналогично и для . . Поскольку -- единственные правила, в которых нетерминал присутствует в правой части, а значит, либо , либо , что и требовалось доказать. |
Конкатенация
Утверждение: |
-- КС-язык. |
КС-грамматика для Доказательство аналогично случаю с объединением. выглядит следующим образом: , и -- стартовый символ. |
Замыкание Клини
Утверждение: |
-- КС-язык. |
Если | -- стартовый символ КС-грамматики для языка , то добавим в КС-грамматику для языка новый стартовый символ и правила .
Прямой и обратный гомоморфизм
В случае с прямым гомоморфизмом всё просто: строится КС-грамматика, в которой каждый символ МП-автомат для на основе МП-автомата для языка (назовем его ). Считаем, что допускает слова по пустому стеку. Новый автомат будет действовать следующим образом:
заменяется на . Для обратного гомоморфизма можно построить- Если входное слово закончилось, допускаем либо не допускаем его по пустому стеку.
- Иначе считываем символ .
- Сохраняем в буффере.
- Запускаем на слове, находящемся в буффере.
- После того, как обработал весь буффер, переходим к пункту 2.
Пусть в автомате
было состояний. Для того, чтобы научиться сохранять слова в буффере, создадим дополнительных состояний в новом автомате, где . Это позволит в состоянии кодировать слово, которое находится сейчас в буффере. Переходы в этих состояниях совершаются на основе того, что стоит на первом месте в буффере, состояния автомата и вершины стека. На ленту переходы в этих состояниях не смотрят. Из состояния, в котором буффер пуст, добавим -переход в начальное состояние. Необходима картинка.Разворот
Для того, чтобы построить КС-грамматику для языка
, необходимо развернуть все правые части правил грамматики для .Дополнение, пересечение и разность
В отличие от регулярных языков, дополнение до КС-языка, пересечение КС-языков и разность КС-языков может не быть КС-языком.
Утверждение: |
не является КС-языком, однако -- КС-язык. |
То, что КС-грамматику. Предоставим это читателю в качестве упражнения. | -- не КС язык, доказывается с помощью леммы о разрастании. Для можно составить
Утверждение: |
Если , то не является КС-языком. |
Но . По замкнутости КС-языков относительно конкатенации получаем, что и являются КС-языками. , что по лемме о разрастании для КС-языков не является КС-языком. |
Для разности достаточно заметить, что
, поэтому разность КС-языков также необязательно является КС-языком.Более того, задачи определения того, является ли дополнение КС-языка КС-языком и проверки непустоты пересечения КС-языков являются алгоритмически неразрешимыми.
Примеры других операций
Определение: |
Операция также не сохраняет КС-язык таковым. Рассмотрим язык . -- КС-язык. Посмотрим, что есть . Пусть . Отсюда следует, что:
А значит, лемме о разрастании КС-языком не является.
, и , и поОперации над КС-языком и регулярным языком
Пересечение
Тем не менее, хоть пересечение двух КС-языков не обязательно является КС-языком, но пересечение КС-языка и регулярного языка -- всегда КС-язык. Для доказательства этого построим МП-автомат для пересечения регулярного языка и КС-языка.
Пусть регулярный язык задан своим ДКА, а КС-язык -- своим МП-автоматом c допуском по допускающему состоянию. Построим прямое произведение этих автоматов также, как строилось прямое произведение для двух ДКА.
Более формально, пусть
-- регулярный язык, заданный своим ДКА , и -- КС-язык, заданный своим МП-автоматом: . Тогда прямым произведением назовем следующий автомат:- . Иначе говоря, состояние в новом автомате -- пара из состояния первого автомата и состояния второго автомата.
- Стековый алфавит остается неизменным.
- . Допускающие состояния нового автомата -- пары состояний, где оба состояния были допускающими в своем автомате.
- . При этом на стек кладется то, что положил бы изначальный МП-автомат при совершении перехода из состояния ,
видя на ленте символ
и символ на вершине стека.Этот автомат использует в качестве состояний пары из двух состояний каждого автомата, а за операции со стеком отвечает только МП-автомат. Слово допускается этим автоматом
слово допускается и ДКА и МП-автоматом, то есть язык данного автомата совпадает с .Разность
Разность КС-языка и регулярного языка выражается следующим образом:
, а, поскольку регулярные языки замкнуты относительно дополнения, то разность можно выразить через пересечение.