Uploaded by Станислав Фоменко

КУРСОВИЙ ПРОЕКТ з дисципліни: «Дискретні структури і алгоритми» на тему: «Розробка аналітичних моделей алгоритмів та оцінка їх тимчасової складності»

advertisement
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ДВНЗ «ДОНЕЦЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ»
Факультет КНТ
Кафедра ПМІ
КУРСОВИЙ ПРОЕКТ
з дисципліни: «Дискретні структури і алгоритми»
на тему: «Розробка аналітичних моделей алгоритмів та
оцінка їх тимчасової складності»
Студента
курсу ІПЗ-17
2
групи
спеціальності 121 «Програмна інженерія»
Фоменко Станіслава Вячеславовича
Керівник
І. А. Назарова
Національна оцінка
Кількість балів
Члени комісії
І. В. Ярош
(підпис)
(прізвище та ініціали)
(підпис)
(прізвище та ініціали)
(підпис)
(прізвище та ініціали)
Т. О. Черняк
Покровськ – 2018 р.
РЕФЕРАТ
Звіт з курсового проекту містить: 53 сторінки, 37 рисунків, 2 таблиці,
4 додатки, 9 джерел.
Об'єкт дослідження в роботі – аналітичні моделі алгоритмів, а саме 
рекурсивні функції, машини Тьюрінга, нормальні алгоритми Маркова.
Мета роботи – сформувати навички у конструюванні формальних
моделей алгоритмів у вигляді трьох аналітичних моделей, написати програмну
реалізацію
машини
Тьюрінга
для
розпізнавання
слів
мови
L  www | w  a, b, c*, оцінити тимчасову складність машини Тьюрінга, що
розпізнає задану формальну мову, побудувати аналітичну та емпіричну функції
тимчасової складності.
Результат роботи – формальні аналітичні моделі алгоритмів на основі
теорії рекурсивних функцій, машин Тьюрінга і нормальних алгоритмів
Маркова, програмна реалізація машини Тьюрінга, що розпізнає слова заданої
мови
L  www | w  a, b, c*,
графіки
тимчасової
складності
машини
Тьюрінга, файловий варіант протоколу роботи машини Тьюрінга.
ТИМЧАСОВА
СКЛАДНІСТЬ,
АЛГОРИТМ,
РЕКУРСИВНА
ФУНКЦІЯ,
МАШИНА ТЬЮРІНГА, НОРМАЛЬНИЙ АЛГОРИТМ, СЛОВО, ПРОТОКОЛ
ЗМІСТ
Вступ ............................................................................................................................. 5
1 Розробка формальної моделі алгоритму на основі теорії рекурсивних функцій 6
1.1 Постановка завдання з розробки формальної моделі алгоритму на основі
теорії рекурсивних функцій…………………………………. .................................. 6
1.2 Розробка алгоритму обчислення заданої функції у вигляді рекурсивної
функції ……………………………………………………………………………….6
1.3 Тестування розробленого алгоритму на основі рекурсивних функцій та
аналіз типу рекурсивної функції……………………………. .................................. 7
2 Розробка аналітичної моделі алгоритму у вигляді машини Тьюрінга ............... 9
2.1 Розробка аналітичної моделі алгоритму у вигляді класичної машини
Тьюрінга…………………………………………………………............................... 9
2.1.1 Постановка завдання розробки аналітичної моделі алгоритму у вигляді
класичної машини Тьюрінга………………………………… .................................. 9
2.1.2 Розробка аналітичної моделі алгоритму у вигляді класичної машини
Тьюрінга………………………………………………………................................. 10
2.1.3 Тестування розробленої аналітичної моделі алгоритму у вигляді класичної
машини Тьюрінга……………………………………………. ................................. 12
2.2 Розробка аналітичної моделі алгоритму у вигляді елементарних машин
Тьюрінга і їх композиції……………………………………................................... 17
2.2.1 Постановка завдання розробки аналітичної моделі алгоритму у вигляді
композиції елементарних машин Тьюрінга………………………… ................... 17
2.2.2 Розробка
аналітичної
моделі
алгоритму
у
вигляді
композиції
елементарних машин Тьюрінга…………………………………… ....................... 17
2.3 Машина Тьюрінга, що розпізнає формальну мову………………….............. 19
2.3.1 Постановка завдання розробки аналітичної моделі алгоритму для машини
Тьюрінга, що розпізнає формальну мову………………………….. ..................... 20
2.3.2 Розробка аналітичної моделі алгоритму для машини Тьюрінга, що
розпізнає формальну мову………………………………….. ................................. 20
2.3.3 Розробка програмної моделі алгоритму для машини Тьюрінга, що
розпізнає формальну мову………………………………………… ....................... 26
3 Розробка аналітичної моделі алгоритму у вигляді нормального алгоритму
Маркова ...................................................................................................................... 34
3.1 Постановка завдання розробки аналітичної моделі алгоритму у вигляді
нормального алгоритму Маркова………………………………… ........................ 34
3.2 Реалізація алгоритму у вигляді нормального алгоритму Маркова ................ 34
3.3 Тестування
розробленої
аналітичної
моделі
алгоритму
у
вигляді
нормального алгоритму Маркова………………………………… ........................ 35
Висновки .................................................................................................................... 37
Перелік посилань....................................................................................................... 38
Додаток А Технічне завдання ................................................................................. 39
Додаток Б Керівництво користувача...................................................................... 43
Додаток В Екранні форми ........................................................................................ 46
Додаток Г Лістинг основної частини програми ..................................................... 47
5
ВСТУП
Підставою для виконання роботи є завдання на курсовий проект, видане
кафедрою
прикладної
математики
та
інформатики
ДВНЗ
«Донецький
національний технічний університет».
Метою курсового проекту є закріплення знань і умінь, придбаних при
вивченні дисципліни «Дискретні структури і алгоритми». Завдання курсового
проекту передбачають детальний
розгляд наступних тем: «Рекурсивні
функції», «Класична машина Тьюрінга», «Композиція елементарних машин
Тьюрінга», «Машина Тьюрінга, що розпізнає формальну мову», «Нормальний
алгоритм Маркова».
Виконання завдань курсового проектування з навчального курсу
«Дискретні структури і алгоритми» дозволить отримати комплекс знань,
необхідних для розуміння проблем, які виникають під час побудови та при
використанні сучасних програмних систем, що вирішують інтелектуальні
завдання.
Головна мета даного проекту орієнтована на роботу з формальною
мовою, а саме – з алгоритмами та програмним забезпеченням, яке розпізнає
слово заданої мови. Розпізнавання формальної мови  важлива та актуальна
частина сучасного програмування, яка дозволяє виявити синтаксичні помилки
на етапі написання, не використовуючи повного перебору за словником. У мові
програмування
транслятор
переводить
синтаксичні
конструкції
мови
програмування в команди, зрозумілі операційній системі та процесору.
Значеннєві помилки транслятор виявити не може, їх пошук відбувається під час
налагодження, тестування та використання програми людиною.
6
1 РОЗРОБКА ФОРМАЛЬНОЇ МОДЕЛІ АЛГОРИТМУ НА ОСНОВІ ТЕОРІЇ
РЕКУРСИВНИХ ФУНКЦІЙ
1.1 Постановка завдання з розробки формальної моделі алгоритму на
основі теорії рекурсивних функцій
Одним із завдань курсового проектування є задача розробки формальної
моделі алгоритму у вигляді рекурсивної функції, визначення її типу та
перевірка правильності на тестових прикладах.
Поставлене завдання:
 розробити алгоритм знаходження найменшого спільного кратного двох
чисел, K  x, y , K  x,0  K 0, y   0 .
1.2 Розробка алгоритму обчислення заданої функції у вигляді рекурсивної
функції
Згідно до поставленого завдання був розроблений алгоритм, сутність
якого полягає у тому, що існує певний масив, у якого першим елементом є
максимальний елемент з x, y , наступні елементи є збільшеним на одиницю
відносно попереднього елементу (або x  y ,
x  y   2 ,
у випадку наявності
залишку від ділення елементу на x, y ), а останній елемент являє собою добуток
між x, y . Результатом роботи алгоритму буде найменший елемент масиву, який
ділиться на x, y без залишку.
Алгоритм для знаходження найменшого загального кратного двох чисел,
K  x, y , K  x,0  K 0, y   0 у вигляді рекурсивної функції буде мати вигляд,
наведений формулою (1.1).
x y

K ( x, y)  sg x   sg  y   i min
i  sg i div x   sg i div y  
max  x , y 
 x  y  sg i div x   sg i div y ,
де i div x  залишок від ділення i на x.
(1.1)
7
1.3 Тестування розробленого алгоритму на основі рекурсивних функцій
та аналіз типу рекурсивної функції
За аналізом рекурсивної функції, що приведена формулою (1.1), можна
зробити висновок про те, що остаточна (кінцева) запропонована для вирішення
поставленого завдання функція була утворена із найпростіших функцій за
допомогою
скінченного
числа
застосувань
операторів
суперпозиції
і
примітивної рекурсії, а також вона є усюди визначеною. Саме тому вона є
примітивно-рекурсивною функцією.
Також необхідно перевірити правильність її роботи, виконавши тестові
розрахунки.
Тестові приклади роботи запропонованого алгоритму були проведені на
самих показових випадках, щоб обробити всі значущі варіанти вхідних значень
та прослідити поведінку алгоритму.
Тест №1: за умови, що x  0, y  4 , очікуваний результат: 0.
K 0,4  sg (0)  sg 4  min    0
0
i 4
Тест №2: за умови, що x  3, y  0 , очікуваний результат: 0.
K 0,4  sg (3)  sg 0  min    0
0
i 3
Тест №3: за умови, що x  0, y  0 , очікуваний результат: 0.
K 0,0  sg (0)  sg 0  min    0
0
i 0
8
Тест №4: за умови, що x  3, y  4 , очікуваний результат: 12.
K 3,4   sg (3)  sg 4  

 min 4  sg 4 div 3  sg 4 div 4   3  4  sg 4 div 3  sg 4 div 4  
12
i 4
 4  0  1  3  4  1  0   12,
5  sg 5 div 3  sg 5 div 4   3  4  sg 5 div 3  sg 5 div 4  
 5  0  0  3  4  1  1  24,
6  sg 6 div 3  sg 6 div 4   3  4  sg 6 div 3  sg 6 div 4  
 6  1  0  3  4  0  1  12,
7  sg 7 div 3  sg 7 div 4   3  4  sg 7 div 3  sg 7 div 4  
 7  0  0  3  4  1  1  24,
8  sg 8 div 3  sg 8 div 4   3  4  sg 8 div 3  s8 div 4  
 8  0  1  3  4  1  0   12,
9  sg 9 div 3  sg 9 div 4   3  4  sg 9 div 3  s 9 div 4  
 9  1  0  3  4  0  1  12,
10  sg 10 div 3  sg 10 div 4   3  4  sg 10 div 3  s10 div 4  
 10  0  0  3  4  1  1  24,
11  sg 11 div 3  sg 11 div 4   3  4  sg 11 div 3  s11 div 4  
 11  0  0  3  4  1  1  24,
12  sg 12 div 3  sg 12 div 4   3  4  sg 12 div 3  s12 div 4  
 12  1  1  3  4  0  0   12  1  1  12  12
Отримані результати свідчать про вірну роботу створеного алгоритму на
основі рекурсивних функцій для вирішення поставленого завдання, тобто для
здійснення пошуку найменшого загального кратного двох чисел.
9
2 РОЗРОБКА АНАЛІТИЧНОЇ МОДЕЛІ АЛГОРИТМУ У ВИГЛЯДІ МАШИНИ
ТЬЮРІНГА
Машина Тьюринга (МТ) – це математична модель ідеалізованої цифрової
обчислювальної машини [3]. Для опису алгоритму МТ зручно представляти
деякий пристрій, що складається з чотирьох частин.
Частина 1. Стрічка є потенційно нескінченною, розбитою на осередки
(рівні клітини). При необхідності до першої або останньої клітці, в якій
знаходяться символи, прилаштовується порожня клітка. Машина працює в часі,
який вважається дискретним, і його моменти занумеровані. У кожен момент
стрічка містить кінцеве число клітин. У клітини в дискретний момент часу
може бути записаний тільки один символ (буква) із зовнішнього алфавіту A.
Частина
2.
Керуючий
пристрій
(деякий
зчитувальний
елемент)
переміщається уздовж стрічки так, що в кожен момент часу вона оглядає рівно
одну комірку стрічки. Голівка може зчитувати вміст комірки та записувати в
неї новий символ з алфавіту А. В одному такті роботи вона може зміщуватися
тільки на одну клітинку вправо, вліво або залишатися на місці.
Частина 3. Внутрішня пам'ять машини являє собою деяку кінцеву
множину внутрішніх станів Q  {q0 , q1 , q2 ,, qm }, m  1 . [1]
2.1 Розробка аналітичної моделі алгоритму у вигляді класичної машини
Тьюрінга
2.1.1 Постановка завдання розробки аналітичної моделі алгоритму у
вигляді класичної машини Тьюрінга
Поставлене завдання полягає в тому, що необхідно описати системою
команд, функціональною таблицею та діаграмою переходів роботу класичної
машини Тьюрінга, що реалізує обчислення предикату x  y в унарному коді.
Початкова і заключна конфігурації є стандартними. Також необхідно
перевірити модель алгоритму на множині тестових прикладів та привести
послідовності конфігурацій машини Тьюрінга для різних тестових вхідних слів.
10
2.1.2 Розробка аналітичної моделі алгоритму у вигляді класичної машини
Тьюрінга
Сутність розробленого алгоритму полягає у тому, що на стрічці керуючий
пристрій (далі – КП) рухається вправо до тих пір, поки не знайде символ  .
Після чого пари символів справа та зліва від символу  симетрично
відмічаються символом * . Якщо з однії зі сторін закінчилися символи раніше,
ніж у другій – числа не рівні, КП йде до кінця усього слова та записує туди 0.
Інакше, визначається, що символи закінчились одночасно та КП теж йде до
кінця слова, але на цей раз зщаписує туди 1, як знак того, що числа рівні.
Комбінація, коли справа та зліва від символу  нічого немає – допустима.
Система команд МТ для алгоритму обчислення предикату x  y в
унарному коді приведена на рис. 2.1.
1. q1 | q2 sR
2. q1  q3  R
3. q2 | q2 | R
4. q2  q4  R
5. q2  q11R
6. q3 | q11 | R
7. q3 *  q3 | R
8. q3  q3  R
9. q3  q10R
10 .q4 | q5 * L
11. q4  q14L
12. q5 | q6 * R
13. q5  q5  L
14. q5 s  q3 | R
15. q6 | q6 | R
16. q6 | q7 | R
17. q6  q6  R
18. q7 | q6 * L
19. q7   q6L
Рисунок 2.1 – Система команд КМТ
11
20. q8 | q8 | L
21. q8 *  q9 | L
22. q8  q8  L
23. q9 | q8 * R
24. q9  q9  R
25. q9 s  q12  R
26. q10 | q10 | R
27. q10  q10  R
28. q10  qz 1R
29. q11 | q11 | R
30. q11  q11  R
31. q11  qz 0 R
32. q12 | q12 | R
33. q12 *  q13 | R
34. q12  q12  R
35. q13 | q11 | R
36. q12  qz 1R
37. q14 | q14 | L
38. q14 *  q14 | L
39. q14  q14  L
40. q14 s  q11 | R
Рисунок 2.1, частина 2
Функціональна таблиця класичної машини Тьюрінга, що реалізує
обчислення предикату x  y в унарному коді, приведена у таблиці 2.1.
Таблиця 2.1 – Функціональна таблиця КМТ
qi \ a j
|
*
=
s

q1
q2 sR

q3  R


q2
q2 | R

q4  R

q11R
q3
q11 | R
q3 | R
q3  R

q10R
q4
q5 * L



q14L
q5
q6 * R

q5  L
q3 | R

12
Продовження таблиці 2.1
Діаграма
qi \ a j
|
*
=
s

q6
q6 | R
q7 | R
q6  R


q7
q8 | L



q14L
q8
q8 | L
q9 | L
q8  L


q9
q6 | R

q9  R
q12 | R

q10
q10 | R

q10  R

qz1R
q11
q11 | R

q11  R

qz 0R
q12
q12 | R
q13 | R
q12  R


q13
q11 | R



qz1R
q14
q14 | L
q14 | L
q14  L
q11 | R

