Разрешимые (рекурсивные) языки — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (Примеры разрешимых множества)
Строка 24: Строка 24:
 
}}
 
}}
  
Другими словами, ''универсальный язык'' {{---}} это язык всех программ и их входных данных, на которых программа возвращает <tex>1</tex>.  
+
Другими словами, ''универсальный язык'' {{---}} это язык всех пар "программа и её вход" таких, что программа на входе возвращает <tex>1</tex>.  
  
Программа {{---}} это набор строк, занумеровав которые, можем получить биекцию между строками и натуральными числами.
+
Так как в теории вычислимости нету структур данных, то для представления программы и её входных данных можно использовть число вида:
 +
 
 +
<tex>2^{\text{code}} * 3^{\text{input}}</tex>, где <tex>code, \ input</tex> {{---}} есть биекция между текстом программы, текстом входных данных и натуральным числом (например, можно занумеровать подряд все строки длинны <tex>1</tex>, затем все строки длинны <tex>2</tex> и так далее {{---}} нумерация названий столбцов в <tex>Excel</tex>).
  
 
Далее считаем, что входные данные программы и сама программа расположены над одним алфавитом <tex>\Sigma</tex>.
 
Далее считаем, что входные данные программы и сама программа расположены над одним алфавитом <tex>\Sigma</tex>.
Строка 51: Строка 53:
 
Множество всех рациональных чисел, меньших числа <tex>e</tex> (основания натуральных логарифмов) или <tex>\pi</tex>, разрешимо.
 
Множество всех рациональных чисел, меньших числа <tex>e</tex> (основания натуральных логарифмов) или <tex>\pi</tex>, разрешимо.
 
|proof=
 
