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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Примеры неразрешимых множества)
Строка 1: Строка 1:
 
== Основные определения ==  
 
== Основные определения ==  
 
{{Определение
 
{{Определение
|definition= '''Рекурсивный язык''' (англ. ''recursive language'') <tex>L</tex> {{---}} язык, для которого существует программа <tex>p : \forall w \in L \Rightarrow p(w) = 1, \forall w \notin L \Rightarrow p(w) = 0</tex>.
+
|definition= '''Рекурсивный язык''' (англ. ''recursive language'') <tex>L</tex> {{---}} язык, для которого существует программа <tex>\{p \ | \ \forall w \in L \Rightarrow p(w) = 1, \forall w \notin L \Rightarrow p(w) = 0\}</tex>.
 
}}
 
}}
  
Строка 7: Строка 7:
  
 
{{Определение
 
{{Определение
|definition= Класс всех разрешимых (рекурсивных) языков часто обозначается буквой <tex> \mathrm{R} </tex>.
+
|definition = Язык <tex>L</tex> называется '''разрешимым''', если существует такая [http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D0%BC%D1%8B%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8 вычислимая] (англ. ''computable'') функция <tex>f : \Sigma^* \to \{0, 1\} : x \in L \Leftrightarrow f(x) = 1</tex>.
 
}}
 
}}
  
 
{{Определение
 
{{Определение
|definition = Функция <tex>f : N \rightarrow N \cup \lbrace \bot \rbrace</tex> называется '''вычислимой''' (англ. ''computable''), если существует программа <tex>p : \forall n \in D(f) \Rightarrow p(n) = f(n), \forall n \notin D(f) \Rightarrow p(n) = \bot </tex>.
+
|definition= '''Класс всех разрешимых (рекурсивных) языков''' (англ. ''Class of decidable (recursive) languages'') часто обозначается буквой <tex> \mathrm{R} </tex>.
 
}}
 
}}
  
 
{{Определение
 
{{Определение
|definition = Язык <tex>L</tex> называется ''разрешимым'', если существует такая вычислимая функция <tex>f : \Sigma^* \to \{0, 1\} : x \in L \leftrightarrow f(x) = 1</tex>.
+
|id=uni
 +
|definition='''Универсальный язык''' (англ. ''universal language'') <tex> \ U = \{\langle p, x \rangle \ |\ p(x) = 1\} </tex>.
 
}}
 
}}
  
{{Определение
+
На словах, ''универсальный язык'' можно определить следующим образом:
|id=uni
+
 
|definition='''Универсальный язык''' (англ. ''universal language'') <tex>\ U = \{\langle p, x \rangle \ |\ p(x) = 1\} </tex>.
+
''Универсальный язык'' {{---}} это язык всех пар "программа и её вход" таких, что программа на входе возвращает 1, входные данные программы и сама программа должны быть расположены над одним алфавитом.
}}
+
Так как программа {{---}} это набор строк, занумеровав которые, можем получить биекцию "число" <tex>\to</tex> "строка"
  
