Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование Методичка.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
5.33 Mб
Скачать

«Ускладнювати просто. Спрощувати складно» (закон Мейера) Алгоритмічні системи

У теорії алгоритмів значна увага приділяється засобам задання алго­рит­мів, що називаються алгоритмічними системами. Алгоритмічна система ха­рактеризується універсальністю, тобто дозволяє задати алгоритм, еквіва­лентний будь-якому наперед заданому алгоритму. При описуванні алгорит­міч­них систем використовуються спеціальні формалізовані засоби прикладної тео­рії алгорит­мів, що можна розділити на два напрямки: «алгебраїчна теорія алго­ритмів» і «геометрична теорія алгоритмів».

«Алгебраїчна теорія алгоритмів» розглядає алгоритми як лінійні текс­ти. До цього напрямку відносять теорії рекурсивних функцій, машини Тюрін­га, опера­тор­ні системи Ван-Хао і Ляпунова, логічні схеми алгоритмів Янова та ін.

«Геометрична теорія алгоритмів» розглядає алгоритми як множини, між якими вводяться зв'язки, що носять характер відображень або бінарних від­ношень. При цьому значне місце займає геометрична інтепретація об'єктів у виг­­ляді графів, вершини яких задають елементи множини, а ребра - відношення між ними. При цієї інтепретації відображення задаються у вигляді розмітки вер­шин або ребер графа. До цього напрямку відносяться: представлення норма­ль­них алгоритмів Маркова у вигляді граф-схем, запропонованих Калу­жиним, блок-схемний метод алгоритмізації та ін.

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

Поняття рекурсивних функцій тісно пов’язане із поняттям обчислюємих функцій. Чисельні функції, значення яких можна розрахувати за допомогою ал­го­ритму, називають обчислюємими функціями.

Якщо деяким елементам множини Х поставлені в однозначну відповід­ність елементи множини Y, то кажуть, що задано частково визначену функцію Y(Х); при цьому сукупність елементів X називають областю визначення функ­ції Y, а сукупність елементів Y - областю значень функції Y. Якщо область ви­з­начення функції Y(Х) збігається із множиною X, то функцію називають усюди визначеною.

Гьодель вперше описав клас рекурсивних функцій як клас усіх числових функцій деякої формальної системи. Виходячи з інших передумов, Чорч у 1936 році вивів той же клас числових функцій і сформулював гіпотезу про те, що «клас рекурсивних функцій тотожний класу усюди визначених обчислюємих функцій». Оскільки поняття обчислюємої функції точно не визначається, то і гі­потезу Чорча довести не можна.

Кліні ввів поняття частково рекурсивної функції і висловив гіпотезу про те, що «усі частково визначені функції, які можна обчислити за допомо­гою алгоритмів, є в той же час і частково рекурсивними». Ця гіпотеза також відома, як і гіпотеза Чорча. Проте математичні дослідження останніх 30 років виявили повну доцільність вважати поняття частково рекурсивної функції нау­ко­вим еквівалентом поняття обчислюємої частково визначеної функції.

Надалі під тезою Чорча будемо розуміти гіпотезу Чорча у тому розши­реному вигляді, що був доданий до неї Кліні: «Функція є рекурсивною, якщо вона є обчислюємою». У силу тези Чорча питання про обчислюваність функції різвнозначне питанню про її рекурсивність; при цьому математичними мето­дами можна довести алгоритмічну нерозв'язність деякої задачі, якщо функція, що розв’язує задачу, не рекурсивна.

Застосування рекурсивних функцій у теорії алгоритмів базується на ідеї Канторової нумерації слів у довільному алфавіті послідовними натуральними числами. Най­простіше таку нумерацію можна здійснити розташуванням слів у порядку зростання їхніх довжин, а слів, що мають однакову довжину, - у лекси­кографічному порядку. Після нумерації вхідних і вихідних слів у довільному опе­раторі алфавіту цей оператор перетворюється у функцію Y = f (X), де і ар­гумент, і функція приймають ненегативні цілочисельні значення (функція f (X) може бути частково визначеною). Такі функції називаються арифметичними.

