Теорема Райса-Шапиро
Теорема Райса-Шапиро позволяет дать простое описание перечислимым свойствам языков.
Определение: |
Образцом называется конечное множество слов. |
Будем говорить, что язык удовлетворяет образцу
, если он содержит все слова . Также будем говорить, что язык удовлетворяет множеству образцов, если он удовлетворяет хотя бы одному образцу из этого множества.Заметим, что образцы являются конструктивными объектами, следовательно, можно говорить о разрешимых и перечислимых множествах образцов.
Теорема (Райса-Шапиро): |
Свойство языков перечислимо тогда и только тогда, когда существует перечислимое множество образцов , такое, что удовлетворяет тогда и только тогда, когда удовлетворяет . |
Доказательство в одну сторону тривиально: пусть
— перечислимое множество образцов. Будем обозначать за образец с номером , а за — элемент с номером образца с номером . Далее приведён код перечислителя , который принимает на вход код перечислителя и возвращает значение .A(L) for t = 1 tofor i = 1 to t ok true for j = 1 to if ok false if ok return true
Для доказательства в другую сторону понадобятся следующие леммы: {{Лемма
Строим доказательство от противного. Пусть G \in A, G \subset H, H \notin A, K — перечислимое неразрешимое множество. Построим следующую вычислимую функцию: f(x, y) = \begin{cases} x \in H & y \in K\\ x \in G & y \notin K \end{cases}
Вычисляется эта функция следующим образом: параллельно запускаем проверки x \in G и y \in K. Если x \in G, то x \in H, следовательно, функция возвращает единицу вне зависимости от y. Если y \in K, то запускаем проверку x \in H.
С помощью этой функции можно разрешить множество K следующим образом: для проверяемого элемента y подготовим программу g:
g(x):
return f(x, y)
После этого запустим параллельно проверки |statement= Пусть
— перечислимое свойство языков, . Тогда верно следствие: . |proof= Строим доказательство от противного. Пусть , , , — перечислимое неразрешимое множество. Построим следующую вычислимую функцию:Вычисляется эта функция следующим образом: параллельно запускаем проверки
и . Если , то , следовательно, функция возвращает единицу вне зависимости от . Если , то запускаем проверку .С помощью этой функции можно разрешить множество
следующим образом: для проверяемого элемента подготовим программу :g(x): return f(x, y)
После этого запустим параллельно проверки
и . Если , то первая проверка завершится. Иначе функция задаёт язык , который обладает свойством , следовательно, вторая проверка завершится, сигнализируя о том, что . Но не является разрешимым множеством, получено противоречие. }}Литература
- Верещагин Н. К., Шень A. Лекции по математической логике и теории алгоритмов. Часть 3. Вычислимые функции. — М.: МЦНМО, 1999. С. 134. ISBN 5-900916-36-7
- Хопкрофт Д., Мотвани Р., Ульман Д. Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — М.: Издательский дом «Вильямс», 2008. — С. 528 — ISBN 978-5-8459-1347-0 (рус.)