== Примеры разрешимых множеств ==
+
== Примеры разрешимых множества ==
{{Лемма
+
{{Утверждение
 
|id=st1
 
|id=st1
 
|statement=
 
|statement=
Строка 40: Строка 41:
  
  
{{Лемма
+
{{Утверждение
 
|statement=
 
|statement=
Множество всех рациональных чисел, меньших числа ''e'' (основания натуральных логарифмов), разрешимо.
+
Множество всех рациональных чисел, меньших числа <tex>e</tex> (основания натуральных логарифмов) или <tex>\pi</tex>, разрешимо.
 
|proof=
 
|proof=
Воспользуемся известной формулой для вычисления числа ''e'' <tex> = \sum \limits_{n=0}^{\infty} 1/n! </tex>, с помощью которой ''e'' может быть вычислено с произвольной точностью. Приведем программу, разрешающую данный вопрос:
+
Для чисел <tex>e, \pi</tex> существуют различные техники нахождения их точного представления, одна их которых описана в статье [http://www.mathpropress.com/stan/bibliography/spigot.pdf «A Spigot Algorithm for the Digits of Pi»]. Авторами алгоритма и его нарицателями являются американские математики Стенли Рабинович (Stanley Rabinowitz) и Стен Вэгон (Stan Wagon), которые создали свой алгоритм для нахождения цифр числа <tex>\pi</tex> в 1995 году. Сама же идея алгоритма вышла из-под пера некого Сейла (Sale) ещё в 1968 году, и предназначался тот алгоритм для нахождения цифр числа <tex>e</tex>.  
  
 +
Десятично представление рационального числа <tex>r</tex> может быть получено с любой точностью.
 +
 +
Приведем программу, разрешающую данную проблему для числа <tex>e</tex>:
 +
 
  <tex>p(r): </tex>
 
  <tex>p(r): </tex>
  <tex>int[] \ eDigits = getDigits(e) \ // \ array \ of \ digits \ e </tex>
+
  '''if''' (<tex>r</tex> < 2)
  <tex>int[] \ rDigits = getDigits(r) \ // \ array \ of \ digits \ r </tex>
+
  '''return''' 1
  <tex> \mathrm{for}</tex> (i = 0 to eDigits.length())
+
  '''if''' (<tex>r</tex> > 3)
   <tex> \mathrm{if} </tex> (rDigits[i] > eDigits[i])
+
  '''return''' 0
    <tex> \mathrm{return} \ 0 </tex>  
+
  '''for'''(i = 0;; ++i)
   <tex> \mathrm{if} </tex> (rDigits[i] < eDigits[i])
+
   '''if''' (getDigit(<tex>e</tex>, i) > getDigit(<tex>r</tex>, i))
    <tex> \mathrm{return} \ 1 </tex>
+
    '''return''' 1
Так как число ''e'' иррационально, то ответ будет найден.
+
   '''if''' (getDigit(<tex>e</tex>, i) < getDigit(<tex>r</tex>, i))
 +
    '''return''' 0
 +
Так как число ''e'' иррационально (не существует его рационального представления), то ответ будет найден.
 
}}
 
}}
  
== Примеры неразрешимых множеств ==
+
== Примеры неразрешимых множества ==
  
{{Лемма
+
{{Утверждение
 
|id=st1
 
|id=st1
 
|statement=
 
|statement=
Строка 71: Строка 78:
  
 
  <tex>r(x):</tex>
 
  <tex>r(x):</tex>
  <tex> \mathrm{if} \ u(\langle x, x \rangle) == 1 </tex>
+
  '''if''' <tex>u(\langle x, x \rangle) == 1 </tex>
   <tex>\mathrm{while} \ true </tex>
+
   '''while''' (true)
  <tex> \mathrm{else} </tex>
+
  '''else'''
   <tex>\mathrm{return} \ 1 </tex>
+
   '''return''' 1
  
 
Рассмотрим вызов <tex> r(r) </tex>:
 
Рассмотрим вызов <tex> r(r) </tex>:
Строка 87: Строка 94:
 
* [http://en.wikipedia.org/wiki/Recursive_language Wikipedia — Recursive language]
 
* [http://en.wikipedia.org/wiki/Recursive_language Wikipedia — Recursive language]
 
* [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»]
  
 
[[Категория: Теория формальных языков]]
 
[[Категория: Теория формальных языков]]
 
[[Категория: Теория вычислимости]]
 
[[Категория: Теория вычислимости]]

Версия 21:53, 9 января 2015

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

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


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


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


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


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


На словах, универсальный язык можно определить следующим образом:

Универсальный язык — это язык всех пар "программа и её вход" таких, что программа на входе возвращает 1, входные данные программы и сама программа должны быть расположены над одним алфавитом. Так как программа — это набор строк, занумеровав которые, можем получить биекцию "число" [math]\to[/math] "строка"

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

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

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

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


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

Для чисел [math]e, \pi[/math] существуют различные техники нахождения их точного представления, одна их которых описана в статье «A Spigot Algorithm for the Digits of Pi». Авторами алгоритма и его нарицателями являются американские математики Стенли Рабинович (Stanley Rabinowitz) и Стен Вэгон (Stan Wagon), которые создали свой алгоритм для нахождения цифр числа [math]\pi[/math] в 1995 году. Сама же идея алгоритма вышла из-под пера некого Сейла (Sale) ещё в 1968 году, и предназначался тот алгоритм для нахождения цифр числа [math]e[/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 = 0;; ++i)  
  if (getDigit([math]e[/math], i) > getDigit([math]r[/math], i))
    return 1
  if (getDigit([math]e[/math], i) < getDigit([math]r[/math], i))
    return 0
Так как число e иррационально (не существует его рационального представления), то ответ будет найден.
[math]\triangleleft[/math]

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

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

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

Пусть язык [math]U[/math] разрешим, тогда существует программа [math] u [/math] : [math] \forall \langle p, x \rangle \in U \Rightarrow u(\langle p, x \rangle) = 1[/math], [math] \forall \langle p, x \rangle \notin U \Rightarrow u(\langle p, x \rangle) = 0[/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]

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