Елементарними арифметичними функціями виявляються:

 функції, тотожно рівні нулю:

On (x1, x2, ... , xn) = 0 ( xi  0)

 тотожні функції, що повторюють значення своїх аргументів:

Iin (x1, x2, ... , xn) =xi (i  [1;n]; n=1, 2, ...)

 функції безпосереднього слідування:

S1(x) = x + 1

Використовуючи ці функції в якості вхідних, можна побудувати більш складні арифметичні функції за допомогою програмних алгебр (загальних кон­структивних прийомів): суперпозиції, примітивної рекурсії і найменшого ко­реня.

Прийом суперпозиції полягає у підстановці одних арифметичних фун­к­цій замість аргументів інших арифметичних функцій.

Нехай, наприклад, задано {fi (x1, x2, ... , xm)}n (i[1;n]) і f (x1, x2, ... , xn). Тоді суперпозиція дасть нову функцію g (x1, x2, ... , xm) = f (f1 (x1, x2, ... , xm), ... , fn(x1, x2, ... , xm)).

Для конкретного прикладу: якщо задані функції f(x) = 0 і g(x) = x + 1, то: h(x) = g(f(x)) = 0 + 1 = 1.

Суперпозиція позначається як Sn+1, де n+1 - кількість функцій.

Прийом примітивної рекурсії дозволяє будувати функцію f від n+1 аргу­менту по двох вхідних функціях: функції g від n аргументів і функції h від n+2 аргументів, якщо:

f (x1, x2, ... , xn, 0) = g (x1, x2, ... , xn);

f (x1, x2, ... , xn, y + 1) = h (x1, x2, ... , xn, y, f (x1, x2, ... , xn, y)).

Це означає, що значення f (x1, x2, ... , xn, m+1) можна розрахувати за до­помогою ітераційної рекурсивної процедури:

b0 = g (x1, x2, ... , xn)

b1 = h (x1, x2, ... , xn, 0, b0 )

b2 = h (x1, x2, ... , xn, 1, b1 )

...... ...... ...... ...... ...... ...... ...... ...... ....

bm+1= h (x1, x2, ... , xn, m, bm)

===========================

f (x1, x2, ... , xn, m+1) = bm+1

Прийом найменшого кореня дозволяє визначити нову арифметичну фун­кцію f (x1, x2, ... , xn) від n аргументів за допомогою раніше побудованої ариф­ме­тичної функції g (x1, x2, ... , xn, y) від n+1 аргументів.

Для будь-якого заданого набору значень змінних x1 = a1, ... , xn= an у яко­сті значення f (a1, a2, ... , an) обумовленої функції приймається найменший цілий ненегативний корінь у = а рівняння g (x1, x2, ... , xn, y) = 0. У випадку неіснуван­ня цілих ненегативних коренів цього рівняння функція f(x1, x2, ... , xn) вважає­ться невизначеною на відповіднім наборі значень змінних.

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

Практично поняття частково рекурсивних функцій використовується для доказу алгоритмічної можливості (або неможливості) розв'язання задач. Вико­ристання ж таких функцій для утворення конкретного алгоритму є практично недоцільним через складність процесу алгоритмізації.

У 1936 - 1937 роках Постом і Тюрінгом було запропоновано новий механізм фор­малізації алгоритмічних процесів. Основна ідея полягала у тому, що алгори­тмічний процес - це процес, який може виконувати придатна для цього гіпоте­тична (умовна) «машина», за допомогою якої можна здійснити чи імітувати усі алгоритмічні процеси.

Машина Поста

Машина Поста складається із декількох частин (мал. 1):

S0

Sj

Sj

Sj

...

Sj

...

...

...

Sj

Sj

S0

1

2

3

...

k

...

...

...

r-1

r

Мал. 1

інформаційна стрічка, яка уявляє собою нескінчену (необмежену) па­м’ять машини; стрічка містить множину чарунок2, кожна з яких може містити лише один символ;