переходів
класичної
машині
Тьюрінга
для
алгоритму
обчислення предикату x  y в унарному коді приведена на рис. 2.3.
Рисунок 2.3 – Діаграма переходів МТ
2.1.3 Тестування розробленої аналітичної моделі алгоритму у вигляді
класичної машини Тьюрінга
Наступним кроком було виконання тестування.
13
Тестування алгоритму класичної машини Тьюрінга, що реалізує
обчислення предикату x  y в унарному коді необхідне для того, щоб
переконвтися у правильності роботи запропонованого алгоритму.
Тест 1 передбачав розгляд випадку, коли на стрічці розміщено « |||||| ».
Результат тесту приведений на рис. 2.4.
qi | Протокол
q1 | ... | || ||| ...
q 2 | ...s | |||| ...
q 2 | ...s | | ||| ...
q 2 | ...s ||  ||| ...
q 4 | ...s ||  | || ...
q5 | ...s ||  * || ...
q5 | ...s | |  * || ...
q 6 | ...s | *  * || ...
q 6 | ...s | *  * || ...
q 7 | ...s | * | | | ...
q8 | ...s | *  | * | ...
q8 | ...s | *  | * | ...
q8 | ...s | * | * | ...
q9 | ...s | || * | ...
q 6 | ...s * | | * | ...
q 6 | ...s* |  | * | ...
q 6 | ...s* | | * | ...
q 6 | ...s* || * | ...
q 7 | ...s* ||| | ...
q8 | ...s* || | * ...
q8 | ...s* | | | *...
q8 | ...s* |  || *...
Рисунок 2.4 – Протокол роботи КМТ для тесту 1
14
q8 | ...s * | || *...
q8 | ...s * ||| *...
q9 | ... s |||| *...
q12 | ... | | ||| *...
q12 | ... || | || *...
q12 | ... |||  || *...
q12 | ... |||  | | *...
q12 | ... ||| | | * ...
q12 | ... ||| || * ...
q13 | ... ||| |||
..
qz | ... ||| ||| 1..
Рисунок 2.4, частина 2
Тест 2 передбачав розгляд випадку, коли на стрічці розміщено «||=|».
Результат наведений на рис. 2.5.
qi | Протокол
q1 | ... | || ...
q2 | ...s | | ...
q2 | ...s |  | ...
q4 | ...s | | ...
q5 | ...s |  * ...
q5 | ...s |  *...
q6 | ...s *  * ...
q6 | ...s*  * ...
q7 | ...s* |
..
q14 | ...s*  | ...
q14 | ...s *  | ...
q14 | ...s * | ...
q14 | ... s || ...
Рисунок 2.5 – Протокол роботи КМТ для тесту 2
15
q11 | ... | | | ...
q11 | ... ||  | ...
q11 | ... ||  | ...
q11 | ... || |
..
qz | ... ||| 0 .
Рисунок 2.5, частина 2
Тест 3 передбачав розгляд випадку, коли на стрічці розміщено «|=||».
Результат приведений на рис. 2.6.
qi | Протокол
q1 | ... | || ...
q2 | ...s  || ...
q4 | ...s  | | ...
q5 | ...s  * | ...
q5 | ... s  * | ...
q3 | ... |  * | ...
q3 | ... | * | ...
q3 | ... || | ...
q11 | ... |||
..
q z | ... ||| 0 .
Рисунок 2.6 – Протокол роботи КМТ для тесту 3
Тест 4 передбачав розгляд випадку, коли на стрічці розміщено «=||».
Результат приведений на рис. 2.7.
qi | Протокол
q1 | ...  | | ...
q3 | ...  | | ...
q11 | ... | | ...
q11 | ... ||
..
Рисунок 2.7 – Протокол роботи КМТ для тесту 4
16
qz | ... || 0 .
Рисунок 2.7, частина 2
Тест 5 передбачав розгляд випадку, коли на стрічці розміщено «||=».
Результат приведений на рис. 2.8.
qi | Протокол
q1 | ... | | ...
q2 | ...s |  ...
q2 | ...s |  ...
q4 | ...s |
..
q14 | ...s |  ...
q14 | ...s |  ...
q14 | ... s | ...
q11 | ... | |  ...
q11 | ... | |  ...
q11 | ... || 
..
q z | ... ||  0 .
Рисунок 2.8 – Протокол роботи КМТ для тесту 5
Тест 6 передбачав розгляд випадку, коли на стрічці розміщено «=».
Результат приведений на рис. 2.9.
qi | Протокол
q1 | ...  ...
q3 | ...  ..
q10 | ...  . .
qz | ...  .1
Рисунок 2.9 – Протокол роботи КМТ для тесту 6
17
2.2 Розробка аналітичної моделі алгоритму у вигляді елементарних
машин Тьюрінга і їх композиції
Спосіб
розробки
і
подання
алгоритму
класичної
МТ
можна
використовувати тільки для нескладних алгоритмів, в іншому випадку опис
стає занадто громіздким. Машини Тьюрінга для складних алгоритмів можуть
будуватися з використанням вже наявних елементарних МТ і така побудова
називається композицією МТ.
Є чотири способи композиції МТ: послідовна композиція (суперпозиція);
паралельна композиція; розгалуження або умовний перехід; цикл.
2.2.1 Постановка завдання розробки аналітичної моделі алгоритму у
вигляді композиції елементарних машин Тьюрінга
Завдання: побудувати машину Тьюрінга, яка знаходить найменше
загальне кратне двох чисел, K  x, y , K  x,0  K 0, y   0 . Машину Тьюрінга
представити, як композицію елементарних МТ, що виконують операції:
копіювання аргументу, установка довільної константи, додавання, множення,
арифметичне віднімання, знаходження цілої частини та залишку від ділення,
відношення над аргументами (рівність, більше, менше, більше та рівність,
нерівність тощо), арифметизовані логічні функції (логічне «і», логічне «або»
тощо), виділення аргументу. Відсутні у переліку елементарні МТ, необхідні для
реалізації заданого алгоритму, описати будь-яким відомим способом.
2.2.2 Розробка аналітичної моделі алгоритму у вигляді композиції
елементарних машин Тьюрінга
Сутність розробленого алгоритму композиції МТ полягає у тому, що на
вхід подається x, y , які спочатку по черзі перевіряються на рівність нулю.
Якщо обидві змінні більше нуля, то алгоритм продовжує свою роботу, інакше –
повертає 0. Далі визначається максимальне з x, y та береться в якості змінноїнакопичувача, яка тимчасово виступає у ролі найменшого спільного кратного
на етапі перевірки, а саме – при виконанні ділення накопичувача на x, y без
18
залишку. Якщо накопичувач ділиться на обидві змінні без залишку, алгоритм
повертає у якості результату значення накопичувача, інакше – накопичувач
збільшується на значення максимального з x, y та перевірка повторюється до
тих пір, поки не виконається умова або накопичувач не прийме значення x  y .
Список використовуваних елементарних МТ:
 M 0 ( M )  використовується для перевірки значення на нуль;
 M div (M nm , M nm )  використовується для отримання залишку від ділення
першого аргументу на другий аргумент;
 M nm  використовується для вибору m-аргументу з n-аргументів;
 M  (M nm , M nm )  використовується для складання значення першого
аргументу з другим аргументом;
 M  ( M nm , M nm )  використовується для арифметичного віднімання;
 M 0  реалізує копіювання вхідного слова.
Блок-схема аналітичної моделі алгоритму приведена на рис. 2.10.
x,y
x=0
1
0
1
0
1
max:=y
min:=x
1
i
0
y=0
0
x

y=0
0
max:=x
min:=y
i:=max
i div min=0
0
i+=max
Рисунок 2.10  Блок-схема аналітичної моделі алгоритму МТ
19
Схема композиції МТ приведена на рис. 2.11.
w=1
xy
M
wxy
(M 2 )  M
0
1
0
0
1
M
 M
0
end
w=0 x y
1
2
M
(M 2 )  M
wxy
2
0
0
α
w=1
α
wxy
0
1
M
 M
