Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Деякі операції над машинами Тьюрінга



Робота машини Тьюрінга повністю визначається початковими даними і системою команд. Однак для розуміння того, як конкретна машина розв’язує дану задачу, як правило, виникає потреба в змістовних поясненнях типу тих, які приводилися для машини Ткоп. Ці пояснення часто можна зробити більш формальними і точними, якщо використати блок-схеми і деякі операції над машинами Тьюрінга.

Нагадаємо, що композицією двох функцій f1(х) і f2(у) називається функція g(х)=f2(f1(х)), яка виходить при застосуванні f2 до результату обчислення f1. Для того, щоб g(х) була визначена при даному х, необхідно і досить, щоб f1 була визначена на х, і f2 була визначена на f1(х).

Теорема 5.1. Якщо f1(х) і f2(у) обчислювані за Тьюрінгом, тоді їх композиція f2(f1(х)) також обчислювана за Тьюрінгом.

Нехай Т1 – машина, що обчислює f1, а Т2 - машина, що обчислює f2, і множини їх станів відповідно Q1= і Q2= . Побудуємо діаграму переходів машини Т з діаграм Т1 і Т2 таким чином: ототожнимо початкову вершину q21 діаграми машини Т2 з кінцевою вершиною q1z діаграми машини T1 (для систем команд це рівносильно тому, що систему команд T2 приписуємо до системи команд T1 і при цьому q1z в командах T= замінюємо на q21). Отримаємо діаграму з n1+n2-1 станами. Початковим станом Т оголосимо q11, а заключним - q2z. Для простоти позначень будемо вважати f1 і f2 числовими функціями однієї змінної.

Нехай f2(f1 (х)) визначена. Тоді T1(1x)=1 і q111x q1z1 .Машина Т пройде ту ж послідовність конфігурацій з тією різницею, що замість q1z1 вона перейде в q211 . Ця конфігурація є стандартною початковою конфігурацією для машини Т2, тому q211 q2z1 . Але оскільки всі команди Т2 містяться в Т, то q111x Þq211 Þ q2z1 і, отже, T(1x)=1 . Якщо ж f2(f1(х)) не визначена, тоді Т1 або Т2 не зупиниться і, отже, машина Т не зупиниться. Отже, машина Т обчислює f2(f1(х)).

Мал. 5.6.

Побудовану таким чином машину Т будемо називати композицією машин T1 і T2 і означати T2(T1), а також зображати блок-схемою (мал. 5.6.). Ця блок-схема має більш точне значення, ніж зображена на мал. 5.3, оскільки вона завжди передбачає, що початковими даними машини T2 є результати T1. При цьому вони вже «готові до вживання», оскільки завдяки правильній обчислюваності (яка істотна при композиції) заключна конфігурація T1 легко перетворюється в стандартну початкову конфігурацію T2.

Оскільки машина Тьюрінга вектор над Авих сприймає як слово в алфавіті АвихÈ{*}, визначення композиції і теорема 5.1 залишаються в силі, якщо T1 і Т2 обчислюють функції від декількох змінних. Важливо лише, щоб дані для T2 були в зумовленому вигляді підготовлені машиною T1. Це видно на наступному прикладі.

Приклад 5.8. Машина, діаграма якої наведена на мал. 5.7, це машина Т+Ткоп. Вона обчислює функцію f(х)=2x для х¹0; при цьому машина Ткоп будує двохкомпонентний вектор, а Т+ обчислює функцію від двох змінних.

Для зручності подальших побудов встановимо наступний важливий факт. Виявляється, що для обчислення на машині Тьюрінга досить, щоб стрічка була нескінченною тільки в одну сторону, наприклад праворуч. Така стрічка називається правою напівстрічкою.

Теорема 5.2. Будь-яка функція, обчислювана за Тьюрінгом, обчислювана на машині Тьюрінга з правою напівстрічкою; інакше кажучи, для будь-якої машини Тьюрінга Т існує еквівалентна їй машина TR з правою напівстрічкою. Аналогічна теорема формулюється для лівої напівстрічки.

Мал. 5.7