голівка, яка уявляє собою дошкульний3 елемент, здатний зчитувати і записувати інформацію у поточну чарунку; інформаційна стрічка може зрушува­тися від­нос­но голівки уліво (цей напрямок позначається Л), управо (цей напря­мок позначається П) і може залиша­тися нерухомою (позначається С);

пристрій керування, який у кожний момент часу знаходиться у деяко­му «стані» зі скінченої множини станів; один із станів називається «заключ­ним» і позначає стан після завершення роботи машини.

В алгоритмічній системі Поста інформація подається у двійковому алфа­віті A = {0, 1} (таким чином, чарунка інформаційної стрічки може містити 0 чи 1). Алгоритм подається скінченою упорядкованою множиною правил, які на­зи­вають «наказами».

Робота алгоритму починається з деякої початкової чарунки, яка відпові­дає першому наказові алгоритму. Накази обираються із наступної скінченої мно­­жини наказів Поста:

 записати у чарунку значення 1 і перейти до виконання i-го наказу;

 записати у чарунку значення 0 і перейти до виконання i-го наказу;

 зрушити інформаційну стрічку управо на одну чарунку і перейти до ви­конання i-го наказу;

 зрушити інформаційну стрічку уліво на одну чарунку і перейти до ви­конання i-го наказу;

 якщо поточна чарунка містить 1, то перейти до виконання j-го наказу, інакше (якщо поточна чарунка містить 0) перейти до виконання i-го наказу;

 завершити роботу алгоритму і зупинитися.

Таким чином, машина Поста може, виконуючи накази, либонь зрушува­ти інформаційну стрічку на одну чарунку, зали­шаючи вміст чарунки незмінним, либонь змінювати вміст чарунки, залиша­ючи ін­формаційну стрічку нерухомою.

Алгоритми, які складено із таких наказів, називають алгоритмами Пос­та. До­ве­дено, що алгоритми Поста зводяться до алгоритмів, що реалізуються за до­помогою частково рекурсивних функцій; і, навпаки, абияку рекурсивну фун­к­цію можна представити алгоритмом Поста.

Стандартна машина Тюрінга

Машина Тюрінга, на відміну від машини Поста, у кожній чарунці ін­формаційної стрічки може містити один із символів деякого скінченого алфа­віту, а пристрій керування нею може знаходитися в одному із станів скінченої множини станів.

Скінчена сукупність символів алфавіту, із яким працює машина, назива­ється зовнішнім алфавітом. Скінчена сукупність станів пристою керування на­зивається внутрішнім алфавітом. Сукупність, утворена послідовністю ста­нів усіх чарунок інформаційної стрічки і станом пристрою керування, називається конфігурацією машини. Якщо алфавіт машини Тюрінга задано множиною A = {s0, s1, ..., sn}, а кількість станів пристрою керування - мно­жиною Q = {q0, q1, ..., qn}, то конкретну конфігурацію машини Тюрінга можна задати у вигляді слова, яке подає стан машини. Кожна конфігурація містить лише одне входження сим­волу qi внут­ріш­нього алфавіту. Цей символ може бути у слові найлівішим, але не може бути найправішим, оскільки справа від нього повинен розташову­ва­тися символ стану поточної чарунки.

Нехай, наприклад, у деякий момент часу машина Тюрінга знахо­ди­ться у стані, який подано мал. 1, тоді конфігу­ра­ція машини визначається словом:

... s0 sj1 sj2 ... qi sjk ... sjr-1 sjr s0 ...,

, де: s0 - символ, що позначає порожню чарунку, r - кількість непорожніх чару­нок інформаційної стрічки, sj1 - стан першої зліва непорожньої чарунки, sjk - стан поточної чарунки, qi - стан пристрою керування (q0 відповідає заключному станові).

Якщо машина Тюрінга, знаходячись у стані qi і зчитуючи записаний на стрічці символ sk, переходить до нового стану qj, заміщує сим­вол поточної ча­рунки на символ sm і зрушує при цьому інформаційну стрічку уліво на одну ча­рунку, то кажуть, що машина виконує команду qjskqjsmЛ4 (якщо заміщен­ня символу не відбувається, то стан sm у команді може бути відсунім).