0
end
w=0 x y
2
2
w=0 x y
wxy
β
0
1
M0M
0
M
2
M
2
Ψ
( M 2 , M 2 ))  M
1
(M

 M
2
 M
2
2
 M
2
 M
2
1
wxy
2
 M
2
 M
2
2
β
0
 M
2
 M
2
π
1
w=1 x y
x y max min i
π
1
M
0
M
0
(M
1
5
div
4
(M 5 , M
5
2
))  M
2
1
π
2
w x max min i
0
0
1
M
 M
0
µ
5
5
w=1
end
µ x y max min i
M
1
5
 M
2
5
 M
3
5
 M
4
5
 M

(M
3
5
,M
5
5
x y max min i
)
Ψ
Рисунок 2.11  Композиція аналітичної моделі алгоритму МТ
2.3 Машина Тьюрінга, що розпізнає формальну мову
Формальним мовою, визначеною на базовій U -множині, називається
будь-яка підмножина вільної напівгрупи U * , інакше  будь-яка безліч
ланцюжків з елементів U . Для будь-якого U безліч симетричних слів є мовою,
не замкнутим щодо конкатенації (крім випадку, коли U складається з однієї
літери). [2]
Алфавітом називається будь-яка кінцева безліч деяких символів.
Наприклад, множина {1, 2}  це алфавіт, що складається з одиниці і двійки,
безліч {А, В, ..., Z} являє собою алфавіт великих латинських букв, а безліч {а,
а2, а3, а4} описує алфавіт з чотирьох елементів. Як правило, алфавіт
позначається якоюсь великою грецькою буквою (наприклад ∑ = {0, 1}). [3]
Формальна мова L над алфавітом А – це довільна множина ланцюжків,
складених з символів алфавіту А. Довільність тут означає той факт, що мова
20
може бути пуста, тобто не мати ні одного ланцюжка, так і нескінченна, тобто
складена з нескінченного числа ланцюжків. [4]
2.3.1 Постановка завдання розробки аналітичної моделі алгоритму для
машини Тьюрінга, що розпізнає формальну мову
Завдання: розробити машину Тьюрінга (багатострічкову або КМТ), що
розпізнає
задану
варіантом
формальну
мову
L  www | w  a, b, c*.
Програмно реалізувати емулятор МТ і побудувати графіки аналітичної та
експериментальної функції тимчасової складності t(n) МТ (для розміру задачі n,
що вимагає не більш 5 хвилин розрахунку).
2.3.2 Розробка аналітичної моделі алгоритму для машини Тьюрінга, що
розпізнає формальну мову
Для реалізації машини Тьюрінга, що розпізнає формальну мову
L  www | w  a, b, c*, було використано 3 стрічки (ММТ): перша стрічка
зберігає слово, яке перевіряється, а також на неї записується результат роботи
машини; друга стрічка зберігає перший символ слова; третя стрічка зберігає
слово, який вважається за w .
Алгоритм роботи машини Тьюрінга полягає в тому, що записується
перший символ на другу стрічку, після цього виконується переміщення вправо
по першій стрічці, записуючи все прочитане на третю стрічку до тих пір, поки
не зустрічається символ, який збігається з символом на другій стрічці. Після
того, як зустрічається символ, який збігається з тим, що зберігається на другій
стрічці, виконується перехід в початок третьої стрічки і послідовно
порівнюється вміст третьої стрічки з тим, що йде далі на першій стрічці. У разі,
якщо десь зустрілася невідповідність або слово на третій стрічці закінчилося, а
символ на першій стрічці не збігається з тим, що зберігається на другій стрічці,
то доповнюється записане на третій стрічці символами, що йдуть до наступного
символу першої стрічки, співпадаючого з записаним на другій стрічці, та
запускається перевірка заново.
21
Для випадку, коли слово на третій стрічці закінчилося, а символ на
першій стрічці збігається з тим, що зберігається на другій, знову здійснюється
повернення до початку третьої стрічки і порівнюється третє слово. У разі, якщо
йде перевірка третього слова і зустрічається невідповідність символів першої та
третьої стрічок, то знову доповнюється слово на третій стрічці і починається
порівняння другого слова. Якщо символи на першій та третій стрічці
закінчилися одночасно, то робиться висновок, що запис є словом мови
L  www | w  a, b, c*. Якщо символи на першій стрічці закінчилися раніше
ніж на третій стрічці або коли прочитано тільки одне або два слова, то робиться
висновок про те, що запис не є словом мови L  www | w  a, b, c*. Пусте
слово є допустимим, його можна трактувати як три порожніх символи.
Система команд ММТ для алгоритму, що розпізнає задану формальну
мову, приведена на рис. 2.12.
1. q00 * *  *q z1 * *SSS
2. q00 a * *  q01 * aaRSR
3. q00b * *  q01 * bbRSR
4. q00c * *  q01 * ccRSR
5. q01 * *  q z 0 * * * SSS
6. q01aa*  q02 * * * SSL
7. q01bb*  q02 * * * SSL
8. q01cc*  q02 * * * SSL
9. q01a * *  q01 * *aRSR
10. q01b * *  q01 * *bRSR
11. q01c * *  q01 * *cRSR
12. q02 * *  q10 * * * SSR
13. q02 * **  q02 * * * SSL
14. q10 a * a  q10 * * * SSR
15. q10b * b  q10 * * * SSR
16. q10c * c  q10 * * * SSR
17. q10 aa  q20 * * * SSL
18. q10bb  q20 * * * SSL
19. q10cc  q20 * * * SSL
20. q10 ab  q11 * * * SSL
21. q10 ac  q11 * * * SSL
22. q10ba  q11 * * * SSL
Рисунок 2.12  Система команд ММТ
22
23. q10bc  q11 * * * SSL
24. q10ca  q11 * * * SSL
25. q10cb  q11 * * * SSL
26. q10 * *  q z 0 * * * SSS
27. q10 * **  q11 * * * SSS
28. q11 * *  q12 * * * SSS
29. q11 * **  q11 * * * SSS
30. q12 * *  q13 * * * RSS
31. q12 * **  q12 * * * LSS
32. q13a *   q01 * *aRSR
33. q13b *   q01 * *bRSR
34. q13c *   q01 * *cRSR
35. q13 * **  q13 * * * RSR
36. q20 * *  q21 * * * SSR
37. q20 * **  q20 * * * SSL
38. q21 *   q z1 * * * SSS
39. q21a * a  q21 * * * RSR
40. q21b * b  q21 * * * RSR
41. q21c * c  q21 * * * RSR
42. q21 * *  q z 0 * * * SSS
43. q21 * **  q11 * * * SSL
44. q z 0 * **  q z 0 * * * SSS
45. q z1 * **  q z1 * * * SSS
Рисунок 2.12, частина 2
Протокол для випадку, коли на стрічці розміщено « aaa », приведений на
рис. 2.13.
qi | Протокол
q00 | .......aaa......
| ...... . ...........
| ...... . ...........
Рисунок 2.13  Протокол роботи ММТ для розпізнавання слова «aaa»
23
q01 | .......a aa......
| ......a...........
| ......a . ........
q02 | .......a aa......
| ......a...........
| ......a...........
q02 | .......a aa......
| ......a...........
| ... . a...........
q10 | .......a aa......
| ......a...........
| ......a...........
q10 | .......a aa......
| ......a...........
| ......a...........
q10 | .......aaa......
| ......a...........
| ......a . ........
q20 | .......aaa......
| ......a...........
| ......a...........
q20 | .......aaa......
| ......a...........
| ... . a............
q21 | .......aaa......
| ......a...........
| ......a...........
q21 | .......aaa......
| ......a...........
| ......a . ........
Рисунок 2.13, частина 2
24
qz1 |.......aaa . ....
| ......a...........
| ......a . ........
qz |.......aaa1.....
| ......a...........
| ......a . ........
Рисунок 2.13, частина 3
Протокол для випадку, коли на стрічці « », приведений на рис. 2.14.
qi | Протокол
q00 |........ . .......
| ....... . ..........
| ....... . ..........
qz 0 |........ . .......
| ....... . ..........
| ....... . ..........
qz |.........1...........
| ....... . ..........
| ....... . ..........
Рисунок 2.14  Протокол роботи ММТ для слова « »
Протокол для випадку, коли на стрічці « bca », приведений на рис. 2.15.
qi | Протокол
q00 | .......bсa.......
| ...... . ..........
| ...... . ..........
Рисунок 2.15  Протокол роботи ММТ для слова « bca »
25
q01 | .......bсa......
| ......b..........
| ......b . .......
q01 | .......bca......
| ......b...........
| ......bc . ......
q01 | .......bca......
| ......b...........
| ......bca . ....
q z 0 | .......bca......
| ......b...........
| ......bca . ....
q z 0 | .......bca0....
| ......b...........
| ......bca . ....
Рисунок 2.15, частина 2
Протокол для випадку, коли на стрічці « acac », приведений на рис. 2.16.
qi | Протокол
q00 | .......aсaс...
| ...... . ........
| ...... . ........
q01 | .......a сac....
| ......a.........
| ......a . .......
q01 | .......acac.....
| ......a...........
| ......a...........
Рисунок 2.16  Протокол роботи ММТ для слова « acac »
26
q02 | .......acac.....
| ......a...........
| ......a c..........
q02 | .......acac.....
| ......a...........
| ......ac.........
q02 | .......acac.....
| ......a..........
| ... . ac........
q10 | .......acac....
| ......a...........
| ......aс........
q10 | .......acac....
| ......a...........
| ......a с........
q10 | ......acac . ..
| ......a..........
| ......ac . ......
q z 0 | ......acac . ..
| ......a..........
| ......ac . ......
q z | ......acac0..
| ......a..........
| ......ac . ......
Рисунок 2.16, частина 2
2.3.3 Розробка програмної моделі алгоритму для машини Тьюрінга, що
розпізнає формальну мову
Була розроблена програма, яка має зрозумілий та інтуїтивний інтерфейс,
у якій реалізовані наступні функції:
 вибір файлу який містить команди;
27
 перевірка окремих слів, з підтримкою вибору швидкості анімації
процесу перевірки;
 побудова графіка експериментальної функції тимчасової складності;
 запис протоколу роботи в файл.
За вибір файлу відповідає кнопка «Завантажити команди з файлу», при
натисканні на неї з'являється діалогове вікно провідника Windows, за
допомогою якого вибирається файл. Файли повинні мати розширення *.txt.
За
допомогою
перемикачів
«повільно»,
«нормально»,
«швидко»
обирається швидкість відображення анімації процесу перевірки слова на
приналежність мові.
Процес перевірки запускається натисканням кнопки «Перевірити слово на
приналежність». Ці складові розташовані на першій вкладці вікна програми.
На другій вкладці розташований лічильник, за допомогою якого
вибирається значення максимальної довжини слова для побудови графіку
експериментальної функції тимчасової складності, кнопка «Побудувати» та сам
графік.
При натисканні кнопок «Перевірити слово на приналежність» та
«Побудувати» спочатку перевіряється наявність завантажених команд, а вже
потім починають роботу відповідні алгоритми.
Блок-схема загального алгоритму роботи програми приведена на
рисунку 2.17.
Алгоритм побудови графіку полягає в тому, що послідовно генеруються
слова довжиною від одного до максимальної, яка обрана за допомогою
лічильника, та виконується перевірка цього слова на приналежність мові.
Для кожного слова налічується кількість тактів, необхідних для
виконання алгоритму перевірки і в результаті для кожного значення кількості
тактів вибирається максимальне з наявних значень.
На графіку по осі ординат відкладається максимальна кількість тактів,
необхідна для перевірки слова відповідної довжини.
28
Початок
1
Завантажити
команди
з файлу?
1
F=true
1
F=true
Завантаження
0
Перевірити слово
на приналежність?
1
Перевірка
1
Побудова
графіку
0
0
1
0
Побудувати?
1
F=true
0
Припинити
роботу?
0
1
Кінець
Рисунок 2.17  Загальний алгоритм роботи програми
Початок
n
Початок generation
i:=0
i<=n
1
j<n
0
Кінець
1
0
generation(s+ a ,j+1,n)
s
generation(s+ b ,j+1,n)
generation( ,0,n)
generation(s+ c ,j+1,n)
Кінець generation
i+=1
Рисунок 2.18  Алгоритм генерування слів довільної довжини
у алфавіті a, b, c
29
Блок-схема алгоритму генерування слів довільної довжини у алфавіті
приведена на рис. 2.18.
Протокол роботи машини Тьюрінга для розпізнавання слова «ааа»,
побудований програмно, приведений на рис. 2.19.
Стрічка 1: Aaa
Стрічка 2:
Стрічка 3:
Застосовано правило:
Стрічка 1: aAa
Стрічка 2: A
Стрічка 3: a
Застосовано правило:
Стрічка 1: aAa
Стрічка 2: A
Стрічка 3: A
Застосовано правило:
Стрічка 1: aAa
Стрічка 2: A
Стрічка 3: a
Застосовано правило:
Стрічка 1: aAa
Стрічка 2: A
Стрічка 3: A
Застосовано правило:
Стрічка 1: aaA
Стрічка 2: A
Стрічка 3: a
Застосовано правило:
Стрічка 1: aaA
Стрічка 2: A
Стрічка 3: A
Застосовано правило:
Стрічка 1: aaA
Стрічка 2: A
Стрічка 3: a
Застосовано правило:
Стрічка 1: aaA
Стрічка 2: A
Стрічка 3: A
Застосовано правило:
Стрічка 1: aaa
Стрічка 2: A
Стрічка 3: a
Застосовано правило:
Стрічка 1: aaa
Стрічка 2: A
Стрічка 3: a
Застосовано правило:
Стрічка 1: aaa1
Стрічка 2: A
Стрічка 3: a
q00 a * * -> q01 * a a R S R
q01 a a * -> q02 * * * S S L
q02 * * * -> q02 * * * S S L
q02 * * -> q10 * * * S S R
q10 a * a -> q10 * * * R S R
q10 a a -> q20 * * * S S L
q20 * * * -> q20 * * * S S L
q20 * * -> q21 * * * S S R
q21 a * a -> q21 * * * R S R
q21 * -> qz1 * * * S S S
qz1 * * * -> qz 1 * * S S S
Рисунок 2.19  Програмний протокол роботи машини Тьюрінга для слова «ааа»
30
Протокол
роботи
машини
Тьюрінга
для
слова
«abcbabcbabcb»,
побудований програмно, приведений на рис. 2.20.
Стрічка 1: Abcbabcbabcb
Стрічка 2:
Стрічка 3:
Застосовано правило: q00 a * * -> q01 * a a R S R
Стрічка 1: aBcbabcbabcb
Стрічка 2: A
Стрічка 3: a
Застосовано правило: q01 b * * -> q01 * * b R S R
Стрічка 1: abCbabcbabcb
Стрічка 2: A
Стрічка 3: ab
Застосовано правило: q01 c * * -> q01 * * c R S R
Стрічка 1: abcBabcbabcb
Стрічка 2: A
Стрічка 3: abc
Застосовано правило: q01 b * * -> q01 * * b R S R
Стрічка 1: abcbAbcbabcb
Стрічка 2: A
Стрічка 3: abcb
Застосовано правило: q01 a a * -> q02 * * * S S L
Стрічка 1: abcbAbcbabcb
Стрічка 2: A
Стрічка 3: abcB
Застосовано правило: q02 * * * -> q02 * * * S S L
Стрічка 1: abcbAbcbabcb
Стрічка 2: A
Стрічка 3: abCb
Застосовано правило: q02 * * * -> q02 * * * S S L
Стрічка 1: abcbAbcbabcb
Стрічка 2: A
Стрічка 3: aBcb
Застосовано правило: q02 * * * -> q02 * * * S S L
Стрічка 1: abcbAbcbabcb
Стрічка 2: A
Стрічка 3: Abcb
Застосовано правило: q02 * * * -> q02 * * * S S L
Стрічка 1: abcbAbcbabcb
Стрічка 2: A
Стрічка 3: abcb
Застосовано правило: q02 * * -> q10 * * * S S R
Стрічка 1: abcbAbcbabcb
Стрічка 2: A
Стрічка 3: Abcb
Застосовано правило: q10 a * a -> q10 * * * R S R
Стрічка 1: abcbaBcbabcb
Стрічка 2: A
Стрічка 3: aBcb
Застосовано правило: q10 b * b -> q10 * * * R S R
Стрічка 1: abcbabCbabcb
Стрічка 2: A
Стрічка 3: abCb
Рисунок 2.20  Протокол роботи машини Тьюрінга для слова «abcbabcbabcb»,
побудований програмно
31
Застосовано правило: q10 c * c -> q10 * * * R S R
Стрічка 1: abcbabcBabcb
Стрічка 2: A
Стрічка 3: abcB
Застосовано правило: q10 b * b -> q10 * * * R S R
Стрічка 1: abcbabcbAbcb
Стрічка 2: A
Стрічка 3: abcb
Застосовано правило: q10 a a -> q20 * * * S S L
Стрічка 1: abcbabcbAbcb
Стрічка 2: A
Стрічка 3: abcB
Застосовано правило: q20 * * * -> q20 * * * S S L
Стрічка 1: abcbabcbAbcb
Стрічка 2: A
Стрічка 3: abCb
Застосовано правило: q20 * * * -> q20 * * * S S L
Стрічка 1: abcbabcbAbcb
Стрічка 2: A
Стрічка 3: aBcb
Застосовано правило: q20 * * * -> q20 * * * S S L
Стрічка 1: abcbabcbAbcb
Стрічка 2: A
Стрічка 3: Abcb
Застосовано правило: q20 * * * -> q20 * * * S S L
Стрічка 1: abcbabcbAbcb
Стрічка 2: A
Стрічка 3: abcb
Застосовано правило: q20 * * -> q21 * * * S S R
Стрічка 1: abcbabcbAbcb
Стрічка 2: A
Стрічка 3: Abcb
Застосовано правило: q21 a * a -> q21 * * * R S R
Стрічка 1: abcbabcbaBcb
Стрічка 2: A
Стрічка 3: aBcb
Застосовано правило: q21 b * b -> q21 * * * R S R
Стрічка 1: abcbabcbabCb
Стрічка 2: A
Стрічка 3: abCb
Застосовано правило: q21 c * c -> q21 * * * R S R
Стрічка 1: abcbabcbabcB
Стрічка 2: A
Стрічка 3: abcB
Застосовано правило: q21 b * b -> q21 * * * R S R
Стрічка 1: abcbabcbabcb
Стрічка 2: A
Стрічка 3: abcb
Застосовано правило: q21 * -> qz1 * * * S S S
Стрічка 1: abcbabcbabcb
Стрічка 2: A
Стрічка 3: abcb
Застосовано правило: qz1 * * * -> qz 1 * * S S S
Стрічка 1: abcbabcbabcb1
Стрічка 2: A
Стрічка 3: abcb
Рисунок 2.20, частина 2
32
Протокол роботи машини Тьюрінга для слова «abc», побудований
програмно, приведений на рис. 2.21.
Стрічка 1: Abc
Стрічка 2:
Стрічка 3:
Застосовано правило:
Стрічка 1: aBc
Стрічка 2: A
Стрічка 3: a
Застосовано правило:
Стрічка 1: abC
Стрічка 2: A
Стрічка 3: ab
Застосовано правило:
Стрічка 1: abc
Стрічка 2: A
Стрічка 3: abc
Застосовано правило:
Стрічка 1: abc
Стрічка 2: A
Стрічка 3: abc
Застосовано правило:
Стрічка 1: abc0
Стрічка 2: A
Стрічка 3: abc
q00 a * * -> q01 * a a R S R
q01 b * * -> q01 * * b R S R
q01 c * * -> q01 * * c R S R
q01 * * -> qz0 * * * S S S
qz0 * * * -> qz 0 * * S S S
Рисунок 2.21  Протокол роботи машини Тьюрінга для слова «abc»,
побудований програмно
Протокол роботи машини Тьюрінга для слова «cbaacbaa», побудований
програмно, приведений на рис. 2.22.
Стрічка 1: Cbaacbaa
Стрічка 2:
Стрічка 3:
Застосовано правило: q00 c * * -> q01 * c c R S R
Стрічка 1: cBaacbaa
Стрічка 2: C
Стрічка 3: c
Застосовано правило: q01 b * * -> q01 * * b R S R
Стрічка 1: cbAacbaa
Стрічка 2: C
Стрічка 3: cb
Застосовано правило: q01 a * * -> q01 * * a R S R
Стрічка 1: cbaAcbaa
Стрічка 2: C
Стрічка 3: cba
Рисунок 2.22  Протокол роботи машини Тьюрінга для слова «cbaacbaa»,
побудований програмно
33
Застосовано правило:
Стрічка 1: cbaaCbaa
Стрічка 2: C
Стрічка 3: cbaa
Застосовано правило:
Стрічка 1: cbaaCbaa
Стрічка 2: C
Стрічка 3: cbaA
Застосовано правило:
Стрічка 1: cbaaCbaa
Стрічка 2: C
Стрічка 3: cbAa
Застосовано правило:
Стрічка 1: cbaaCbaa
Стрічка 2: C
Стрічка 3: cBaa
Застосовано правило:
Стрічка 1: cbaaCbaa
Стрічка 2: C
Стрічка 3: Cbaa
Застосовано правило:
Стрічка 1: cbaaCbaa
Стрічка 2: C
Стрічка 3: cbaa
Застосовано правило:
Стрічка 1: cbaaCbaa
Стрічка 2: C
Стрічка 3: Cbaa
Застосовано правило:
Стрічка 1: cbaacBaa
Стрічка 2: C
Стрічка 3: cBaa
Застосовано правило:
Стрічка 1: cbaacbAa
Стрічка 2: C
Стрічка 3: cbAa
Застосовано правило:
Стрічка 1: cbaacbaA
Стрічка 2: C
Стрічка 3: cbaA
Застосовано правило:
Стрічка 1: cbaacbaa
Стрічка 2: C
Стрічка 3: cbaa
Застосовано правило:
Стрічка 1: cbaacbaa
Стрічка 2: C
Стрічка 3: cbaa
Застосовано правило:
Стрічка 1: cbaacbaa0
Стрічка 2: C
Стрічка 3: cbaa
q01 a * * -> q01 * * a R S R
q01 c c * -> q02 * * * S S L
q02 * * * -> q02 * * * S S L
q02 * * * -> q02 * * * S S L
q02 * * * -> q02 * * * S S L
q02 * * * -> q02 * * * S S L
q02 * * -> q10 * * * S S R
q10 c * c -> q10 * * * R S R
q10 b * b -> q10 * * * R S R
q10 a * a -> q10 * * * R S R
q10 a * a -> q10 * * * R S R
q10 * * -> qz0 * * * S S S
qz0 * * * -> qz 0 * * S S S
Рисунок 2.22, частина 2
Робота програми вірна, про що свідчать отримані результати роботи у
вигляді протоколів.
34
3 РОЗРОБКА АНАЛІТИЧНОЇ МОДЕЛІ АЛГОРИТМУ У ВИГЛЯДІ
НОРМАЛЬНОГО АЛГОРИТМУ МАРКОВА
Нормальні алгоритми розроблялися в кінці 1940-х років XX століття
радянським математиком А. А. Марковим. Алгоритми Маркова являють собою
набір правил з переробки слів деякого алфавіту.
Нехай дано алфавіт  і слова в цьому алфавіті. Слово  є входженням
слова  , якщо існують такі слова  1 і  2 (можливо, порожні), що    1 2 .
Наприклад, в алфавіті   {a, b} слова bbaa і abba є входженнями у слово
abbaaab. Надалі під входженнями слова в дане слово будемо розуміти тільки
перші входження. Порожнє слово є першим входженням будь-якого слова.
Марківською підстановкою (або просто підстановкою) називається вираз
виду    , яке здійснює заміну слова 
на слово  . Підстановки
застосовуються для перетворення слів алфавіту  .
Нехай дано слово  . Підстановка    , застосована до слова  ,
означає заміну першого входження слова  в  на слово  . Отримане слово
називають результатом підстановки    до слова  . Якщо не існує
входження слова  в  , то підстановка вважається непридатною. [5]
3.1 Постановка завдання розробки аналітичної моделі алгоритму у
вигляді нормального алгоритму Маркова
Завдання: скласти нормальний алгоритм Маркова над алфавітом А –
алгоритм, що обчислює арифметичне вирахування в унарному коді. Перевірити
модель алгоритму на множині тестових прикладів.
3.2 Реалізація алгоритму у вигляді нормального алгоритму Маркова
Був розроблений алгоритм, сутність якого в тому, що видаляється символ

та наступний унарний символ замінюється на x (правило 1), а всі | після
нього замінюються на x (правило 3). У випадку, коли справа і зліва немає
35
символів, відбувається видалення

і припинення роботи алгоритму (правило
2). Після цього знаходяться і видаляються пари | x (правило 4). Далі можуть
бути кілька ситуацій: якщо після видалення всіх пар залишилися | , або не
залишилося нічого, то алгоритм закінчив свою роботу, це і є відповідь; якщо ж
залишилися x , то це говорить про те, що число, з якого вираховується менше
того, яке вираховується, а це означає що результат дорівнює 0 видаляємо x , які
залишились (правило 5).
Нормальний алгоритм Маркова, що обчислює арифметичне вирахування
x  y в унарному коді, приведений на рис. 3.1.
1.  | x
2.  
3. x | xx
4. | x 
5. x 
Рисунок 3.1  Нормальний алгоритм Маркова, що обчислює арифметичне
вирахування в унарному коді
3.3 Тестування розробленої аналітичної моделі алгоритму у вигляді
нормального алгоритму Маркова
Тестування нормального алгоритму Маркова, що обчислює арифметичне
вирахування x  y в унарному коді, передбачало виконання ряду тестів.
Тест 1 передбачав розгляд випадку, коли є «  ». Результат приведений на
рис. 3.2.
Рисунок 3.2  Функціонування нормального алгоритму Маркова, тест 1
36
Тест 2 передбачав розгляд випадку, коли є « |||  ||| ». Результат приведений
на рис. 3.3.
Рисунок 3.3  Функціонування нормального алгоритму Маркова, тест 2
Тест 3 передбачав розгляд випадку, коли є « |||  || ». Результат приведений
на рис. 3.4.
Рисунок 3.4  Функціонування нормального алгоритму Маркова, тест 3
Тест 4 передбачав розгляд випадку, коли є « ||  ||| ». Результат приведений
на рис. 3.5.
Рисунок 3.5  Функціонування нормального алгоритму Маркова, тест 4
Тест 5 передбачав розгляд випадку, коли є « |||  ». Результат приведений
на рис. 3.7.
Рисунок 3.7  Функціонування нормального алгоритму Маркова, тест 5
Отримані після тестування результати свідчать про вірну роботу
розробленої аналітичної моделі алгоритму у вигляді нормального алгоритму
Маркова для обчислення арифметичного вирахування в унарному коді.
37
ВИСНОВКИ
Конкретні алгоритми в математиці та практиці відомі давно. В даний час,
особливо у зв'язку з глобальною комп'ютеризацією, вони міцно увійшли в
життя. Розвиток математики та математичної логіки, а також чималою мірою
стрімкий прогрес комп'ютерної техніки, змусили розвинутися загальну науку
про алгоритми  теорію алгоритмів. [6]
Опрацювавши матеріал за курсом «Дискретні структури і алгоритми» був
написаний курсовий проект і виконані всі його поставлені завдання, а саме –
були розроблені алгоритми за такими темами: «Рекурсивні функції», «Класична
машина Тьюрінга», «Композиція машин Тьюрінга», «Машина Тьюрінга, що
розпізнає формальну мову», «Нормальний алгоритм Маркова». Тобто в ході
виконання поставлених завдань були отримані нові знання про рекурсивні
функції, машини Тьюрінга, нормальні алгоритми Маркова і закріплені вже
наявні навички при роботі з ними.
При виконанні завдань був отриманий досвід програмування алгоритму
багатострічкової машини Тьюрінга для розпізнавання формальної мови. Був
створений програмний продукт, який розпізнає введене слово на приналежність
зазначеній мові.
По закінченню роботи над курсовим проектом були отримані навички
складання та розробки формальних, аналітичних та програмних моделей
алгоритмів.
38
ПЕРЕЛІК ПОСИЛАНЬ
1. Кацаран Т. К. Машины Тьюринга и рекурсивные функции /
Т. К. Кацаран, Л. Н. Строева.  Воронеж : Издательско-полиграфический центр
Воронежского государственного университета, 2008.  34 с.
2. Гросс М. Теория формальных грамматик / М. Гросс, А. Лантен.  М. :
МИР, 1971.  287 с.
3. Мозговой М. В. Классика программирования: алгоритмы, языки,
автоматы, компиляторы. Практический подход / М. В. Мозговой.  СПб. :
Наука и Техника, 2006.  320 с.
4. Александров А. Д. Математика. Ее содержание, методы и значение /
А. Д. Александров, А. Н. Колмогоров, М. А. Лаврентьев.  М. : Издательство
Академии Наук СССР, 1956.
5. Лобарёв Д. С. Теория алгоритмов : учебно-методическое пособие /
Д. С. Лобарёв.  Псков : Псковский государственный университет, 2016.  72 с.
6. Игошин В. И. Теория алгоритмов: Учеб. пособие / В. И. Игошин.  М. :
ИНФРА-М, 2016.  318 с.
7. Мальцев А. Алгоритмы и рекурсивные функцию. –2-е изд. – М. :
Наука. Гл. ред. физ.-мат. лит., 1986. – 368 с.
8. Игошин В. Математическая логика и теория алгоритмов.  М. : Бином,
Невский Диалект, 2008. – 520 с.
9. Рекурсивные функции [Электронный ресурс]. – Режим доступа:
http://bse.sci-lib.com/article096369.html.
39
ДОДАТОК А
ТЕХНІЧНЕ ЗАВДАННЯ
40
1. Темою курсового проекту із дисципліни «Дискретні структури і
алгоритми» для студентів, що навчаються за спеціальністю 121 «Інженерія
програмного забезпечення», є: «Розробка аналітичних моделей алгоритмів та
оцінка їх тимчасової складності».
Завдання на курсовий проект складається з трьох часток, відповідно до
головних тем курсу «Дискретні структури і алгоритми»: рекурсивні функції
(РФ), машини Тьюрінга (МТ), нормальні алгоритми Маркова (НАМ).
2. Підставою для розробки є завдання на курсовий проект, видане
кафедрою прикладної математики та інформатики.
3. Метою розробки є опанування методів розробки та тестування
формальних моделей алгоритмів у вигляді РФ, класичної МТ (КМТ),
композиції МТ, багатострічкової МТ (БМТ) та НАМ.
4. Постановка завдання на курсовий проект
4.1 Розробка аналітичної моделі алгоритму у вигляді рекурсивної функції
Розробити алгоритм обчислення
спільного кратного двох чисел,
f (n):
K  x, y  ,
знаходження найменшого
K  x,0  K 0, y   0
у вигляді
рекурсивної функції. Перевірити модель алгоритму на множині тестових
прикладів. Визначити до якого класу рекурсивних функцій належить f ( n ) :
примітивно-рекурсивна, частково-рекурсивна або загально-рекурсивна.
4.2 Розробка аналітичної моделі алгоритму у вигляді машини Тьюрінга
4.2.1 Класична машина Тьюрінга (КМТ)
Описати системою команд, функціональною таблицею та діаграмою
переходів роботу класичної машини Тьюрінга, що реалізує обчислення
предикату
x y
в унарному коді. Початкова і заключна конфігурації
стандартні. Перевірити модель алгоритму на множині тестових прикладів.
Привести послідовності конфігурацій машини Тьюрінга для різних тестових
вхідних слів.
4.2.2 Композиція машин Тьюрінга
Побудувати машину Тьюрінга, яка обчислює функцію із завдання 4.1
«Рекурсивні функції». Машину Тьюрінга представити, як композицію
41
елементарних МТ, що виконують операції, до яких належать: копіювання
аргументу, установка довільної константи, додавання, множення, арифметичне
віднімання, знаходження цілої частини та залишку від ділення, відношення над
аргументами (рівність, більше, менше, більше та рівність, нерівність тощо),
арифметизовані логічні функції (логічне «і», логічне «або» тощо), виділення
аргументу. Відсутні у переліку елементарні МТ, необхідні для реалізації
заданого алгоритму, описати будь-яким відомим способом.
4.2.3 Машина Тьюрінга, що розпізнає формальну мову
Розробити машину Тьюрінга (багатострічкову або КМТ), що розпізнає
задану
варіантом
реалізувати
формальну
емулятор
МТ
мову
і
L  www | w  a, b, c*.
побудувати
графіки
Програмно
аналітичної
та
експериментальної функції тимчасової складності t(n) МТ (для розміру задачі
n, що вимагає не більш 5 хвилин розрахунку).
Вимоги до програми:
– при перевірці слова на належність формальній мові необхідно
заборонити введення з клавіатури символів, що не належать алфавіту заданої
мови;
– при перевірці слова на належність мові виводити на екран кожен крок
роботи машини Тьюрінга;
– зберігати протокол роботи машини Тьюрінга в текстовому файлі;
– при побудові графіка експериментальної функції тимчасової складності
машини Тьюрінга значення для графіка отримати практично, за допомогою
створеної програмної моделі машини Тьюрінга; для генерації слів довжиною n
використовувати метод повного перебору.
4.3 Розробка аналітичної моделі алгоритму у вигляді нормального
алгоритму Маркова
Розробити нормальний алгоритм Маркова над алфавітом А за варіантом:
реалізувати нормальний алгоритм, що обчислює арифметичне вирахування в
унарному коді. Перевірити модель алгоритму на множині тестових прикладів.
42
Зауваження: для всіх аналітичних моделей системи тестів повинні бути
повними.
5. Етапи розробки
Термін
№
Найменування етапу
етапу
виконання
(порядковий
номер тижня)
1
Видача завдання, складання ТЗ та його затвердження
1-2
2
Побудова формальних моделей алгоритмів у вигляді
3-5
РФ, КМТ та композиції МТ
3
Побудова формальних моделей алгоритмів у вигляді
5-6
НАМ та РФ
4
Побудова формальної моделі алгоритму у вигляді
7-9
ММТ. Визначення структур даних для представлення
ММТ, побудова алгоритмів
5
Написання та налагодження програмного додатку
9-12
для ММТ
6
Написання пояснювальної записки
9-13
7
Захист курсового проекту
13-14
43
Додаток Б
Керівництво користувача
Для початку роботи необхідно запустити виконуваний файл, що має
назву «turingMachine.exe». Після цього з'явиться робоче вікно програми,
інтерфейс якого приведений на рис. Б.1.
Рисунок Б.1  Інтерфейс вікна програми
В першу чергу необхідно завантажити команди для машини Тьюринга
(набір правил), для цього необхідно натиснути на копку «Завантажити команди
з файлу» та в діалоговому вікні (рис. Б.2) обрати необхідний файл. Після цього
в лівій частині вікна програми відобразяться завантажені правила (рис. Б.3).
44
Рисунок Б.2  Діалогове вікно вибору файлу з набором правил МТ
Рисунок Б.3  Вікно програми з завантаженими правилами МТ
45
Для того, щоб почати перевірку слова, необхідно ввести його в поле,
вибрати за допомогою перемикачів швидкість анімації і натиснути кнопку
«Перевірити слово на приналежність» (рис. Б.4).
Рисунок Б.4  Вікно програми після виконання процедури розпізнавання
Для того, щоб побудувати графік тимчасової складності, необхідно
перейти на другу вкладку вікна (рис. Б.5).
Після здійснення зазначеного переходу необхідно вибрати за допомогою
лічильника
максимальну
«Побудувати» (рис. Б.6).
довжину
слів,
а
потім
натиснути
кнопку
46
Рисунок Б.5  Друга вкладка вікна програми
Рисунок Б.6  Вікно програми після спрацьовування алгоритму побудови
графіку тимчасової складності
47
Додаток В
Екранні форми
Програма має вікно, яке складається з двох вкладок. Інтерфейси
зазначених вкладок приведені на рис. В.1-В.2.
Рисунок В.1  Перша вкладка вікна програми
Рисунок В.2  Друга вкладка вікна програми
48
Додаток Г
Лістинг основної частини програми
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
msclr::interop::marshal_context context;
string addressFileTemp;
if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {
addressFileTemp = context.marshal_as<std::string>(openFileDialog1->FileName);
fstream Grammar(addressFileTemp, ios_base::in);
if (!Grammar) {
MessageBox::Show("Файл не может быть открыт!");
return;
}
char tempLineFile[255] = { "" };
dataGridView1->ColumnCount = 0;
dataGridView2->ColumnCount = 0;
dataGridView3->ColumnCount = 0;
dataGridView4->ColumnCount = 0;
dataGridView1->RowCount = 0;
textBox2->Text = "";
textBox1->Text = "";
dataGridView1->ColumnCount = 13;
while (!Grammar.eof()) {
dataGridView1->RowCount++;
Grammar.getline(tempLineFile, 255);
String^ temp = "";
for (int k = 0, i = 1; i < 13; k++) {
if (tempLineFile[k] == '\t') {
dataGridView1->Rows[dataGridView1->RowCount - 1]->Cells[i++]->Value = temp;
temp = "";
}
else if (tempLineFile[k] != ' ') {
temp += System::Convert::ToString(Convert::ToChar(tempLineFile[k]));
}
if (tempLineFile[k + 1] == 0) {
dataGridView1->Rows[dataGridView1->RowCount - 1]->Cells[i++]->Value = temp;
temp = "";
}
}
dataGridView1->Rows[dataGridView1->RowCount - 1]->Cells[0]->Value =
System::Convert::ToString(dataGridView1->RowCount - 1);
}
Grammar.close();
}
toolStripStatusLabel1->Text = "Правила загружены";
}
private: void algorithm(String^ word, bool d) {
ofstream fout;
dataGridView2->ColumnCount = 0;
dataGridView3->ColumnCount = 0;
49
dataGridView4->ColumnCount = 0;
textBox2->Text = "";
Q = System::Convert::ToString(dataGridView1->Rows[0]->Cells[1]->Value);
int size = word->Length * 3;
if (size < 60)
size = 60;
dataGridView2->ColumnCount = size;
dataGridView3->ColumnCount = size;
dataGridView4->ColumnCount = size;
i1 = dataGridView2->ColumnCount / 3;
i2 = dataGridView3->ColumnCount / 3;
i3 = dataGridView4->ColumnCount / 3;
s = 0;
for (s = 0; s < word->Length; s++) {
dataGridView2->Rows[0]->Cells[i1 + s]->Value = System::Convert::ToString(word[s]);
}
if (d) {
fout.open("Протокол.txt");
fout << "Лента 1: ";
for (int s = dataGridView2->ColumnCount / 3; Convert::ToString(dataGridView2->Rows[0]>Cells[s]->Value) != Convert::ToString(""); s++) {
string ch = msclr::interop::marshal_as<std::string>(Convert::ToString(dataGridView2>Rows[0]->Cells[s]->Value));
char c = ch[0];
if (i1 == s)
fout << strupr(&c);
else
fout << msclr::interop::marshal_as<std::string>(Convert::ToString(dataGridView2>Rows[0]->Cells[s]->Value));
}
fout << "\r\n";
fout << "Лента 2: ";
for (s = dataGridView2->ColumnCount / 3; Convert::ToString(dataGridView3->Rows[0]>Cells[s]->Value) != Convert::ToString(""); s++) {
fout << msclr::interop::marshal_as<std::string>(Convert::ToString(dataGridView3>Rows[0]->Cells[s]->Value));
}
fout << "\r\n";
fout << "Лента 3: ";
for (s = dataGridView2->ColumnCount / 3; Convert::ToString(dataGridView4->Rows[0]>Cells[s]->Value) != Convert::ToString(""); s++) {
fout << msclr::interop::marshal_as<std::string>(Convert::ToString(dataGridView4>Rows[0]->Cells[s]->Value));
}
fout << "\r\n";
}
if (s >= dataGridView1->RowCount) {
MessageBox::Show("Не найдено подходящее правило");
return;
}
dataGridView1->CurrentCell = dataGridView1->Rows[s]->Cells[0];
dataGridView2->CurrentCell = dataGridView2->Rows[0]->Cells[i1 + 13];
50
dataGridView3->CurrentCell = dataGridView3->Rows[0]->Cells[i2 + 13];
dataGridView4->CurrentCell = dataGridView4->Rows[0]->Cells[i3 + 13];
dataGridView2->CurrentCell = dataGridView2->Rows[0]->Cells[i1 + 13];
dataGridView3->CurrentCell = dataGridView3->Rows[0]->Cells[i2 + 13];
dataGridView4->CurrentCell = dataGridView4->Rows[0]->Cells[i3 + 13];
toolStripStatusLabel1->Text = "Проверяется слово " + textBox1->Text;
while (true)
{
if (Q == "qz")
break;
t++;
if (d) {
dataGridView1->CurrentCell = dataGridView1->Rows[s]->Cells[0];
dataGridView2->CurrentCell = dataGridView2->Rows[0]->Cells[i1];
dataGridView3->CurrentCell = dataGridView3->Rows[0]->Cells[i2];
dataGridView4->CurrentCell = dataGridView4->Rows[0]->Cells[i3];
dataGridView2->CurrentCell = dataGridView2->Rows[0]->Cells[i1];
dataGridView3->CurrentCell = dataGridView3->Rows[0]->Cells[i2];
dataGridView4->CurrentCell = dataGridView4->Rows[0]->Cells[i3];
}
turing();
if (!radioButton2->Checked && d) {
if (radioButton3->Checked)
Sleep(50);
this->Refresh();
}
if (d) {
fout << "Применено правило: ";
for (int t = 1; t < 13; t++) {
fout <<
msclr::interop::marshal_as<std::string>(System::Convert::ToString(dataGridView1->Rows[s]>Cells[t]->Value) + " ");
}
fout << "\r\n";
fout << "Лента 1: ";
for (int s = dataGridView2->ColumnCount / 3; Convert::ToString(dataGridView2>Rows[0]->Cells[s]->Value) != Convert::ToString(""); s++) {
string ch = msclr::interop::marshal_as<std::string>(Convert::ToString(dataGridView2>Rows[0]->Cells[s]->Value));
char c = ch[0];
if (i1 == s)
fout << strupr(&c);
else
fout << msclr::interop::marshal_as<std::string>(Convert::ToString(dataGridView2>Rows[0]->Cells[s]->Value));
}
fout << "\r\n";
fout << "Лента 2: ";
for (s = dataGridView3->ColumnCount / 3; Convert::ToString(dataGridView3->Rows[0]>Cells[s]->Value) != Convert::ToString(""); s++) {
51
string ch = msclr::interop::marshal_as<std::string>(Convert::ToString(dataGridView3>Rows[0]->Cells[s]->Value));
char c = ch[0];
if (i2 == s)
fout << strupr(&c);
else
fout << msclr::interop::marshal_as<std::string>(Convert::ToString(dataGridView3>Rows[0]->Cells[s]->Value));
}
fout << "\r\n";
fout << "Лента 3: ";
for (s = dataGridView4->ColumnCount / 3; Convert::ToString(dataGridView4->Rows[0]>Cells[s]->Value) != Convert::ToString(""); s++) {
string ch = msclr::interop::marshal_as<std::string>(Convert::ToString(dataGridView4>Rows[0]->Cells[s]->Value));
char c = ch[0];
if (i3 == s)
fout << strupr(&c);
else
fout << msclr::interop::marshal_as<std::string>(Convert::ToString(dataGridView4>Rows[0]->Cells[s]->Value));
}
fout << "\r\n";
}
}
toolStripStatusLabel1->Text = "Слово " + textBox1->Text + " проверено";
}
private: void turing() {
for (s = 0; s < dataGridView1->RowCount; s++) {
if (System::Convert::ToString(dataGridView1->Rows[s]->Cells[1]->Value) ==
System::Convert::ToString(Q)
&& (System::Convert::ToString(dataGridView1->Rows[s]->Cells[2]->Value) ==
System::Convert::ToString(dataGridView2->Rows[0]->Cells[i1]->Value) ||
System::Convert::ToString(dataGridView1->Rows[s]->Cells[2]->Value) == "*")
&& (System::Convert::ToString(dataGridView1->Rows[s]->Cells[3]->Value) ==
System::Convert::ToString(dataGridView3->Rows[0]->Cells[i2]->Value) ||
System::Convert::ToString(dataGridView1->Rows[s]->Cells[3]->Value) == "*")
&& (System::Convert::ToString(dataGridView1->Rows[s]->Cells[4]->Value) ==
System::Convert::ToString(dataGridView4->Rows[0]->Cells[i3]->Value) ||
System::Convert::ToString(dataGridView1->Rows[s]->Cells[4]->Value) == "*")
){
if (System::Convert::ToString(dataGridView1->Rows[s]->Cells[7]->Value) != "*")
dataGridView2->Rows[0]->Cells[i1]->Value =
System::Convert::ToString(dataGridView1->Rows[s]->Cells[7]->Value);
if (System::Convert::ToString(dataGridView1->Rows[s]->Cells[8]->Value) != "*")
dataGridView3->Rows[0]->Cells[i2]->Value =
System::Convert::ToString(dataGridView1->Rows[s]->Cells[8]->Value);
if (System::Convert::ToString(dataGridView1->Rows[s]->Cells[9]->Value) != "*")
dataGridView4->Rows[0]->Cells[i3]->Value =
System::Convert::ToString(dataGridView1->Rows[s]->Cells[9]->Value);
if (System::Convert::ToString(dataGridView1->Rows[s]->Cells[10]->Value) == "L")
i1--;
52
else if (System::Convert::ToString(dataGridView1->Rows[s]->Cells[10]->Value) == "R")
i1++;
if (System::Convert::ToString(dataGridView1->Rows[s]->Cells[11]->Value) == "L")
i2--;
else if (System::Convert::ToString(dataGridView1->Rows[s]->Cells[11]->Value) == "R")
i2++;
if (System::Convert::ToString(dataGridView1->Rows[s]->Cells[12]->Value) == "L")
i3--;
else if (System::Convert::ToString(dataGridView1->Rows[s]->Cells[12]->Value) == "R")
i3++;
Q = System::Convert::ToString(dataGridView1->Rows[s]->Cells[6]->Value);
textBox2->Text += "Применено правило: ";
for (int t = 1; t < 13; t++) {
textBox2->Text += System::Convert::ToString(dataGridView1->Rows[s]->Cells[t]>Value) + " ";
}
textBox2->Text += "\r\n";
break;
}
}
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
if (dataGridView1->ColumnCount == 0)
return;
String^ word = System::Convert::ToString(textBox1->Text);
algorithm(word, true);
}
private: System::Void textBox1_KeyPress(System::Object^ sender,
System::Windows::Forms::KeyPressEventArgs^ e) {
if (System::Convert::ToString(e->KeyChar) != "a" && System::Convert::ToString(e>KeyChar) != "b" && System::Convert::ToString(e->KeyChar) != "c" && e->KeyChar != (char)8)
{
e->KeyChar = NULL;
}
}
private: void generation(String^ word, int i, int n) {
if (i < n) {
generation(word + "a", i + 1, n);
generation(word + "b", i + 1, n);
generation(word + "c", i + 1, n);
}
else {
t = 0; // начальное время
textBox1->Text = word;
this->Refresh();
algorithm(word, false);
if (maxT < t)
maxT = t;
return;
}
}
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
53
chart1->Series[0]->Points->Clear();
chart1->Visible = false;
if (dataGridView1->ColumnCount == 0)
return;
for (int i = 0; i <= numericUpDown1->Value; i++) {
maxT = 0;
generation("", 0, i);
chart1->Visible = true;
chart1->Series[0]->Points->AddXY(i, maxT);
}
dataGridView2->ColumnCount = 0;
dataGridView3->ColumnCount = 0;
dataGridView4->ColumnCount = 0;
textBox2->Text = "";
textBox1->Text = "";
toolStripStatusLabel1->Text = "Готово";
}
private: System::Void toolStripStatusLabel1_Click(System::Object^ sender, System::EventArgs^
e) {
}
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
toolStripStatusLabel1->Text = "Программа готова к работе";
}
private: System::Void MyForm_SizeChanged(System::Object^ sender, System::EventArgs^ e) {
panel11->Height = panel16->Height / 2;
panel12->Height = panel16->Height / 2;
}
};
}
Download