|proof=
  Для чисел <tex>e, \ \pi</tex> существуют различные техники нахождения их точного представления, одна их которых описана в статье<ref>[http://www.mathpropress.com/stan/bibliography/spigot.pdf «A Spigot Algorithm for the Digits of Pi»] </ref>, таким образом, возможно получить необходимый знак чисел <tex>e, \ \pi</tex> за конечное время.  
+
  Для чисел <tex>e, \ \pi</tex> существуют различные техники нахождения их точного представления, одна их которых описана в [http://www.mathpropress.com/stan/bibliography/spigot.pdf статье], таким образом, возможно получить необходимый знак чисел <tex>e, \ \pi</tex> за конечное время.  
  
 
Десятичное представление рационального числа <tex>r</tex> может быть получено с любой точностью.  
 
Десятичное представление рационального числа <tex>r</tex> может быть получено с любой точностью.  
Строка 72: Строка 74:
 
{{Утверждение
 
{{Утверждение
 
|statement=
 
|statement=
множество тех <tex>n</tex>, для которых в числе <tex>\pi</tex> есть не менее <tex>n</tex> девяток подряд, разрешимо.
+
Множество тех <tex>n</tex>, для которых в числе <tex>\pi</tex> есть не менее <tex>n</tex> девяток подряд, разрешимо.
 
|proof=
 
|proof=
 
Предположим, что в числе <tex>\pi</tex> встречается <tex>k</tex> девяток подряд, тогда, логично, что встречается и любое число девяток меньших <tex>k</tex>.
 
Предположим, что в числе <tex>\pi</tex> встречается <tex>k</tex> девяток подряд, тогда, логично, что встречается и любое число девяток меньших <tex>k</tex>.
В таком случае, разрешитель будет выглядеть следующим образом:
 
<tex>p_k(i) {:} </tex>
 
  '''if''' <tex>i \leq k </tex>
 
    '''return''' 1
 
  '''else'''
 
    '''return''' 0
 
 
 
Рассмотрим все программы семейства:
 
Рассмотрим все программы семейства:
 
  <tex>p_0(i) {:} </tex>
 
  <tex>p_0(i) {:} </tex>
Строка 87: Строка 82:
  
 
  <tex>p_1(i) {:} </tex>
 
  <tex>p_1(i) {:} </tex>
   '''if''' <tex>i \leq 1 </tex>
+
   '''if''' <tex>i \leqslant 1 </tex>
 
     '''return''' 1
 
     '''return''' 1
 
   '''else'''
 
   '''else'''
Строка 93: Строка 88:
  
 
  <tex>p_2(i) {:} </tex>   
 
  <tex>p_2(i) {:} </tex>   
   '''if''' <tex>i \leq k </tex>
+
   '''if''' <tex>i \leqslant k </tex>
 
     '''return''' 1
 
     '''return''' 1
 
   '''else'''
 
   '''else'''
Строка 100: Строка 95:
 
<tex>\dots</tex>     
 
<tex>\dots</tex>     
  
  <tex>p_n(i) {:} </tex>   
+
  <tex>p_k(i) {:} </tex>   
   '''if''' <tex>i \leq n </tex>
+
   '''if''' <tex>i \leqslant k </tex>
 
     '''return''' 1
 
     '''return''' 1
 
   '''else'''
 
   '''else'''
 
     '''return''' 0
 
     '''return''' 0
 +
 +
<tex>\dots</tex>
 
   
 
   
 
По доказанному выше, какая-то программа из этого семейства будет разрешителем для искомого множества. Значит, искомое множество разрешимо.
 
По доказанному выше, какая-то программа из этого семейства будет разрешителем для искомого множества. Значит, искомое множество разрешимо.
Строка 131: Строка 128:
 
  <tex>r(x) {:} </tex>
 
  <tex>r(x) {:} </tex>
 
   '''if''' <tex>u(\langle x, x \rangle) == 1 </tex>
 
   '''if''' <tex>u(\langle x, x \rangle) == 1 </tex>
     '''while''' (true)
+
     '''while''' ''true''
 
   '''else'''
 
   '''else'''
 
     '''return''' 1
 
     '''return''' 1
Строка 141: Строка 138:
 
Из предположения о разрешимости универсального языка мы пришли к противоречию.
 
Из предположения о разрешимости универсального языка мы пришли к противоречию.
 
}}
 
}}
 
== Примечания ==
 
 
<references />
 
  
 
== Источники информации ==
 
== Источники информации ==
Строка 151: Строка 144:
 
* [http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA Википедия — Рекурсивный язык]
 
* [http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA Википедия — Рекурсивный язык]
 
* [http://www.mathpropress.com/stan/bibliography/spigot.pdf «A Spigot Algorithm for the Digits of Pi»]
 
* [http://www.mathpropress.com/stan/bibliography/spigot.pdf «A Spigot Algorithm for the Digits of Pi»]
 +
  
 
[[Категория: Теория формальных языков]]
 
[[Категория: Теория формальных языков]]
 
[[Категория: Теория вычислимости]]
 
[[Категория: Теория вычислимости]]

Версия 02:37, 12 января 2015

Основные определения

Определение:
Рекурсивный язык (англ. recursive language) [math]L[/math] — язык, для которого существует программа [math]p(w) = \begin{cases} 1, \ w \in L \\ 0, \ w \notin L \end{cases} [/math]


Определение:
Язык [math]L[/math] называется разрешимым, если существует такая вычислимая функция [math]f : \Sigma^* \to \{0, 1\} : x \in L \Leftrightarrow f(x) = 1[/math].

Если мы рассматриваем язык [math]L[/math] как проблему, то проблема называется разрешимой, если язык [math]L[/math] рекурсивный. В противном случае проблема называется неразрешимой. Но часто данные понятия просто отождествляются.


Определение:
Класс всех разрешимых (рекурсивных) языков (англ. Class of decidable (recursive) languages) часто обозначается буквой [math] \mathrm{R} [/math].


Определение:
Универсальный язык (англ. universal language) [math] \ U = \{\langle p, x \rangle \ |\ p(x) = 1\} [/math].


Другими словами, универсальный язык — это язык всех пар "программа и её вход" таких, что программа на входе возвращает [math]1[/math].

Так как в теории вычислимости нету структур данных, то для представления программы и её входных данных можно использовть число вида:

[math]2^{\text{code}} * 3^{\text{input}}[/math], где [math]code, \ input[/math] — есть биекция между текстом программы, текстом входных данных и натуральным числом (например, можно занумеровать подряд все строки длинны [math]1[/math], затем все строки длинны [math]2[/math] и так далее — нумерация названий столбцов в [math]Excel[/math]).

Далее считаем, что входные данные программы и сама программа расположены над одним алфавитом [math]\Sigma[/math].

Примеры разрешимых множества

Утверждение:
Язык чётных чисел разрешим.
[math]\triangleright[/math]

Приведём программу, разрешающую язык чётных чисел:

[math]p(i) {:} [/math]
  if [math]i \ \bmod \ 2 == 0 [/math]
    return 1
  else
    return 0
Заметим, что программа нигде не может зависнуть.
[math]\triangleleft[/math]


Утверждение:
Множество всех рациональных чисел, меньших числа [math]e[/math] (основания натуральных логарифмов) или [math]\pi[/math], разрешимо.
[math]\triangleright[/math]

Для чисел [math]e, \ \pi[/math] существуют различные техники нахождения их точного представления, одна их которых описана в статье, таким образом, возможно получить необходимый знак чисел [math]e, \ \pi[/math] за конечное время.

Десятичное представление рационального числа [math]r[/math] может быть получено с любой точностью.

Приведем программу, разрешающую данную проблему для числа [math]e[/math]:

[math]p(r) {:} [/math]
  if ([math]r[/math] < 2)
    return 1
  if ([math]r[/math] > 3)
    return 0
  for (i = 1 .. [math]\infty [/math])  
    if (getDigit([math]e[/math], i) > getDigit([math]r[/math], i))  // getDigit — функция, которая получает i-ый бит вещественной части переданного числа
      return 1
    if (getDigit([math]e[/math], i) < getDigit([math]r[/math], i))
      return 0
Так как число [math]e[/math] иррационально, то ответ будет найден за конечное время.
[math]\triangleleft[/math]
Утверждение:
Множество тех [math]n[/math], для которых в числе [math]\pi[/math] есть не менее [math]n[/math] девяток подряд, разрешимо.
[math]\triangleright[/math]

Предположим, что в числе [math]\pi[/math] встречается [math]k[/math] девяток подряд, тогда, логично, что встречается и любое число девяток меньших [math]k[/math]. Рассмотрим все программы семейства:

[math]p_0(i) {:} [/math]
  return 1
[math]p_1(i) {:} [/math]
  if [math]i \leqslant 1 [/math]
    return 1
  else
    return 0
[math]p_2(i) {:} [/math]  
  if [math]i \leqslant k [/math]
    return 1
  else
    return 0

[math]\dots[/math]

[math]p_k(i) {:} [/math]  
  if [math]i \leqslant k [/math]
    return 1
  else
    return 0

[math]\dots[/math]

По доказанному выше, какая-то программа из этого семейства будет разрешителем для искомого множества. Значит, искомое множество разрешимо.
[math]\triangleleft[/math]

Примеры неразрешимых множества

Утверждение:
Универсальный язык неразрешим.
[math]\triangleright[/math]

Приведём доказательство от противного.

Пусть язык [math]U[/math] разрешим, тогда существует программа

[math]u(\langle p, x \rangle) = \begin{cases} 1, \ \langle p, x \rangle \in U \\ 0, \ \langle p, x \rangle \notin U \end{cases} [/math]


Составим следующую программу:

[math]r(x) {:} [/math]
  if [math]u(\langle x, x \rangle) == 1 [/math]
    while true
  else
    return 1

Рассмотрим вызов [math] r(r) [/math]:

  • Eсли [math] u(\langle r, r \rangle) = 1 [/math], то условие [math]\mathrm{if}[/math] выполнится и программа зависнет, но, так как программа [math] u [/math] разрешает универсальный язык, [math] u(\langle r, r \rangle) = 1 \Rightarrow r(r) = 1[/math];
  • Eсли [math] u(\langle r, r \rangle) = 0 [/math], то условие [math]\mathrm{if}[/math] не выполнится и программа вернет [math]1[/math], но, так как программа [math] u [/math] разрешает универсальный язык, [math] u(\langle r, r \rangle) = 0 \Rightarrow r(r) \ne 1[/math].
Из предположения о разрешимости универсального языка мы пришли к противоречию.
[math]\triangleleft[/math]

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