Розгляньмо, наприклад, роботу машини Тюрінга з алфавітами А={0, 1} і Q = {q0, q1} та командами «q11q1» і «q10q11C». Нехай чарунки інформа­ційної стрічки містять слово 11100 і голівку розташовано над найправішою оди­ницею (мал 2, а):

(а)

(б)

S0

1

1

1

1

0

0

S0

1

2

3

...

r-1

r

S0

1

1

1

1

1

0

S0

1

2

3

...

r-1

r

Мал. 2

Тоді в результаті виконання команд це слово буде перетворено машиною Тюрінга на слово 11110 (мал. 2, б).

Машину Тюрінга із зовнішнім алфавітом А = {0, 1} називають нести­ра­ючою, якщо вона спроможна виконати лише команди: qα0qβаT і qα1qβ1T, де а = {0, 1}, Т = {С, Л, П}, тобто якщо вона може вписати 1 у порожню ча­рунку, але не може знищити вміст чарунки, якщо вона містить 1.

Будемо вважати машину Тюрінга заданою, якщо задано її зовнішній і внутрішній алфавіти, програмою, початковий стан (конфігурацію), зазначено сим­во­л, що позначає порожню чарунку і визначено її заключний стан (конфігу­ра­цію).

Нехай, наприклад, машину Тюрінга задано:

 зовнішнім алфавітом A = {s0, a, b, c, d};

 внутрішнім алфавітом Q = {q0, q1, q2, q3, q4, q5};

 сукупністю команд: q0aq1, q0bq0, q2aq5, q0сq0сЛ, q1dq2cП, q3aq4dП, q4bq2;

 початковим станом q0 із конфігурацією bcadc;

 символом S0, що позначає порожню чарунку;

 заключним станом q5 із конфігурацією bcdcc.

Роз­гляньмо алгоритм роботи машини Тюрінга, що перетворює її початковий стан в заключний. Алгоритм за звичай записують у вигляді таблиці:

Крок

Команда

Конфігурація

Початковий стан

q0bcadc

1

q0b q0

bq0cadc

2

q0c q0

bcq0adc

3

q0a q1

bcaq1dc

4

q1d q2

bcq2acc

5

q2a q5

bq5cdcc

Заключний стан

bq5cdcc

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

В залежності від кількості використовуваних інформаційних стрічок, їх­нього призначення і кількості станів пристрою керування визначаються різні мо­­дифікації машин Тюрінга. Розгляньмо основні з них.

Машина Тюрінга з двома виходами

Розширимо визначення машини Тюрінга, додавши в пристрій керування визначений стан q*. Якщо для заданого вхідного слова Х пристрій керування переходить у стан q0, то будемо казати, що машина припускає Х, а якщо прист­рій керування переходить у стан q*, то будемо казати, що машина забороняє Х. Такий пристрій будемо називати машиною Тюрінга з двома виходами.

Виявляється: якщо задано дві машини Тюрінга Т1 і Т2, які припус­ка­ють множини слів Х1 і Х2, що не перетинаються, то завжди можна побудувати ма­ши­ну Тюрінга Т3 з двома виходами, яка буде припускати Х1 і забороняти X2.

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

Багатострічкова машина Тюрінга

Схема багатострічкової машини Тюрінга містить скінчену кількість ін­фор­ма­ційних стрічок, кожна чарунка яких може містити один із символів зов­ні­ш­нього алфавіту A = {s0, s1, ..., sn}. Чарунки із символом S0 враховуються поро­жніми. Пристрій керування у кожний момент часу знаходиться в однім із станів скінченої множини станів Q = { q0, q1, ..., qm }. Нарешті, припустимо, що у кож­ний момент часу машина працює тільки з однією чарункою кожної стрічки. ши­ну Тюрінга Т3 з двома виходами, яка буде припускати Х1 і забороняти X2. Конфігурація машини враховується заданою, якщо відомі: стан q прист­рою керування, стан чарунок усіх стрічок, вказані чарунки, які сприймаються машиною. Таким чином, конфігурація n-стрічкової машини в i-ий момент часу визначається системою n слів: