Існування універсальних обчислювачів. Алгоритмічні проблеми
і взаємозв'язок алгоритмічних систем. h2>
Існування універсальних обчислювачів. h2>
Тепер
замислимося ось про що. Кожного разу, коли ми будували програму для нової Машини
Тьюринга, навіть якщо ми при цьому використовували програми для інших машин, не
явно передбачалося, що якось, десь, кимось будувалася каретка, що володіє
заданим набором станів, здатна розпізнавати і записувати символи з
заданого алфавіту і т.п. Побудова такої каретки - сама по собі завдання не з
простих. Для кожного нового алгоритму ми змушені будувати новий виконавець.
Це виглядає приблизно так, як якщо б для кожної нової програми нам треба було
будувати новий комп'ютер. p>
А
чи не можна побудувати такий виконавець, який був би здатний виконати будь-який
алгоритм, заданий у вигляді програми для Машини Тьюринга? Позитивна відповідь на
це питання був би математичним обгрунтуванням існування універсального
обчислювача, тобто здатного виконати будь-який належним чином записаний
алгоритм, обчислити будь-яку вичіслімую функцію. p>
Отже,
нехай нам треба побудувати Універсальну Машину Тьюринга, назвемо її УМТ, для
якої: p>
вихідними
даними є програма іншої машини, назвемо її МТ, з вихідними даними Д
останньої; p>
результат
застосування УМТ до цих вихідними даними повинен бути таким же, як застосування
МТ до її вихідними даними, тобто p>
УМТ (МТ, Д) = МТ (Д). p>
Через
чисто технічної громіздкість ми не будемо давати цілком доведено
існування УМТ, а дамо лише обгрунтування її існування. У цьому
обгрунтуванні ми покажемо основну ідею доказу. p>
Уявімо
себе як такий УМТ і опишемо в інтуїтивно формі алгоритм своєї роботи.
Стан уявної каретки будемо записувати під оглядає, осередком стрічки.
Програму имитуємої МТ вважаємо поки заданої у вигляді таблиці. P>
інтерпретує
алгоритм для УМТ: p>
оглядав
клітинку, під якою написана буква (стан); p>
Відшукай
у таблиці рядок, визначену цією буквою; p>
В
знайденої рядку оглядав трійку символів, яка стоїть на перетині з
стовпцем, позначених літерою, вписаною в розглянутих клітинку; p>
Заміни
букву в оглядає, комірці на першу літеру трійки; p>
Якщо
другий буквою трійки є "!", то стоп; p>
Якщо
в оглядає, комірці третя буква "Н", то зітри букву під оглядає, осередком
і запиши туди другу літеру трійки (зміна стану); p>
Якщо
в оглядає, трійці третя буква "Л", то зітри букву під оглядає,
осередком, зрушимо вліво і запиши під цією осередком другу літеру трійки; p>
Якщо
в оглядає, трійці третя літера "П", то зітри букву під оглядає,
осередком, зрушимо вправо і запиши під цією осередком другу літеру трійки; p>
Перейди
до кроку 1. p>
Для
того, щоб перетворити цей опис в програму Машини Тьюринга, треба вирішити
дві основні проблеми: p>
Як
задавати програму і конфігурацію имитуємої МТ на стрічці? p>
Так
як довільна МТ може мати довільний алфавіт, то який алфавіт повинен
бути у УМТ? p>
Перша
проблема розбивається на дві: p>
як
задати програму на стрічці? p>
як
задати конфігурацію, щоб відзначати поточне положення каретки имитуємої МТ
(рішення у вигляді символу під поточною осередком не годиться). p>
Програму
МТ будемо записувати п'ятірками p>
aqbp *, де a, b