Можна передбачити принаймні дві ідеї побудови такої еквівалентної машини: 1) кожного разу, коли голівці колишньої машини треба зайти за лівий край стрічки, нова машина заздалегідь зсуне все написане (разом з голівкою) на клітку праворуч; б) стрічка «перегинається навпіл»; при цьому осередки правої половини колишньої стрічки розміщуються, скажемо, в непарних осередках напівстрічки, а осередки лівої половини - в парних. Перша ідея реалізована в [3]; реалізація другої пропонується як вправа.

Розглянемо тепер обчислення предикатів на машинах Тьюрінга. Машина Т обчислює предикат Р(a) (a– слово в Авих), якщо Т(a)=w, де w=І, коли Р(a) є істинним, і w=П, коли Р(a) є помилковим. Якщо ж Р(a) не визначений, тоді машина Т, як і при обчисленні функцій, не зупиняється. При звичайному обчисленні предиката знищується a, що може виявитися незручним, якщо після Т повинна працювати інша машина. Тому введемо поняття обчислення з відновленням: машина Т обчислює Р(a) з відновленням, якщо T(a)=wa. Якщо існує машина Т,що обчислює Р(a), то існує і ,що обчислює Р(a) з відновленням. Дійсно, обчислення з відновленням можна представити наступною послідовністю конфігурацій: q1aÞqn1a*aÞa*qn2aÞa*qn3wÞqn4wa. Перша частина цієї послідовності реалізовується машиною Ткоп, друга - простим зсувом головки до маркера*, третя - машиною TR, що обчислює Р(a) на правій напівстрічці (одного копіювання мало для відновлення, оскільки копію може зіпсувати основна машина Т, тому потрібна машина, що не заходить ліворуч від a), четверта - перенесенням w в крайнє ліве положення. Машина Т є композицією вказаних чотирьох машин. Однак в конкретних випадках можливі і більш прості способи відновлення a.

Приклад 5.9. Машина з діаграмою на мал. 5.8 обчислює предикат «a – парне число»: голівка досягає кінця числа в стані q2, якщо число одиниць парне, і в стані q3, якщо число одиниць непарне, після чого вона переміщується в початкове положення в стані q4 або q5 і друкує І або П відповідно. Для того, щоб цей предикат обчислювався з відновленням, досить в петлях q4 і q5 не стирати, а зберігати одиниці, тобто замінити команди 1®lL на команди 1®L.

Мал. 5.8.

Оскільки машина Тьюрінга з алфавітом Авих={І, П} і командами q1І®qzПЕ і q1П®qzІЕ обчислює заперечення логічної змінної, то з обчислюваності всюди визначеного Р(a) слідує обчислюваність .

Нехай функція f(a) задана описом: «якщо Р(a) істинне, тоді f(a) =g1(a), інакше f(a) =g2(a)» (під «інакше» мається на увазі «якщо Р(a) помилкове»; якщо ж Р(a) не визначене, то f(a) також не визначена). Функція f(a) називається розгалуженням або умовним переходом до g1(a) і g2(a) за умови Р(a).

Теорема 5.3. Якщо g1 (a), g2 (a) і Р (a) обчислювані за Тьюрінгом, то розгалуження g1 і g2 по Р також є обчислюваним.

Нехай T1 – машина з станами і системою команд å1, обчислююча g1; T2 - машина з станами і системою команд å2, обчислююча g2; Tp – обчислює з відновленням P(a). Тоді машина Т, обчислююча розгалуження g1 і g2 по Р, це композиція Tp і машини Тз, система команд å3 якої має наступний вигляд:

å31Èå2È{q31І®lq11R, q31П®lq21R, q1z®q2zE}.

Перші дві з нових команд передають управління системам команд å1 або å2 в залежності від значення предиката P(a). Третя команда введена для того, щоб T3 мала один заключний стан q2z. Відсутність символа стрічки в цій команді означає, що вона виконується при будь-якому символі.

Розгалуження зустрічається в структурі діаграм переходів багатьох машин Тьюрінга.

