Свойства перечислимых языков. Теорема Успенского-Райса — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Свойства языков)
м (rollbackEdits.php mass rollback)
 
(не показаны 34 промежуточные версии 6 участников)
Строка 5: Строка 5:
 
|definition='''Свойством языков''' (англ. ''property of languages'') называется множество <tex> A \subset \mathrm {RE} </tex>.
 
|definition='''Свойством языков''' (англ. ''property of languages'') называется множество <tex> A \subset \mathrm {RE} </tex>.
 
}}
 
}}
'''Примеры свойств''':
 
* Язык должен содержать слово ''hello''.
 
* Язык должен содержать хотя бы одно простое число.
 
 
{{Определение
 
{{Определение
 
|definition=Свойство называется '''тривиальным''' (англ. ''trivial''), если <tex> A = \varnothing </tex> или <tex> A = \mathrm {RE} </tex>.
 
|definition=Свойство называется '''тривиальным''' (англ. ''trivial''), если <tex> A = \varnothing </tex> или <tex> A = \mathrm {RE} </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>L(p_X) \in A</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>p_A(p_X)</tex>
+
:<tex>L(p) \in A</tex>  
  '''return''' <tex>p_X</tex>('hello')
+
:<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> не является разрешимым.
|proof=
+
}}
Приведём доказательство от противного.
+
===Доказательство===
+
Пусть <tex>p_\infty</tex> {{---}} всегда зацикливающийся алгоритм.
Предположим, что <tex>A</tex> разрешимо и нетривиально, <tex>p_A</tex> {{---}} программа, разрешающая <tex>A</tex>.
+
 
 +
'''Рассмотрим случай, когда <tex>p_\infty \in L(A)</tex>.'''   
 +
 
 +
Приведём доказательство от противного. Предположим, что <tex>A</tex> разрешимо.
  
Не умаляя общности, можно считать, что <tex>\varnothing \notin A</tex> (в противном случае перейдём к <tex> \mathrm {RE} \setminus A</tex>, которое также будет разрешимым и нетривиальным, так как <tex> \mathrm {RE} \setminus A \neq \varnothing </tex>  и <tex> \mathrm {RE} \setminus A \neq \mathrm {RE} ) </tex>.  
+
Рассмотрим язык <tex>S</tex>, такой что <tex> S \in \overline{A}</tex> (такой язык существует, так как <tex>A</tex> {{---}} нетривиально). Тогда <tex>p_S \in L(\overline{A})</tex>.
  
Поскольку <tex>A</tex> непусто, то найдётся перечислимый язык <tex>X \in A</tex>. Пусть <tex>p_X</tex> {{---}} полуразрешитель <tex>X</tex>.
+
Рассмотрим также произвольное перечислимое неразрешимое множество <tex>X</tex>. Пусть <tex>p_X(n)</tex> {{---}} полуразрешитель <tex>X</tex>.
  
Рассмотрим вспомогательную программу: <tex> U(i,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>
  
Тогда для произвольных <tex>i</tex> и <tex> x </tex> можем написать такую программу.
+
'''function''' <tex>V_n</tex>(x):
<tex>g_{i,x}(y):</tex>
+
  '''if''' <tex>p_X</tex>(n) == 1
  '''if''' <tex>U(i, x)</tex> == 1
+
     '''return''' <tex>p_S</tex>(x)
     '''return''' <tex>p_X(y)</tex>
+
  '''while''' ''true''
  '''else'''
 
    '''while''' ''true''
 
  
Нетрудно понять, что в разумной модели вычислений номер этой программы можно вычислить по данным <tex>i</tex> и <tex>x</tex>. Значит, можно рассмотреть такую программу:
+
Получили, что если <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>US(\langle i, x \rangle )</tex>
 
  '''return''' <tex>p_A ( g_{i,x} ) </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(g_{i,x}) = \begin{cases}
 
  X, & U(i, x) = 1; \\
 
  \varnothing, & U(i, x) \neq 1; \\
 
\end{cases}
 
</tex>
 
  
Исключение пустого множества нам нужно чтобы различать <tex> X</tex> и пустое.
+
'''Теперь рассмотрим случай, когда <tex>p_\infty \in L(\overline{A})</tex>.'''
Следовательно, <br/> <tex>  
+
 
US(\langle i, x \rangle ) = p_A(g_{i,x}) = \begin{cases}
+
Так как <tex>\overline{A}</tex> {{---}} нетривиально (как дополнение к нетривиальному множеству), то по первой части доказательства оно неразрешимо. Следовательно, <tex>A</tex> также неразрешимо.
   p_A(p_X), &  U(i, x) = 1; \\
+
===Альтернативное доказательство с использованием теоремы о рекурсии===
   p_A(p_\varnothing ), & U(i, x) \neq 1; \\
+
По [[Теорема о рекурсии | теореме о рекурсии]], программа может знать свой исходный код. Значит, в неё можно написать функцию <tex> \mathrm{getSrc()} </tex>, которая вернёт строку {{---}} исходный код программы.
\end{cases} = \begin{cases}
+
 
  1, & U(i, x) = 1; \\
+
<tex> A </tex> {{---}} разрешимое семейство языков.
  0, & U(i, x) \neq 1; \\
+
 
\end{cases}
+
<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>. Опять получили противоречие.
  
 
== См. также ==
 
== См. также ==
Строка 82: Строка 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. "Classes of Recursively Enumerable Sets and Their Decision Problems." Trans. Amer. Math. Soc. 74, 358-366, 1953.
+
* Rice, H. G. {{---}} Classes of Recursively Enumerable Sets and Their Decision Problems." {{---}} Trans. Amer. Math. Soc. 74, 358-366, 1953.
* Хопкрофт Д., Мотванн Р., Ульманн Д. Введение в теорию автоматов, языков и вычислений страница 397.
+
* Хопкрофт Д., Мотванн Р., Ульманн Д. {{---}}Введение в теорию автоматов, языков и вычислений {{---}} стр. 397.
 +
[[Категория: Теория формальных языков]]
 
[[Категория: Теория вычислимости]]
 
[[Категория: Теория вычислимости]]
[[Категория: Теория формальных языков]]
+
[[Категория: Разрешимые и перечислимые языки]]

Текущая версия на 19:05, 4 сентября 2022

Свойства языков

Рассмотрим множество всех перечислимых языков [math] \mathrm {RE} [/math].

Определение:
Свойством языков (англ. property of languages) называется множество [math] A \subset \mathrm {RE} [/math].


Определение:
Свойство называется тривиальным (англ. trivial), если [math] A = \varnothing [/math] или [math] A = \mathrm {RE} [/math].


Определение:
Язык свойства (англ. language of property) [math] A [/math] — множество программ, языки которых обладают этим свойством: [math]L(A) \overset{\underset{\mathrm{def}}{}}{=} \lbrace p \mid L(p) \in A \rbrace [/math].


Отметим, что принадлежность программы [math]p[/math] языку свойства [math]A[/math] можно выразить двумя эквивалентными утверждениями:

[math]L(p) \in A[/math]
[math]p \in L(A)[/math]

Далее в конспекте будет употребляться [math]p \in L(A)[/math].


Определение:
Свойство [math] A [/math] называется разрешимым (англ. recursive), если [math]L(A) [/math] является разрешимым.

Примеры

Примеры свойств:

  1. Язык должен содержать слово hello.
  2. Язык должен содержать хотя бы одно простое число.

Псевдокод для разрешителя [math]L(A)[/math], где [math]A = \mathrm {RE}: [/math]

[math]p_A(p_X)[/math]  // [math]p_X[/math] — полуразрешитель некоторого языка
  return true

Псевдокод для программы в общем случае, то есть для проверки того, что язык удовлетворяет свойству :

[math]p_A(p_X)[/math] 
  return [math]p_X \in L(A)[/math]

Псевдокод полуразрешителя для языка свойства из первого примера:

[math]p_A(p_X)[/math]  // [math]X[/math] — перечислимый язык в общем случае, поэтому [math]p_A[/math] — полуразрешитель (по теореме Райса-Шапиро)
  return [math]p_X[/math]('hello')

Теорема Успенского-Райса

Теорема:
Язык никакого нетривиального свойства [math]A[/math] не является разрешимым.

Доказательство

Пусть [math]p_\infty[/math] — всегда зацикливающийся алгоритм.

Рассмотрим случай, когда [math]p_\infty \in L(A)[/math].

Приведём доказательство от противного. Предположим, что [math]A[/math] разрешимо.

Рассмотрим язык [math]S[/math], такой что [math] S \in \overline{A}[/math] (такой язык существует, так как [math]A[/math] — нетривиально). Тогда [math]p_S \in L(\overline{A})[/math].

Рассмотрим также произвольное перечислимое неразрешимое множество [math]X[/math]. Пусть [math]p_X(n)[/math] — полуразрешитель [math]X[/math].

Зафиксируем произвольное [math]n \in \mathbb{N}[/math] и построим следующую функцию [math]V_n(x) = \begin{cases} p_S(x), n \in X \\ p_\infty(x), n \notin X \\ \end{cases} [/math]

function [math]V_n[/math](x):
  if [math]p_X[/math](n) == 1
    return [math]p_S[/math](x)
  while true

Получили, что если [math]n \in X[/math], то [math]V_n \in L(\overline A)[/math], а если [math]n \notin X[/math], то [math]V_n \in L(A)[/math]. Таким образом, [math]n \in X \iff V_n \in L(\overline A)[/math].

Так как [math]\overline A[/math] — разрешимо, то можно проверить для любого [math]V_n[/math], лежит ли оно в [math]L(\overline{A})[/math]. Но это тоже самое, что и проверка [math]n \in X[/math]. Тогда можно для каждого [math]n[/math] проверить, лежит ли оно в [math]X[/math], а следовательно и построить разрешитель для [math]X[/math]. Так как [math]X[/math] — неразрешимо, получили противоречие.

Теперь рассмотрим случай, когда [math]p_\infty \in L(\overline{A})[/math].

Так как [math]\overline{A}[/math] — нетривиально (как дополнение к нетривиальному множеству), то по первой части доказательства оно неразрешимо. Следовательно, [math]A[/math] также неразрешимо.

Альтернативное доказательство с использованием теоремы о рекурсии

По теореме о рекурсии, программа может знать свой исходный код. Значит, в неё можно написать функцию [math] \mathrm{getSrc()} [/math], которая вернёт строку — исходный код программы.

[math] A [/math] — разрешимое семейство языков.

[math] L_A [/math] — множество программ, удовлетворяющих св-ву [math] A [/math].

Теперь допустим, что язык [math] L_A [/math] разрешим. Тогда напишем такую программу:

 [math]propA(code){:}[/math]
   // программа, разрешающее свойство языка [math] A [/math]
 [math]f(x){:}[/math]
   // такая программа [math] f [/math], что [math]f \in A [/math]; существует потому что [math] A [/math] — нетривиальное свойство
 [math]g(x){:}[/math]
   // такая программа [math] g [/math], что [math]g \notin A [/math]; существует потому что [math] A [/math] — нетривиальное свойство 
 [math]p(x){:}[/math]
   if [math]propA(\mathrm{getSrc()})[/math]
       return [math]g(x)[/math]
   else
       return [math]f(x)[/math]

Если [math] p [/math] не удовлетворяет свойству [math] A [/math], тогда будет выполняться всегда вторая ветка, и [math] L(p) = L(f) [/math]. Но язык программы [math] f [/math] принадлежит [math] A [/math]. Получили противоречие.

Если [math] p [/math] удовлетворяет свойству [math] A [/math], то [math] L(p) = L(g) [/math], а [math] g \notin A [/math]. Опять получили противоречие.

См. также

Источники информации

  • 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.