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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 12: Строка 12:
 
Приведём программу, разрешающую наш язык:
 
Приведём программу, разрешающую наш язык:
 
  <tex>p(i)</tex>
 
  <tex>p(i)</tex>
  '''if''' (остаток от деления i на 2 = 0)
+
  '''if''' остаток от деления i на 2 = 0
 
   '''return''' 1
 
   '''return''' 1
 
  '''else'''
 
  '''else'''
Строка 30: Строка 30:
 
Универсальный язык неразрешим.
 
Универсальный язык неразрешим.
 
|proof=
 
|proof=
Докажем от противного. </br>
+
Докажем от противного. <br/>
Пусть язык <tex> U </tex> разрешим. </br>
+
Пусть язык <tex> U </tex> разрешим. <br/>
Тогда существует такая программа <tex> u </tex>, что  
+
Тогда существует такая программа <tex> u </tex>, что <tex> \forall \langle p, x \rangle \in U: u(\langle p, x \rangle) = 1</tex>, а для <tex> \forall \langle p, x \rangle \notin U: u(\langle p, x \rangle) = 0</tex>. <br/>
  <tex>p(i)</tex>
+
Составим следующую программу:
  '''if''' (остаток от деления i на 2 = 0)
+
 
 +
  <tex>r(x)</tex>
 +
  '''if''' u(<x, x>) = 1
 +
  '''while''' true
 +
'''else'''
 
   '''return''' 1
 
   '''return''' 1
'''else'''
+
 
  '''return''' 0
+
Теперь рассмотрим вызов <tex> r(r) </tex>.
Программа нигде не может зависнуть и таким образом разрешает наш язык.
+
* Если <tex> u(\langle r, r \rangle) = 1 </tex>, то условие '''if''' выполнится и вызов зациклится. Но, <tex> u(\langle r, r \rangle) = 1 \Rightarrow r(r) = 1</tex>.
 +
* Если <tex> u(\langle r, r \rangle) = 0 </tex>, то условие '''if''' не выполнится и вызов вернёт <tex>1</tex>. Но, <tex> u(\langle r, r \rangle) = 0 \Rightarrow r(r) \ne 1</tex>.
 +
 
 +
Таким образом, из предположения о разрешимости универсального языка мы пришли к противоречию.
 
}}
 
}}

Версия 07:07, 14 декабря 2011

Определение:
Язык [math]L[/math] называется разрешимым (рекурсивным), если существует такая программа [math] p [/math], что [math] \forall w \in L: p(w) = 1[/math], а для [math] \forall w \notin L: p(w) = 0[/math].


Примеры

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

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

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

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

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

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


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

Докажем от противного.
Пусть язык [math] U [/math] разрешим.
Тогда существует такая программа [math] u [/math], что [math] \forall \langle p, x \rangle \in U: u(\langle p, x \rangle) = 1[/math], а для [math] \forall \langle p, x \rangle \notin U: u(\langle p, x \rangle) = 0[/math].
Составим следующую программу:

[math]r(x)[/math]
if u(<x, x>) = 1
  while true
else
  return 1

Теперь рассмотрим вызов [math] r(r) [/math].

  • Если [math] u(\langle r, r \rangle) = 1 [/math], то условие if выполнится и вызов зациклится. Но, [math] u(\langle r, r \rangle) = 1 \Rightarrow r(r) = 1[/math].
  • Если [math] u(\langle r, r \rangle) = 0 [/math], то условие if не выполнится и вызов вернёт [math]1[/math]. Но, [math] u(\langle r, r \rangle) = 0 \Rightarrow r(r) \ne 1[/math].
Таким образом, из предположения о разрешимости универсального языка мы пришли к противоречию.
[math]\triangleleft[/math]