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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Альтернативное доказательство)
(Альтернативное доказательство с использованием теоремы о рекурсии)
Строка 163: Строка 163:
 
Если же <tex> u(p, x) \neq 1 </tex>, то мы пойдём во вторую ветку условного оператора и вернём <tex> 1 </tex>, значит, пара <tex>  
 
Если же <tex> u(p, x) \neq 1 </tex>, то мы пойдём во вторую ветку условного оператора и вернём <tex> 1 </tex>, значит, пара <tex>  
 
\langle p, x \rangle </tex> принадлежит универсальному языку, но <tex> u(p, x) \neq 1 </tex>, значит, пара не принадлежит. Опять получили противоречие.
 
\langle p, x \rangle </tex> принадлежит универсальному языку, но <tex> u(p, x) \neq 1 </tex>, значит, пара не принадлежит. Опять получили противоречие.
 +
 +
===Пример использования теоремы о рекурсии в доказательстве о неразрешимости языка===
 +
Используя теорему о рекурсии, приведём простое доказательство неразрешимости языка <tex>L=\{p|p(\epsilon)=\perp\}</tex>.
 +
{{Лемма
 +
|id=st2
 +
|statement= Язык <tex>L=\{p|p(\epsilon)=\perp\}</tex> неразрешим.
 +
|proof=
 +
Предположим обратное, тогда существует программа <tex>r</tex> разрещающая <tex>L</tex>.
 +
Рассмотрим следущую программу:
 +
<code>
 +
p(x)
 +
  if r(p)
 +
      return 1
 +
  while true
 +
</code>
 +
Пусть <tex>p(\epsilon)=\perp</tex>. Тогда условие <tex>r(p)</tex> выполняется и <tex>p(\epsilon)=1</tex>. Противоречие. Если <tex>p(\epsilon) \ne \perp</tex>, то <tex>r(p)</tex> не выполняется и <tex>p(\epsilon)=\perp</tex>. Противоречие.
 +
}}
  
 
== Примечания ==  
 
== Примечания ==  

Версия 00:36, 26 декабря 2016

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

Определение:
Рекурсивный язык (англ. recursive language) L — язык, для которого существует программа p(w)={1, wL0, wL


Определение:
Язык L называется разрешимым, если существует такая вычислимая функция f:Σ{0,1}:xLf(x)=1.

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


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


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


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

Рассмотрим данное определение более детально, для чего докажем вспомогательную лемму:

Лемма:
Существует биекция между строками и натуральными числами.
Доказательство:
Приведем пример такой биекции: занумеруем подряд все строки длины 1, затем все строки длины 2 и так далее — нумерация названий столбцов в Excel, таким образом, каждому натуральному числу соответствует некоторая строка и наоборот.

Биекция между строками и натуральными числами нам нужна, чтобы передавать пары "текст программы, текст входных данных" в качестве аргументов функций. Передавать можно в следующем виде:

2code3input, где code, input — есть натуральные числа, соответствующие тексту программы и тексту входных данных соответственно.

Далее считаем, что входные данные программы и сама программа расположены над одним алфавитом Σ.

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

Утверждение:
Язык чётных чисел разрешим.

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

p(i):
  if i mod 2==0
    return 1
  else
    return 0
Заметим, что программа нигде не может зависнуть.


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

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

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

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

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

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

p0(i):
  return 1
p1(i):
  if i<1
    return 1
  else
    return 0
p2(i):  
  if i<2
    return 1
  else
    return 0

pk(i):  
  if i<k
    return 1
  else
    return 0

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

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

Утверждение:
Универсальный язык неразрешим.

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

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

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

u(p,x)={1, p,xU0, p,xU


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

r(x):
  if u(x,x)==1
    while true
  else
    return 1

Рассмотрим вызов r(r):

  • Eсли u(r,r)=1, то условие if выполнится и программа зависнет, но, так как программа u разрешает универсальный язык, u(r,r)=1r(r)=1;
  • Eсли u(r,r)=0, то условие if не выполнится и программа вернет 1, но, так как программа u разрешает универсальный язык, u(r,r)=0r(r)1.

Из предположения о разрешимости универсального языка мы пришли к противоречию.

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

По теореме о рекурсии, программа может знать свой исходный код. Значит, в неё можно написать функцию getSrc(), которая вернёт строку — исходный код программы. Допустим, что он разрешим. Тогда напишем такую программу:

 p(x):
   if u(getSrc(), x)
     while true
   else
     return 1

Если u(p,x)=1, тогда программа p на входе x должна вернуть 1, но по условию if она зависает, а следовательно, не принадлежит универсальному языку.

Если же u(p,x)1, то мы пойдём во вторую ветку условного оператора и вернём 1, значит, пара p,x принадлежит универсальному языку, но u(p,x)1, значит, пара не принадлежит. Опять получили противоречие.

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

Используя теорему о рекурсии, приведём простое доказательство неразрешимости языка L={p|p(ϵ)=⊥}.

Лемма:
Язык L={p|p(ϵ)=⊥} неразрешим.
Доказательство:

Предположим обратное, тогда существует программа r разрещающая L. Рассмотрим следущую программу:

p(x)
  if r(p)
     return 1
  while true

Пусть p(ϵ)=⊥. Тогда условие r(p) выполняется и p(ϵ)=1. Противоречие. Если p(ϵ)≠⊥, то r(p) не выполняется и p(ϵ)=⊥. Противоречие.

Примечания

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