Перечислимые языки — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м
м
Строка 6: Строка 6:
 
{{Определение
 
{{Определение
 
|definition =
 
|definition =
Полуразрешающая программа для языка <tex>L</tex> - программа, которая при подаче на вход слова из языка за конечное время завершится и вернет 1, а при подаче на вход слова не из языка может за конечное время вернуть 0, а может и зависнуть.
+
Полуразрешающая программа для языка <tex>L</tex> - программа, которая при подаче на вход слова из языка за конечное время завершится и вернет <tex>1</tex>, а при подаче на вход слова не из языка может за конечное время вернуть <tex>0</tex>, а может и зависнуть.
 
}}
 
}}
  
Строка 24: Строка 24:
 
Два определения перечислимого языка эквивалентны.
 
Два определения перечислимого языка эквивалентны.
 
|proof=
 
|proof=
Пусть имеется перечисляющая программа для языка, построим полуразрешающую. Сделаем это следующим образом. Получаем на вход некоторое слово <tex>w</tex>, запускаем перечисляющую программу. Если в процессе вывода слов встретится <tex>w</tex>, то завершаем работу, вернув 1. Таким образом при подаче на вход слова из языка построенная программа вернет 1 и завершится. Если же мы подадим на вход слово не из языка, то построенная программа будет работать бесконечно долго, что вполне устраивает. Таким образом полуразрешающая программа построена.
+
Пусть имеется перечисляющая программа для языка <tex>L</tex>, построим полуразрешающую. Сделаем это следующим образом. Получаем на вход некоторое слово <tex>w</tex>, запускаем перечисляющую программу. Если в процессе вывода слов встретится <tex>w</tex>, то завершаем работу, вернув <tex>1</tex>. Таким образом при подаче на вход слова из языка построенная программа вернет <tex>1</tex> и завершится. Если же мы подадим на вход слово не из языка, то построенная программа будет работать бесконечно долго, что вполне устраивает. Таким образом полуразрешающая программа построена.
  
Теперь пусть имеется полуразрешающая программа для языка, построим перечисляющую.  
+
Теперь пусть имеется полуразрешающая программа <tex>p</tex> для языка <tex>L</tex>, построим перечисляющую.
 +
 
 +
:    for <tex>TL</tex> = <tex>1</tex> .. <tex>+\infty</tex> {
 +
::    for <tex>length</tex> = <tex>1</tex> .. <tex>TL</tex> {
 +
:::  for <tex>w \in L</tex>, <tex>|w| = length</tex> {
 +
 
 +
::::  if <tex>p|_{TL}(w)=1</tex>
 +
::::: выводим <tex>w</tex>;
 +
:::}
 +
::}
 +
:}
 +
 
 +
Если слово <tex>w</tex> принадлежит языку, то условие <tex>p|_{TL}(w)=1</tex> будет выполнено для какого-то <tex>TL</tex>, а значит на выходе построенной программы рано или поздно появится <tex>w</tex>. Если же слово <tex>w</tex> не принадлежит языку, то <tex>p|_{TL}(w)=1</tex> ну будет выполнено ни для какого <tex>TL</tex>, а значит оно никогда не появится на выходе.
 +
 
 +
Таким образом мы построили перечисляющую программу.
 +
 
 +
В итоге теорема доказана.
 
}}
 
}}

Версия 23:20, 1 декабря 2010

Определение:
Перечисляющая программа для языка [math]L[/math] - программа, по очереди выводящая все слова языка [math]L[/math]. Если слово принадлежит языку, то программа за конечное время выдаст его на выходе. Слова, не принадлежащие языку, программа выводить не будет.


Определение:
Полуразрешающая программа для языка [math]L[/math] - программа, которая при подаче на вход слова из языка за конечное время завершится и вернет [math]1[/math], а при подаче на вход слова не из языка может за конечное время вернуть [math]0[/math], а может и зависнуть.


Определение:
Перечислимый язык - язык, для которого существует перечисляющая программа.


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


Теорема:
Два определения перечислимого языка эквивалентны.
Доказательство:
[math]\triangleright[/math]

Пусть имеется перечисляющая программа для языка [math]L[/math], построим полуразрешающую. Сделаем это следующим образом. Получаем на вход некоторое слово [math]w[/math], запускаем перечисляющую программу. Если в процессе вывода слов встретится [math]w[/math], то завершаем работу, вернув [math]1[/math]. Таким образом при подаче на вход слова из языка построенная программа вернет [math]1[/math] и завершится. Если же мы подадим на вход слово не из языка, то построенная программа будет работать бесконечно долго, что вполне устраивает. Таким образом полуразрешающая программа построена.

Теперь пусть имеется полуразрешающая программа [math]p[/math] для языка [math]L[/math], построим перечисляющую.

for [math]TL[/math] = [math]1[/math] .. [math]+\infty[/math] {
for [math]length[/math] = [math]1[/math] .. [math]TL[/math] {
for [math]w \in L[/math], [math]|w| = length[/math] {
if [math]p|_{TL}(w)=1[/math]
выводим [math]w[/math];
}
}
}

Если слово [math]w[/math] принадлежит языку, то условие [math]p|_{TL}(w)=1[/math] будет выполнено для какого-то [math]TL[/math], а значит на выходе построенной программы рано или поздно появится [math]w[/math]. Если же слово [math]w[/math] не принадлежит языку, то [math]p|_{TL}(w)=1[/math] ну будет выполнено ни для какого [math]TL[/math], а значит оно никогда не появится на выходе.

Таким образом мы построили перечисляющую программу.

В итоге теорема доказана.
[math]\triangleleft[/math]