- •2.3. Арифметичні операції в різних системах числення.
- •3.8. Розв'язати системи рівнянь з регулярними коефіцієнтами.
- •Має два виводи
- •1.4. Скінченний автомат а заданий графом:
- •4.2. Приклад. Побудувати дса, еквівалентний до нса
- •Лекція 5. Скінченні автомати і регулярні мови. Лема про роздування.
- •6.3. Приклад. Побудувати мп-автомат, який розпізнає мову
- •(Д, аЬЬа, е) ь (д, ьЬа, а) ь (д, Ьа, Ьа) ь (р, Ьа, Ьа) ь (р, а, а) ь (р, е, е); (д, аЬЬа, е) ь (д, ьЬа, а) ь (д, Ьа, Ьа) ь (д, а, ьЬа) ь (р, а, ьЬа);
- •Зліва записуються всі стани, крім кінцевого ду, з множини станів
- •Проаналізуйте роботу мт на наступних вхідних словах:
- •3.7. Приклад. Побудуємо машину Тюрінґа, яка переводить натуральні числа з унарної системи числення в десяткову.
- •Лекція 4. Частково рекурсивні та примітивно рекурсивні функції
- •Приклад. Застосувати кожну з підстановок з попереднього прикладу до слова аЬЬасЬа максимальну можливу кількісить разів.
- •5.3. Приклад. Застосувати кожен з нам
- •8.7. Оцінити часову та ємнісну складність мт, заданої графом:
8.7. Оцінити часову та ємнісну складність мт, заданої графом:
Оцінити
його часову та ємнісну складність.
називають граматикою типу 1, або контекстно залежною, оскільки
і можна замінити на V лише в оточенні слів 7... 5, тобто у відповід
ному контексті. Мову, яку породжує граматика типу 1, називають контекстно залежною. Граматику типу 3 називають праволінійною. Двоїсто визначають ліволінійну граматику - вона може мати такі продукції: А ^ шВ, А ^ ш і А ^ е, де А, В - нетермінали, ш - слово
з терміналів. Ліволінійні і праволінійні граматики називаються регулярними. Регулярні граматики породжують регулярні мови і тільки їх.
Приклад. Побудуємо контекстно вільну граматику, яка породжує мову Ь = {0П 12п | п > 0}.
Ця мова нагадує мову, породжену граматикою з прикладу 4.2 в тому сенсі, що якщо ми замінимо кожну 1 на 11, то одержимо граматику для Отже, шукана граматика має вигляд
С = ({^}, {0,1}, 5, {5 ^ е | 05 11}).
Починаючи з стартової позиції, ми можемо побудувати цю граматику двома способами. Спершу відмітимо, що продукція 5 ^ 0511 завжди породжує узгоджену пару 0 та 11. Застосувавши це правило п раз, ми одержуємо слово 0П5(11)п. Ці прості типи правил часто вживаються при побудові контекстно вільних граматик.
Іншим методом побудови граматики є відшукання рекурсивної функції, яка пов'язує довші слова мови Ь з коротшими словами. Наприклад, слово 0п+і 12(п+і) можна записати як 0(0П 12п)11. Таким чином, якщо існує виведення 5 0П 12п, то нам потрібна продукція
5 ^ 0511, щоб одержати виведення 5 0п+і 12(п+і). Ми продемонструємо цю ідею в наступному прикладі.
Приклад. Побудуємо контекстно вільну граматику, що породжує мову Ь = {х Є {0,1}* | х = хп}.
Оскільки к-та зліва буква кожного слова має дорівнювати к-тій справа букві, то слово х Є Ь довжини 2п + 2 може бути записане або як 0у0 або 1у 1 для деякого слова у Є Ь довжини 2п. Отже, нам потрібні правила 5 ^ 050 і 5 ^ 151, щоб породити слово х рекурсивно. З сказаного вище випливає, що мова Ь породжується граматикою С = ({5}, {0,1},5, Р), де множина Р містить наступні продукції:
5 ^ е | 0 | 1 | 050 | 151.
З чотирьох класів граматик ієрархії Хомські клас контекстно вільних граматик є найбільш важливим з точки зору застосувань до мов програмування і компіляції. З допомогою контекстно вільної граматики можна визначити більшу частину синтаксичної структури мов програмування. Крім того, вона є основою різних схем задання перекладів на машинну мову комп'ютера.
В процесі компіляції синтаксичну структуру, яка передається вхідній програмі контекстно вільною граматикою, можна використовувати при побудові перекладу цієї програми. Синтаксичну структуру вхідного слова можна визначити по послідовності правил, які застосовуються при виведенні даного слова. Таким чином, на частину компілятора, яка називається синтаксичним аналізатором, можна дивитися як на прилад, який намагається вияснити, чи існує в деякій фіксованій контекстно вільній граматиці виведення для даного слова.
Однак це нетривіальна задача - по даній контекстно вільній граматиці О і вхідному слові ш вияснити, чи належить ш формальній мові Ь(О), і якщо так, то знайти виведення слова ш в граматиці О.
Слово ш належить мові Ь(О) контекстно вільної граматики О тоді і лише тоді, коли існує виведення 8 ш в О. Таке виведення показує як крок за крококом застосовуються продукції граматики, щоб одержати слово ш з початкового нетермінального символу 8. Це виведення можна також продемонструвати наочно з допомогою дерева, яке називатемемо деревом виведення. Наприклад, розглянемо контекстно вільну граматику О = ({8}, {а, Ь, с}, 8, Р), де Р = {8 ^
8Ь8 | 8с8 | а} і слово аЬаса Є Ь(О). Виведення
8 8Ь8 =>• 8Ь8с8 =ґ- аЬ8с8 =>• аЬ8са =>• аЬаса
показано на рисунку (а), а виведення
8 ^ 8с8 ^ 8Ь8с8 ^ аЬ8с8 ^ аЬ8са ^ аЬаса
зображено деревом на рисунку (б).
до для аналізу підслова хзх4. Таким чином, покладаємо 5(#і, 1) = до. Граф шуканого ДСА має вигляд:
і
якщо 5(#, Хк) = (р, а,£), то після одного такту конфігурація (д, Хіх2 ... Хк-іХк ... хт) МТ змінюється на конфігурацію (р,хіХ2 .. .Хк-1 а.. .Хт);
якщо 5(д,Х1) = (р,а,£), то після одного такту конфігурація (д, х1 х2 ... хт) МТ змінюється на (р, #ах2 ... хт);
д отожнюється з числом з множини М0). Визначимо функцію / : М+1 ^ М0 за правилом
/ (п1, ...,пк, 0) = д(п1,.. .,пк), /(п1,... ,пк,т + 1) = Н(п1,... ,пк,т, /(п1,... ,пк,т)),т > 0. В цьому випадку, кажемо, що функція / отримана з функцій д
і Н з допомогою операції примітивної рекурсії.
Клас примітивно рекурсивних функцій визначається наступним чином:
найпростіші функції О, З і РіЩ є примітивно рекурсивними функціями;
якщо д : ^ N0 і Н : М ^ М0, де і = 1, 2,... ,т є примітивно рекурсивними функціями, то д о (Н1,..., Нт) також є примітивно рекурсивною функцією;
якщо д : М ^ N0 і Н : М+2 ^ N0 є примітивно рекурсивними функціями, то функція /, одержана з д і Н за допомогою операції примітивної рукурсії є також примітивно рекурсивною;
інших примітивно рекурсивних функцій не існує.
Іншими словами, функцію називають примітивно рекурсивною, якщо її можна одержати з найпростіших функцій за допомогою скінченної кількості застосувань операцій композиції та примітивної ре- курсії.
Приклад. Довести, що функція Ок(п1 ,п2,... ,пк) = 0 є примітивно рекурсивною.
Дану функцію можна зобразити у вигляді композиції двох найпростіших примітивно рекурсивних функцій. Дійсно,
Ок (п1 ,п2, ...,пк) = О(Рк (щ ,п2,.. .,пк)).
Таким чином, функція Ок = О о Рк є примітивно рекурсивною.
Приклад. Довести, що функції Зк(п1,... ,пі,... ,пк) = пі + 1, де і = 1,..., к, є примітивно рекурсивними.
Функції Зк можна визначити як
ЗІ (п1 ,п2,.. .,пк) = З (Рк (п1, ...,пі ,.. .,пк)).
Отже, функція Зк = З о Рк є примітивно рекурсивною, оскільки вона одержана з примітивно рекурсивних функцій з допомогою операції композиції.
лівій частині яких вказуються потрібні слова і ці мітки. Для зупинки алгоритму на інших словах можна використати, наприклад, формулу
** Ьп * Ьп-1 .. . * Ь2 * Ьі — #Ьп * Ьп-1 . .. * Ь2 * Ьі — Ьп # * Ьп-1 .. . * Ь2 * Ьі —
Ьп#Ьп-1 ... * Ь2 * Ь1 * . . . * ЬпЬп- і... Ьі# — ЬпЬп-і.. .Ьі
Оцінимо часову та ємнісну складність цього алгоритму. Оскільки кількість підстановок, які виконуються при обчисленні вихідного слова Р' з вхідного слова Р, залежить тільки від довжини слова, то функція часової складності ім (п) = ім (х) для будь-якого слова х довжини п. Знайдемо кількість підстановок при аналізі слова Р = ЬіЬ2 .. .Ьп довжини п. На першому етапі алгоритм дописує зліва до слова * і переносить її разом з першою буквою в кінець слова, використовуючи при цьому п підстановок. Потім, аналогічно, алгоритм дописує зліва до одержаного слова * і переносить її з другою буквою до попередньої *, використовуючи при цьому п - 1 підстановок і т.д., поки не отримаємо слово вигляду *Ьп * Ьп-1... * Ь2 * Ьі. При
цьому
кількість підстановок дорівнює
п + (п
— 1) +
... + 1 = п(п2+і).
Далі, зліва до слова дописується ще
одна
* і
** міняється на після чого
решітка пересувається в кінець слова,
знищуючи при цьому всі зірочки.
Насамкінець, виконується підстановка
#
— і алгоритм Маркова зупиняє
свою роботу. Таким чином, на другому
етапі виконується 2 + 2п
підстановок. Отже,
, ч п(п +1) л п2 + 5п + 4 2,
ім(п)
= У
2
;
+ 2 + 2п
= 2 =
°(п2).
З виведення видно, що * * Ьп * Ьп-і... * Ь2 * Ьі - слово максимальної довжини, тому 8М (п) = 2п + 1 = О(п).
Таким чином, задача розв'язується за поліноміальний час і належить класу Р.
8.3. Приклад. Знайти довжину (кількість цифр) натурального числа, записаного в т-ковій системі числення, тобто знайти функцію, яка кожному числу п = актк + ак-ітк-і + ... аіт + а0, де ак = 0 і
< аі < т, ставить у відповідність число \акак—і777~ао| = к + 1.
Оскільки, маємо, що тк < актк + ак-ітк-і + ... + аіт + а0 < (т — 1)тк + (т — 1)тк-і +... + (т — 1)т + (т — 1) = тк+і — 1 < тк+і, то к < 1одт п < к + 1. Таким чином, к = [1одт п] і довжина натурального числа п, записаного в т-ковій системі числення, дорівнює
+ [1одт п] = 1 + [іПт] = О(1п п). З останньої рівності видно, що асимптотична оцінка довжини числа не залежить від того, в якій системі числення воно записане.
8.4. Приклад. Побудувати машину Тюрінга для визначення суми чисел, заданих у сімковій та трійковій системах числення (результат отримати в сімковій системі числення) і оцінити її складність.
1
1в конфігурації (у ,х1 х2 ... Хкх^+1... хт) МТ зупиняє свою роботу і на виході дає слово Х1Х2 ... Хт.
Якщо конфігурація а1 = (д, ш1 аш2) змінюється на конфігурацію а2 = (д, Ьц>2), то ми писатимемо а1 ^ а2. Якщо ми матимемо послідовність конфігурацій а1, а2,... ап, таких, що а ^ аі+1, і = 1,... п — 1, то писатимемо а1 ^ ап.
На початку роботи машина Тюрінґа перебуває в початковому стані 5 і головка аналізує першу зліва непорожню клітинку. Далі, починається виконання програми роботи МТ. В таблиці обирається клітинка на перетині першого рядка (бо керуючий пристрій знаходиться в початковому стані 5) та того стовпчика, який відповідає першій букві вхідного слова, і виконується такт, вказаний в цій клітинці. Таким чином, МТ перейде до нової конфігурації. Потім виконуються такі ж дії, але вже в новій конфігурації: в таблиці знаходимо клітинку, що відповідає стану керуючого пристрою і букві цієї конфігурації, і виконується такт з цієї клітинки і т.д і т.п. Потрапивши в кінцевий стан у МТ зупиняє свою роботу і на виході одержуємо нове слово, яке записане в комірках стрічки МТ після завершення її роботи. Дане слово називатимемо вихідним словом. Кажемо, що слово ш = Х1Х2 ... Хт розпізнається машиною Тюрінґа, якщо МТ, аналізуючи ш, зупиняє свою роботу в стані у, тобто ($,Х1Х2 .. .Хт) ^ (у,У1 У2 . . .Ук ...Уп). В протилежному випадку слово ш не розпізнається МТ.
В момент зупинки всередині вихідного слова не може міститися порожніх клітинок, хоча в процесі виконання програми такі клітинки всередині проміжного слова можуть появлятися. Крім того, домовимося, що після завершення роботи МТ повинна знаходитися під однією з букв вихідного слова, якщо це слово не порожнє.
Може статися так, що в процесі обробки вхідного слова ш, МТ ніколи не перейде в кінцевий стан у .В цьому випадку кажемо, що МТ зациклюється на вхідному слові ш і слово не розпізнається МТ.
1.1. Приклад. Нехай машина Тюрінґа задана як п'ятірка МТ = (ф,А,£,$,д/), де Я = {$,Я1 ,д2,Я/}, А = {а, Ь, 0,1, #}, X = {а, Ь}, У = {0,1}, Б = {#}, і програма роботи 5 задана у вигляді таблиці:
1 — . Таким чином, шуканий НАМ має вигляд: