Свойства перечислимых языков. Теорема Успенского-Райса — различия между версиями
(→Свойства языков) |
м (rollbackEdits.php mass rollback) |
||
(не показаны 64 промежуточные версии 9 участников) | |||
Строка 5: | Строка 5: | ||
|definition='''Свойством языков''' (англ. ''property of languages'') называется множество <tex> A \subset \mathrm {RE} </tex>. | |definition='''Свойством языков''' (англ. ''property of languages'') называется множество <tex> A \subset \mathrm {RE} </tex>. | ||
}} | }} | ||
− | |||
− | |||
− | |||
− | |||
{{Определение | {{Определение | ||
|definition=Свойство называется '''тривиальным''' (англ. ''trivial''), если <tex> A = \varnothing </tex> или <tex> A = \mathrm {RE} </tex>. | |definition=Свойство называется '''тривиальным''' (англ. ''trivial''), если <tex> A = \varnothing </tex> или <tex> A = \mathrm {RE} </tex>. | ||
}} | }} | ||
− | |||
− | |||
− | |||
− | |||
{{Определение | {{Определение | ||
|definition='''Язык свойства''' (англ. ''language of property'') <tex> A </tex> {{---}} множество программ, языки которых обладают этим свойством: <tex>L(A) \overset{\underset{\mathrm{def}}{}}{=} \lbrace p \mid L(p) \in A \rbrace </tex>. | |definition='''Язык свойства''' (англ. ''language of property'') <tex> A </tex> {{---}} множество программ, языки которых обладают этим свойством: <tex>L(A) \overset{\underset{\mathrm{def}}{}}{=} \lbrace p \mid L(p) \in A \rbrace </tex>. | ||
}} | }} | ||
− | + | ||
− | + | '''Отметим''', что принадлежность программы <tex>p</tex> языку свойства <tex>A</tex> можно выразить двумя эквивалентными утверждениями: | |
− | + | :<tex>L(p) \in A</tex> | |
− | + | :<tex>p \in L(A)</tex> | |
+ | Далее в конспекте будет употребляться <tex>p \in L(A)</tex>. | ||
+ | |||
{{Определение | {{Определение | ||
|definition=Свойство <tex> A </tex> называется '''разрешимым''' (англ. ''recursive''), если <tex>L(A) </tex> является [[Разрешимые_(рекурсивные)_языки|разрешимым]]. | |definition=Свойство <tex> A </tex> называется '''разрешимым''' (англ. ''recursive''), если <tex>L(A) </tex> является [[Разрешимые_(рекурсивные)_языки|разрешимым]]. | ||
}} | }} | ||
+ | === Примеры === | ||
+ | '''Примеры свойств''': | ||
+ | # Язык должен содержать слово ''hello''. | ||
+ | # Язык должен содержать хотя бы одно простое число. | ||
+ | |||
+ | Псевдокод для разрешителя <tex>L(A)</tex>, где <tex>A = \mathrm {RE}: </tex> | ||
+ | <tex>p_A(p_X)</tex> <font color="green"> // <tex>p_X</tex> {{---}} полуразрешитель некоторого языка</font> | ||
+ | '''return''' ''true'' | ||
+ | |||
+ | Псевдокод для программы в общем случае, то есть для проверки того, что язык удовлетворяет свойству : | ||
+ | <tex>p_A(p_X)</tex> | ||
+ | '''return''' <tex>p_X \in L(A)</tex> | ||
+ | |||
+ | Псевдокод полуразрешителя для языка свойства из первого примера: | ||
+ | <tex>p_A(p_X)</tex> <font color="green"> // <tex>X</tex> {{---}} перечислимый язык в общем случае, поэтому <tex>p_A</tex> {{---}} полуразрешитель (по [[Теорема Райса-Шапиро |теореме Райса-Шапиро]])</font> | ||
+ | '''return''' <tex>p_X</tex>('hello') | ||
== Теорема Успенского-Райса == | == Теорема Успенского-Райса == | ||
{{Теорема | {{Теорема | ||
|statement= | |statement= | ||
− | Язык никакого нетривиального свойства не является разрешимым. | + | Язык никакого нетривиального свойства <tex>A</tex> не является разрешимым. |
− | + | }} | |
− | Приведём доказательство от противного. | + | ===Доказательство=== |
− | + | Пусть <tex>p_\infty</tex> {{---}} всегда зацикливающийся алгоритм. | |
− | + | ||
+ | '''Рассмотрим случай, когда <tex>p_\infty \in L(A)</tex>.''' | ||
+ | |||
+ | Приведём доказательство от противного. Предположим, что <tex>A</tex> разрешимо. | ||
+ | |||
+ | Рассмотрим язык <tex>S</tex>, такой что <tex> S \in \overline{A}</tex> (такой язык существует, так как <tex>A</tex> {{---}} нетривиально). Тогда <tex>p_S \in L(\overline{A})</tex>. | ||
+ | |||
+ | Рассмотрим также произвольное перечислимое неразрешимое множество <tex>X</tex>. Пусть <tex>p_X(n)</tex> {{---}} полуразрешитель <tex>X</tex>. | ||
− | + | Зафиксируем произвольное <tex>n \in \mathbb{N}</tex> и построим следующую функцию | |
+ | <tex>V_n(x) = \begin{cases} | ||
+ | p_S(x), n \in X \\ | ||
+ | p_\infty(x), n \notin X \\ | ||
+ | \end{cases} </tex> | ||
− | + | '''function''' <tex>V_n</tex>(x): | |
+ | '''if''' <tex>p_X</tex>(n) == 1 | ||
+ | '''return''' <tex>p_S</tex>(x) | ||
+ | '''while''' ''true'' | ||
− | + | Получили, что если <tex>n \in X</tex>, то <tex>V_n \in L(\overline A)</tex>, а если <tex>n \notin X</tex>, то <tex>V_n \in L(A)</tex>. Таким образом, <tex>n \in X \iff V_n \in L(\overline A)</tex>. | |
− | <tex> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Так как <tex>\overline A</tex> {{---}} разрешимо, то можно проверить для любого <tex>V_n</tex>, лежит ли оно в <tex>L(\overline{A})</tex>. Но это тоже самое, что и проверка <tex>n \in X</tex>. Тогда можно для каждого <tex>n</tex> проверить, лежит ли оно в <tex>X</tex>, а следовательно и построить разрешитель для <tex>X</tex>. Так как <tex>X</tex> {{---}} неразрешимо, получили противоречие. | |
− | <tex> | ||
− | L( | ||
− | |||
− | |||
− | |||
− | </tex> | ||
− | + | '''Теперь рассмотрим случай, когда <tex>p_\infty \in L(\overline{A})</tex>.''' | |
− | Следовательно, < | + | |
− | + | Так как <tex>\overline{A}</tex> {{---}} нетривиально (как дополнение к нетривиальному множеству), то по первой части доказательства оно неразрешимо. Следовательно, <tex>A</tex> также неразрешимо. | |
− | + | ===Альтернативное доказательство с использованием теоремы о рекурсии=== | |
− | + | По [[Теорема о рекурсии | теореме о рекурсии]], программа может знать свой исходный код. Значит, в неё можно написать функцию <tex> \mathrm{getSrc()} </tex>, которая вернёт строку {{---}} исходный код программы. | |
− | + | ||
− | + | <tex> A </tex> {{---}} разрешимое семейство языков. | |
− | + | ||
− | + | <tex> L_A </tex> {{---}} множество программ, удовлетворяющих св-ву <tex> A </tex>. | |
− | </tex> | + | |
− | + | Теперь допустим, что язык <tex> L_A </tex> разрешим. Тогда напишем такую программу: | |
+ | |||
+ | <tex>propA(code){:}</tex> | ||
+ | // программа, разрешающее свойство языка <tex> A </tex> | ||
+ | <tex>f(x){:}</tex> | ||
+ | // такая программа <tex> f </tex>, что <tex>f \in A </tex>; существует потому что <tex> A </tex> {{---}} нетривиальное свойство | ||
+ | <tex>g(x){:}</tex> | ||
+ | // такая программа <tex> g </tex>, что <tex>g \notin A </tex>; существует потому что <tex> A </tex> {{---}} нетривиальное свойство | ||
+ | <tex>p(x){:}</tex> | ||
+ | '''if''' <tex>propA(\mathrm{getSrc()})</tex> | ||
+ | '''return''' <tex>g(x)</tex> | ||
+ | '''else''' | ||
+ | '''return''' <tex>f(x)</tex> | ||
+ | |||
+ | Если <tex> p </tex> не удовлетворяет свойству <tex> A </tex>, тогда будет выполняться всегда вторая ветка, и <tex> L(p) = L(f) </tex>. Но язык программы <tex> f </tex> принадлежит <tex> A </tex>. Получили противоречие. | ||
+ | |||
+ | Если <tex> p </tex> удовлетворяет свойству <tex> A </tex>, то <tex> L(p) = L(g) </tex>, а <tex> g \notin A </tex>. Опять получили противоречие. | ||
== См. также == | == См. также == | ||
Строка 77: | Строка 102: | ||
== Источники информации == | == Источники информации == | ||
* [https://en.wikipedia.org/wiki/Rice%27s_theorem Wikipedia — Rice's theorem] | * [https://en.wikipedia.org/wiki/Rice%27s_theorem Wikipedia — Rice's theorem] | ||
− | * Rice, H. G. | + | * Rice, H. G. {{---}} Classes of Recursively Enumerable Sets and Their Decision Problems." {{---}} Trans. Amer. Math. Soc. 74, 358-366, 1953. |
− | * Хопкрофт Д., Мотванн Р., Ульманн Д. Введение в теорию автоматов, языков и вычислений | + | * Хопкрофт Д., Мотванн Р., Ульманн Д. {{---}}Введение в теорию автоматов, языков и вычислений {{---}} стр. 397. |
+ | [[Категория: Теория формальных языков]] | ||
[[Категория: Теория вычислимости]] | [[Категория: Теория вычислимости]] | ||
− | [[Категория: | + | [[Категория: Разрешимые и перечислимые языки]] |
Текущая версия на 19:05, 4 сентября 2022
Содержание
Свойства языков
Рассмотрим множество всех перечислимых языков .
Определение: |
Свойством языков (англ. property of languages) называется множество | .
Определение: |
Свойство называется тривиальным (англ. trivial), если | или .
Определение: |
Язык свойства (англ. language of property) | — множество программ, языки которых обладают этим свойством: .
Отметим, что принадлежность программы языку свойства можно выразить двумя эквивалентными утверждениями:
Далее в конспекте будет употребляться
.
Определение: |
Свойство разрешимым. | называется разрешимым (англ. recursive), если является
Примеры
Примеры свойств:
- Язык должен содержать слово hello.
- Язык должен содержать хотя бы одно простое число.
Псевдокод для разрешителя
, где// — полуразрешитель некоторого языка return true
Псевдокод для программы в общем случае, то есть для проверки того, что язык удовлетворяет свойству :
return
Псевдокод полуразрешителя для языка свойства из первого примера:
теореме Райса-Шапиро) return ('hello')// — перечислимый язык в общем случае, поэтому — полуразрешитель (по
Теорема Успенского-Райса
Теорема: |
Язык никакого нетривиального свойства не является разрешимым. |
Доказательство
Пусть
— всегда зацикливающийся алгоритм.Рассмотрим случай, когда
.Приведём доказательство от противного. Предположим, что
разрешимо.Рассмотрим язык
, такой что (такой язык существует, так как — нетривиально). Тогда .Рассмотрим также произвольное перечислимое неразрешимое множество
. Пусть — полуразрешитель .Зафиксируем произвольное
и построим следующую функциюfunction(x): if (n) == 1 return (x) while true
Получили, что если
, то , а если , то . Таким образом, .Так как
— разрешимо, то можно проверить для любого , лежит ли оно в . Но это тоже самое, что и проверка . Тогда можно для каждого проверить, лежит ли оно в , а следовательно и построить разрешитель для . Так как — неразрешимо, получили противоречие.Теперь рассмотрим случай, когда
.Так как
— нетривиально (как дополнение к нетривиальному множеству), то по первой части доказательства оно неразрешимо. Следовательно, также неразрешимо.Альтернативное доказательство с использованием теоремы о рекурсии
По теореме о рекурсии, программа может знать свой исходный код. Значит, в неё можно написать функцию , которая вернёт строку — исходный код программы.
— разрешимое семейство языков.
— множество программ, удовлетворяющих св-ву .
Теперь допустим, что язык
разрешим. Тогда напишем такую программу:// программа, разрешающее свойство языка // такая программа , что ; существует потому что — нетривиальное свойство // такая программа , что ; существует потому что — нетривиальное свойство if return else return
Если
не удовлетворяет свойству , тогда будет выполняться всегда вторая ветка, и . Но язык программы принадлежит . Получили противоречие.Если
удовлетворяет свойству , то , а . Опять получили противоречие.См. также
Источники информации
- Wikipedia — Rice's theorem
- Rice, H. G. — Classes of Recursively Enumerable Sets and Their Decision Problems." — Trans. Amer. Math. Soc. 74, 358-366, 1953.
- Хопкрофт Д., Мотванн Р., Ульманн Д. —Введение в теорию автоматов, языков и вычислений — стр. 397.