Приклад 5.10-а. У прикладі 5.6.-а було описано побудову машини Т+ для складання двох чисел. На мал. 5.8 наведена діаграма машини Т++ для складання n чисел (n=1, 2...). Цикл з станів q1, q2, q3 - це «зациклена» машина Т+, в якій заключний стан суміщений з початковим. Сума, отримана на черговому циклі, є першим доданком наступного циклу. Стан q4 реалізує розгалуження. У ньому перевіряється умова - чи є другий доданок. Якщо так (про що говорить наявність маркера *), тоді відбувається перехід до наступного циклу; якщо немає (про що говорить (після одиниць), то машина виходить з циклу.

Мал. 5.9

б. Нехай машина Т з алфавітом АТ і з Авих={1} не є правильно обчислюючою й її заключна конфігурація стандартна, але може містити будь-які символи з АТ (крім пропусків), а результат інтерпретується як число, що дорівнює числу одиниць на стрічці. Побудуємо для Т машину Т'++, яка працює як Т++, а всі символи, крім 1 і l, вона сприймає як маркери, тобто команди для них ті ж, що і для *. Тоді T'++ збере всі одиниці в один масив і, отже, T'++(T(a)) правильно обчислює функцію, що обчислюється машиною Т. Приклад 5.10 ілюструє важливий окремий випадок розгалуження - вихід з циклу за умови, добре відомий в програмуванні. У словесних описах (див. приклад 5.1.) і в багатьох мовах програмування (наприклад, в АЛГОЛі) цей випадок формулюється так: повторювати обчислення f1 доти, поки є істинною умова Р, якщо Р помилкова, перейти до обчислення f2.

Завдяки обчислюваності композиції і розгалуження словесні описи і мову блок-схем можна зробити цілком точною мовою для опису роботи машин Тьюрінга. Кожний блок - це множина станів, в якій виділені початковий і заключний стани, і система команд. Правильне обчислення для проміжних блоків не обов'язкове, тому при стиковці блоків важливо погоджувати всю конфігурацію. Перехід до блоку – це обов'язково перехід в його початковий стан. Машина Тьюрінга, що описується блок-схемою, – це об'єднання станів і команд, що містяться у всіх блоках. Зокрема, блоком може бути один стан. Блоки,що обчислюють предикати, позначимо літерою Р.

Приклад 5.11. На мал. 5.10 наведена блок-схема машини Тьюрінга Tx, що здійснює множення двох чисел: Tx(1a*1b)=1ab. Її заключний стан - q03. Блоки реалізують наступні вказівки і обчислення:

Р1 – обчислити з відновленням предикат «обидва доданки більші нуля»;

Т1 – стерти всі непусті символи праворуч;

Т2 – встановити голівку в осередку, наступному (праворуч) за маркером * '; маркер * замінити на ~, Ткоп - див. приклад 6.6-б, в якому команду q1l®qzR треба замінити на команду q1~®qzR;

Ткоп (а - 1) разів копіює 1b; після i-го циклу вона зупиняється в конфігурації 1a-i-1(~1b)i-1~q1b * 1b;

T3 - повернути голівку до крайнього зліва непустого символа. Після (а - 1)-го циклу цим символом виявиться ~ (або *, якщо а=1), і відбувається вихід з циклу і перехід до .

працює як Т++ (див. приклад 10.a) з тією різницею, що числа, які вона підсумовує, розділені двома видами маркерів: ~ і *; для цієї мети в неї до команд з маркером * в лівій частині додані такі ж команди для маркера ~.

Аналогічно тому, як з машини Т+ була побудована Т++, можна з Тх побудувати машину Тхх, яка перемножує декілька чисел, і за схемою, аналогічною наведеній на мал. 5.10, з використанням Txx замість побудувати машину, що здійснює возведення до ступеня. Інший важливий приклад, який читач може або побудувати, або знайти в [2, 3], – переклад унарного представлення чисел в позиційне двійкове або десятеричне.

Мал. 5.10.

Універсальна машина Тьюрінга. Систему команд машини Тьюрінга можна інтерпретувати і як опис роботи конкретного механізму і як програму, тобто сукупність розпоряджень, що однозначно приводять до результату. При розборі прикладів будь-який читач мимовільно приймає другу інтерпретацію, виступаючи в ролі механізму, який здатний відтворити роботу будь-якої машини Тьюрінга. Упевненість в тому, що все це будуть робити однаково (якщо не нароблять помилок, що, до речі, передбачається і при роботі машини Тьюрінга), - це по суті упевненість в існуванні алгоритму відтворення роботи машини Тьюрінга за заданою програмою, тобто системою команд. Дійсно, словесний опис такого алгоритму дати неважко. Його основна дія, що циклічно повторюється, полягає в наступному.

«Для поточної конфігурації a1arqiaja2 знайти в системі команд команду з лівою частиною qiaj. Якщо права частина цієї команди має вигляд qi'a'jR, то замінити в поточній конфігурації qiaj на aj'qi' (вийде конфігурація a1araj'qi'a2); якщо ж права частина має вигляд qi'aj'L, то замінити arqiaj на qi'araj' (як видно з прикладу 5.5, випадок з Е можна не розглядати)».

Як вже говорилося в § 5.1, словесний опис алгоритму може бути неточним і потребувати формалізації. Оскільки в якості такої формалізації поняття алгоритму зараз обговорюється машина Тьюрінга, то природно поставити задачу побудови машини Тьюрінга, що реалізує описаний алгоритм відтворення. Для машини Тьюрінга, що обчислює функції від однієї змінної, формулювання цієї задачі таке: побудувати машину Тьюрінга U, яка обчислює функцію від двох змінних, і таку, що для будь-якої машини Т з системою команд åT U(åT,a)=T(a), якщо T(a) визначнена (тобто U(åT,a) зупиняється, якщо машина Т зупиняється при початкових даних a, і U(åT,a) не зупиняється, якщо Т(a) не зупиняється). Будь-яку машину U, що має вказану властивість, будемо називати універсальною машиною Тьюрінга. Неважко узагальнити це формулювання на будь-яке число змінних.

Перша проблема,що виникає при побудові універсальної машини U, пов'язана з тим, що U, як і будь-яка інша машина Тьюрінга, повинна мати фіксований алфавіт AU і фіксовану множину станів QU. Тому систему команд åT і початкові дані довільної машини Т не можна просто переписати на стрічку машини U (завжди знайдеться машина Т, алфавіти AT і QT якої перевершують за потужністю AU і QU, або просто не співпадають з ними). Вихід полягає в тому, щоб символи з AT і QT кодувати словами в алфавіті AU. Нехай |AT|=mT, |QT|=nT. Будемо завжди вважати, що a1=1, =l (ці два символи завжди є в алфавіті будь-якої машини, яка працює з числами). Визначимо коди qi і aj через S(qi) і S(qj) і визначимо їх таким чином: S(l)= , для будь-якого іншого ai S(ai)= a 1i, для заключного стану qTz S(qTz)=q , S(qi)=q 1i, якщо i¹nT. Код S(aj) для даної машини Т завжди має довжину (формат) mT, а код S(qi) - формат nT. Символи R,L,® введемо в AU, тобто S(R)=R, S(L)=L, S(®)=®. Код слова a, утворений кодами символів, що складають це слово, визначимо S(a). Таким чином, остаточне уточнення постановки задачі про універсальну машину U зводиться до того, що для будь-якої машини Т і слова a в алфавіті ATU(S(åT),S(a))=T(a).

План побудови машини U такий. Будемо вважати, що машина Т завжди працює на правій напівстрічці (строго кажучи, це припущення порушує спільність міркувань, незважаючи на теорему 5.2, адже на довільній системі команд åT не написано, працює вона з правою напівстрічкою чи ні). Однак теорема 5.2 містить алгоритм перетворення в систему команд для роботи з правої напівстрічкою. Виходячи з нього, можна побудувати машину Тьюрінга Тпр, що реалізує цей алгоритм, і розглядати універсальну машину U(TпрT),a)). Тоді стрічку U можна розділити на дві нескінченні напівстрічки з кордоном Z між ними: в правої напівстрічці записується поточна конфігурація машини Т (внаслідок нашого припущення конфігурація машини Т при цій імітації ніколи не зайде на ліву напівстрічку), а в лівої напівстрічці записаний код системи команд S(åT). Зокрема, початкова конфігурація U має вигляд: u1S(åT)ZS(q1)S(a) (u1– початковий стан машини U, q1 – початковий стан Т, a – початкове слово Т). Наприклад, початковій конфігурації машини з прикладу 5.3, а з початковим словом 11 відповідає наступне слово на стрічці машини U:

q1a1®q1a1Rq1ll®q1a1RZq1a1a1.

Виконанню однієї команди Т відповідає цикл машини U, що реалізує основну дію, описану раніше, з тією різницею, що вона буде здійснюватися не над конфігурацією К машини Т, а над її кодом S(К). Завдяки обраному кодуванню довжини всіх слів виду S(qiaj) і S(ajqi) рівні, тому при замінах S(qiaj) на S(aj'qi') або S(arqi) на S(qi'a'j), що імітують рушення голівки машини Т, околиця слів, що замінюються, не зачіпається і ніяких зсувів або розсувів не потрібно. Сама довжина слова, що замінюється, дорівнює числу символів між ® і найближчим символом руху (R або L) на лівій напівстрічці.

Опишемо більш детально роботу машини U, розбивши опис на кроки (блоки).

1. Для слова S(qi,aj) на правій напівстрічці (його початок - єдиний на правій напівстрічці символ q, а кінець відстоїть від q на число символів, що дорівнює формату S(qiaj)) з'ясувати, чи є в лівій напівстрічці слово S(qiaj)®. Якщо так, то перейти до кроку 2. Якщо такого слова немає, то перейти до кроку 10.

2. У знайденому слові S(qiaj) замінити ®на *.

3. З'ясувати, чи дорівнює R найближчий символ руху праворуч від *. Якщо так, перейти до кроку 4, якщо ні, то до кроку 7.

4. У mT осередків правої напівстрічки, що починаються з q, записати слово довжиною mT, що починається з (nT+1)-го символа правіше * (це слово має вигляд S(aj') і є кодом символа, який машина Т друкує по команді qiaj®qi'aj'R. Після записаного слова надрукувати мітку ||.)

5. У nT осередків правої напівстрічки, що починаються із ||, записати слово довжиною nT, що починається безпосередньо праворуч від А (це слово має вигляд S(qi') і є кодом стану, в який машина Т переходить по команді qiaj®qi'aj'R).Внаслідок кроків 4 і 5 слово S(qiaj) на правій напівстрічці замінюється словом S(aj'qi'), що імітує команду qiaj®qi'aj'R.

6. Замінити в правій напівстрічці * на ® і перейти до кроку 1.

7. Слово довжиною mT, розташоване на правій напівстрічці безпосередньо зліва від q, зсунути праворуч на nT кліток. Після зсунутого слова надрукувати мітку ||.

8. У mT осередків правої напівстрічки, що починаються із ||, записати слово довжиною mT, що починається з (nT+1)-го символа правіше * (це слово має вигляд S(aj') і є кодом символа, який машина Т друкує по команді qiaj®qi'aj'L. В клітці, розташованій на mT+nT кліток лівіше початку записаного слова, надрукувати ||.)

9. У nT осередків правої напівстрічки, що починаються із ||, записати слово довжиною nT, що починається безпосередньо праворуч від * (це слово має вигляд S(qi') і є кодом стану, в який машина Т переходить по команді qiaj®qi'aj'L). Перейти до кроку 6.

10. Внаслідок кроків 7, 8, 9 слово S(arqiaj) на правій напівстрічці замінюється словом S(qi'araj'), що імітує команду qiaj®qi'aj'L.

11. Стерти в правій напівстрічці код стану (цей стан буде заключним для Т, оскільки перехід 1 до кроку 10 означає, що стан машини Т не зустрівся в лівих частинах команд машини Т) і зупинитися. При цьому заключна конфігурація буде мати вигляд: S(åT)Zl...luzb, де uz - заключний стан U, а b - код результату Т, тобто b=S(Т(a)).

Мал. 5.11

Блок-схема U, що відповідає цьому опису, наведена на мал. 5.11. Її цикл реалізує основну дію алгоритму відтворення роботи машини Т, причому гілка циклу 3 4 5 6 відповідає зсуву голівки Т праворуч, а гілка 3 7 8 9 6 - зсуву голівки ліворуч.

Наведений раніше опис роботи машини U зовні нічим не відрізняється від словесного опису в прикладі 5.1, однак насправді воно набагато точніше. У ньому повністю уточнені представлення даних і їх розташування в пам'яті. Для того, щоб зробити цей опис абсолютно точним, тобто перетворити в систему команд машини U, залишається показати, що блоки цього опису можуть бути реалізовані машинами Тьюрінга. Для кроків 2, 3, 6, 10 це є очевидним. Для реалізації інших кроків побудуємо спочатку машину Тпер, яка слово, розташоване між мітками «і», переписує на місце, що починається з мітки || (передбачається, що мітки «,», || зустрічаються на стрічці по одному разу, причому || лежить правіше). Блок-схема машини Тпер з алфавітом Авих=={a1,..., am, «,», ||} і m допоміжними символами b1,..., b наведена на мал. 5.12.

Мал. 5.12

Всі машини Т1,..., Тm мають по п'ять станів. У випадку, коли перший ще не переписаний символ лівого слова дорівнює ai, він замінюється на b1, тобто позначається як переписаний, і управління передається машині Ti, яка йде праворуч, проходить всі вже виписані символи (тобто символи bj) правого слова, праворуч (а на першому проході замість мітки ||) від них пише символ bi, і повертається ліворуч до першого ще не переписаного символа лівого слова. Якщо цим символом виявляється мітка «, то перезапис скінчений, і управління передається машині Tm+1, яка стирає всі мітки, тобто замінює bi на ai, і зупиняється. Система команд машини Тi (i=1,..., m) наведена в табл. 5.5,що утримує 2m+2 рядка. Система команд Tm+1 є очевидною і тут не наводиться.

Кроки 4,5,8,9 реалізуються безпосередньо за допомогою машини Тпер, роботі якої повинно передувати розставляння міток «і». Положення цих міток відлічується від початкової мітки *, поставленої на кроці 2, за допомогою форматів mT і nT, величина яких витягується з коду системи команд, точніше з лівої частини коду самої правої команди: стан в ній не може бути заключним і має код виду q 1i, тому число символів (кліток) між другим праворуч символом руху і кінцем масиву одиниць дорівнює nT. Число символів, що залишилося до стрілки ®, дорівнює mT.

Крок 1 реалізується за допомогою зациклювання модифікованої машини Т'пер, в якій слово, відмічене мітками «, «, знаходиться правіше за мітку ||, а машини Тi працюють з права наліво і при цьому не переписують, а порівнюють, тобто перевіряють, чи не є рівним ai перший з невідмічених символів лівого слова. Робота Т'пер продовжується доти, поки або цим символом виявиться ® (це означає, що потрібна команда знайдена), або до aj¹ai, після чого мітка || пересувається в початок наступної ліворуч команди і знов включається Т'пер.

Таблиця 5.5.

  qi1 qi2 qi3 qi4
a1 qi1R qi3biL qi3L qi4L
× × × × ×
× × × × ×
× × × × ×
am qi1R qi3biL qi3L qi4L
>> qi1R qi4L
½||½ qi3b1L
B1 qi2R qi2R qi3L qizR
× × × × ×
× × × × ×
× × × × ×
Bm qi2R qi2R qi3L qizR

Нарешті, крок 7 реалізується за допомогою іншої модифікації Т''пер, в якій дозволяється, щоб мітка || знаходилася між «і». Її побудова надається читачеві.

На цьому побудова універсальної машини U закінчується.

Зазначимо, що при побудові U (як, проте, і для багатьох інших машин, описаних в цьому параграфі) ми не переслідували цілі оптимізації і не жаліли ні символів стрічки, ні станів, прагнучи до наглядності побудови. Неважко показати, що можна побудувати машину U всього з двома символами на стрічці. Шеннон встановив менш очевидний факт: він побудував універсальну машину з двома станами. У той же час показано (Боброу і Мінський), що універсальна машина з двома станами і двома символами неможлива. Взагалі в визначених межах зменшення числа символів U веде до збільшення числа станів і навпаки. Докладне зведення результатів про мінімальні універсальні машини наведене в [2].

Існування універсальної машини Тьюрінга означає, що систему команд åТ будь-якої машини Т можна інтерпретувати таким чином: або як опис роботи конкретного пристрою машини Т, або як програму для універсальної машини U. Для сучасного інженера, що проектує систему управління, ця обставина цілком природна. Він добре знає, що будь-який алгоритм управління може бути реалізований або апаратно - побудовою відповідної схеми, або програмно - написанням програми для універсальної керуючої ЕОМ. Однак важливо усвідомлювати, що сама ідея універсального алгоритмічного пристрою абсолютно не пов'язана з розвитком сучасних технічних засобів його реалізації (електроніки, фізики твердого тіла і т.д.) і є не технічним, а математичним фактом, що описується в абстрактних математичних термінах, які не залежать від технічних засобів, і до того ж що спирається на надто малу кількість вельми елементарних початкових понять. Характерно, що базові роботи з теорії алгоритмів (і, зокрема, роботи Тьюрінга) з'явилися в 30-х роках, набагато раніше за створення сучасних ЕОМ.

Вказана інтерпретація зберігає на абстрактному рівні основні плюси і мінуси двох варіантів інженерної реалізації. Конкретна машина Т працює набагато швидше; крім того, керуючий пристрій машини U досить громіздкий (тобто велике число станів і команд). Однак його складність постійна, і, будучи раз побудованим, він годиться для реалізації яких завгодно великих алгоритмів, знадобиться лише більший об'єм стрічки, яку природно вважати більш дешевою і більш просто влаштованою, ніж керуючий пристрій. Крім того, при зміні алгоритму не знадобиться будувати нових пристроїв; треба лише написати нову програму.

Теза Тьюрінга. Досі нам вдавалося для всіх процедур, що претендують на алгоритмічність, тобто конструктивних процедур, будувати реалізуючі їх машини Тьюрінга. Чи буде це вдаватися завжди? Ствердна відповідь на це питання міститься в тезі Тьюрінга, яка формулюється так: «Всякий алгоритм може бути реалізований машиною Тьюрінга». Довести тезу Тьюрінга не можна, оскільки саме поняття алгоритму (або ефективної процедури) є неточним. Це не теорема і не постулат математичної теорії, а твердження, яке зв'язує теорію з тими об'єктами, для опису яких вона створена. По своєму характеру теза Тьюрінга нагадує гіпотези фізики про адекватність математичних моделей фізичним явищам і процесам. Підтвердженням тези Тьюрінга є, по-перше, математична практика, а по-друге, та обставина, що опис алгоритму в термінах будь-якої іншої відомої алгоритмічної моделі може бути зведений до його опису у вигляді машини Тьюрінга. Теза Тьюрінга дозволяє, з одного боку, замінити неточні твердження про існування ефективних процедур (алгоритмів) точними твердженнями про існування машин Тьюрінга, а з другого боку, твердження про неіснування машин Тьюрінга тлумачити як твердження про неіснування алгоритмів взагалі. Однак не треба розуміти тезу Тьюрінга в тому значенні, що вся теорія алгоритмів може бути зведена до теорії машин Тьюрінга. Наприклад, в теорії складності алгоритмів (що швидко розвивається зараз і яка розглядає порівняльну складність алгоритмів по пам'яті, числу дій і т.д.) результати, вірні в рамках однієї алгоритмічної моделі (скажімо, про число дій, необхідних для обчислення даної функції), можуть виявитися невірними в іншій моделі.

Проблема зупинки. У числі загальних вимог, що пред'являються до алгоритмів (див. § 5.1), згадувалася вимога результативності. Найбільш радикальним формулюванням тут була б вимога, щоб за будь-яким алгоритмом А і даними a можна було визначити, чи приведе робота А при початкових даних a до результату чи ні. Інакше кажучи, треба побудувати алгоритм В, такий, що В(А, a)=І, якщо А(a) дає результат, і В (А, a) =П, якщо А(a) не дає результату. Внаслідок тези Тьюрінга цю задачу можна сформулювати як задачу про побудову машини Тьюрінга: побудувати машину Т0, таку, що для будь-якої машини Тьюрінга Т і будь-яких початкових даних для машини T0T,a)=І, якщо машина Т(a) зупиняється, і T0T,a)=П, якщо машина Т(a) не зупиняється.

Ця задача називається проблемою зупинки. Її формулювання дещо нагадує задачу про побудову універсальної машини і, зокрема, також передбачає вибір відповідного кодування åТ і a в алфавіті машини Т0. Однак в цьому випадку ніяке кодування не приводить до успіху.

Теорема 5.4. Не існує машини Тьюрінга Т0, що вирішує проблему зупинки для довільної машини Тьюрінга Т.

Припустимо, що машина Т0 існує. Для певності будемо вважати, що маркером між åТ та a на стрічці машини Т0 служить *. Побудуємо машину Т1Т)=Т0копТ)). Початковими даними машини Т1 є системи команд (точніше, їх коди) будь-якої машини Т. Запис åТ на стрічці машина Т1 перетворює в åТТ (машина Ткоп для чисел описана в прикладі 5.6-б), а потім працює як машина Т0. Таким чином, Т1 також вирішує проблему зупинки для будь-якої машини Т, але тільки в тому випадку, коли на стрічці Т в якості даних aТ написана її власна система команд åТ. Інакше кажучи, Т1Т)=І, якщо машина Т(åТ) зупиняється, і Т1Т)=П, якщо машина Т(åТ) не зупиняється. Нехай q1n – заключний стан T1. Додамо до системи команд T1 один стан q1, n+1, оголосивши його заключним, і m команд (m-число символів T1) q1nП®q1,n+1Е, q1naj®q1nR для будь-якого aj; (в тому числі І), крім П. Отримаємо машину T'1T), яка зупиняється, якщо Т не зупиняється, і не зупиняється, якщо Т зупиняється. Запишемо тепер на стрічці машини T1' її власну систему команд. Тоді T'1 зупиниться, якщо вона не зупиняється, і не зупиниться, якщо вона зупиняється. Очевидно, така машина T'1 неможлива. Але оскільки вона отримана з T0 цілком конструктивними засобами, які не викликають сумнівів, і при цьому ніяк не пов'язана з конкретною структурою машини T0, залишається зробити висновок, що ніяка машина T0, що вирішує проблему зупинки, неможлива.

Внаслідок тези Тьюрінга неможливість побудови машини Тьюрінга означає відсутність алгоритму розв'язання даної проблеми. Тому отримана теорема дає перший приклад алгоритмічно нерозв'язної проблеми, а саме, алгоритмічно нерозв'язною виявляється проблема зупинки для машин Тьюрінга, тобто проблема визначення результативності алгоритмів.

При тлумаченні тверджень, пов'язаних з алгоритмічною нерозв'язністю, потрібно мати на увазі наступну важливу обставину. У таких твердженнях мова йде про відсутність єдиного алгоритму, що вирішує дану проблему; при цьому зовсім не виключається можливість розв'язань цієї проблеми в окремих випадках, але різними засобами для кожного випадку. Зокрема, теорема 6.4 не виключає того, що для окремих класів машин Тьюрінга проблема зупинки може бути розв’язана (однак існують конкретні машини Тьюрінга (наприклад, будь-яка універсальна машина) з нерозв'язною проблемою зупинки). Наприклад, вона вирішується для всіх машин, наведених в прикладах 5.3-5.10. Тому нерозв'язність загальної проблеми зупинки зовсім не знімає необхідності доводити сходимість алгоритмів, що пропонуються, а лише показує, що пошук таких доведень не можна повністю автоматизувати.

Нерозв'язність проблеми зупинки можна інтерпретувати як неіснування загального алгоритму для відладки програм, точніше, алгоритму, який за текстом будь-якої програми і даними для неї визначав би, чи зациклиться програма на цих даних чи ні. Якщо врахувати зроблене раніше зауваження, така інтерпретація не суперечить тому емпіричному факту, що більшість програм зрештою вдається налагодити, тобто встановити наявність зациклення, знайти його причину і усунути її. При цьому вирішальну роль грають досвід і мистецтво програміста.





Дата публикования: 2015-11-01; Прочитано: 2937 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.018 с)...