- •2.3. Арифметичні операції в різних системах числення.
- •3.8. Розв'язати системи рівнянь з регулярними коефіцієнтами.
- •Має два виводи
- •1.4. Скінченний автомат а заданий графом:
- •4.2. Приклад. Побудувати дса, еквівалентний до нса
- •Лекція 5. Скінченні автомати і регулярні мови. Лема про роздування.
- •6.3. Приклад. Побудувати мп-автомат, який розпізнає мову
- •(Д, аЬЬа, е) ь (д, ьЬа, а) ь (д, Ьа, Ьа) ь (р, Ьа, Ьа) ь (р, а, а) ь (р, е, е); (д, аЬЬа, е) ь (д, ьЬа, а) ь (д, Ьа, Ьа) ь (д, а, ьЬа) ь (р, а, ьЬа);
- •Зліва записуються всі стани, крім кінцевого ду, з множини станів
- •Проаналізуйте роботу мт на наступних вхідних словах:
- •3.7. Приклад. Побудуємо машину Тюрінґа, яка переводить натуральні числа з унарної системи числення в десяткову.
- •Лекція 4. Частково рекурсивні та примітивно рекурсивні функції
- •Приклад. Застосувати кожну з підстановок з попереднього прикладу до слова аЬЬасЬа максимальну можливу кількісить разів.
- •5.3. Приклад. Застосувати кожен з нам
- •8.7. Оцінити часову та ємнісну складність мт, заданої графом:
3.8. Розв'язати системи рівнянь з регулярними коефіцієнтами.
Чи є мова {03т+4п | т,п > 0} регулярною? Відповідь обґрунтуйте.
Нехай Ь - мова над алфавітом {0}. Довести, що мова Ь* є регулярною. [Підказка: доведіть і використайте той факт, що якщо а та Ь є взаємно простими натуральними числами, то для кожного натурального п > аЬ існують такі невід'ємні цілі числа и та V, що виконується рівність п = иа + VЬ.]
Лекція 4. Формальні породжувальні грамати-
ки
Ми визначили формальну мову Ь як множину слів скінченної довжини в алфавіті X. Відразу виникає важливе питання: як описати мову Ь в тому випадку, коли вона нескінченна. Зрозуміло, що якщо Ь складається зі скінченної кількості слів, то найбільш очевидний спісіб - скласти перелік всіх слів мови Ь. Однак для багатьох мов не можна (або, можливо, не бажано) обмежувати верхню грань довжини найдовшого слова мови. Отже, доводиться розглядати мови, які містять як завгодно багато слів. Очевидно, що такі формальні мови неможливо визначити вичерпним переліком слів, які їм належать, і, отже, потрібно шукати інші способи їх описання. Як і раніше, ми хочемо, щоб опис мови був скінченним, хоча сама мова може бути й нескінченною. Відомо декілька методів опису мов, які задовольняють цій вимозі. Один з них полягає в використанні системи, яка називається граматикою. Слова формальної мови будуються точно визначеними способами з застосуваннями правил граматики. Одною з переваг визначення мови з допомогою граматики є та, що операції,
які будуються при синтаксичному аналізі можна зробити простішими, якщо використати структуру, яку граматика приписує словам ("реченням") формальної мови.
Формальною породжувальною граматикою називається четвірка виду О = (Ж, Т, 5, Р), де N - скінченна непорожня множина, елементи якої будемо називати нетермінальними символами, Т - скінченна непорожня множина, елементи якої будемо називати термінальними символами, 5 Є N - початковий нетермінальний символ, Р - скінченна множина продукцій (правил перетворення) вигляду £ ^ п, де £ та п - слова в алфавіті N У Т. Букви термінального алфавіту позначатимемо малими латинськими буквами чи цифрами, а не- термінального алфавіту - великими латинськими буквами. Слова в алфавіті N У Т, як завжди, будемо позначати малими грецькими буквами. Нагадаємо, що множину всіх слів в алфавіті А позначають через А* .
Нас цікавитимуть слова, які можуть бути породжені продукція- ми граматики. Нехай О = (^ Т, 5, Р) - граматика, і нехай а0 = а£т (тобто ао - конкатенація слів а, £ і т), а1 = апт - слова в алфавіті N У Т. Якщо £ ^ п - продукція граматики О, то говорять, що а1 безпосередньо виводиться з а0, і записують а0 ^ а1. Якщо а0, а1,..., ап - слова в алфавіті N У Т такі, що а0 ^ а1 ^ а2 ^ ... ^ ап-1 ^ ап, то говорять, що ап виводиться з а0 і записують а0 ап.
Мовою, що породжується граматикою О = (^ Т, 5, Р), називають множину всіх слів терміналів, які виводяться з початкового символу 5. її позначають £(О). Таким чином,
£(О) = {^ Є Т* | 5
4.1. Приклад. Граматика О, яка породжує речення (слово з чотирьох букв формальної мови £(О)) "хороший студент одержав п'ятірку" матиме вигляд О = (^ Т, 5, Р), де
М={<речення>, <група підмета>, <група присудка>, <означення>, <підмет>, <присудок>, <додаток>};
Т={ хороший, студент, одержав, п'ятірку }; 8=< речення >.
Множина продукцій Р містить продукції: <речення> ^ <група підмета> <група присудка>, <група підмета> ^ <означення> <підмет>,
<група присудка> ^ <присудок> <додаток>,
<означення> ^ хороший,
<підмет> ^ студент,
<присудок> ^ одержав,
<додаток> ^ п'ятірку.
Єдиним виведенням даної граматики з початковго нетерміналь- ного символу є шукане речення:
<речення> ^ <група підмета> <група присудка> ^ <означення> <підмет> <група присудка> ^ <означення> <підмет> <присудок> <додаток> ^ хороший <підмет> <присудок> <додаток> ^ хороший студент <присудок> <додаток> ^ хороший студент одержав <додаток> ^ хороший студент одержав п'ятірку.
Таким чином, £(О) складається з єдиного слова, яке містить чотири букви (термінали).
£(О) = {"хороший студент одержав п'ятірку"}.
Приклад. Нехай О - граматика з нетермінальним алфавітом N = {8, А}, множиною терміналів Т = {а, 6}, початковим символом 8 і множиною продукцій Р = {8 ^ 6А, 5 ^ а, А ^ 66}. Знайдемо мову £(О), що породжується цією граматикою.
Із початкового символу 8 можна вивести слово 6А за допомогою продукції 8 ^ 6А чи застосувати продукцію 8 ^ а, щоб вивести а. З 6А, скориставшись продукцією А ^ 66, можна вивести слово 666. Ніяких інших слів вивести неможливо. Отже, £(О) = {а, 666}.
Приклад. Розглянемо граматику О = ^ = {8}, Т = {0,1}, 8, Р : {8 ^ е, 8 ^ 081}) і знайдемо мову, що породжується нею.
Граматика О містить єдиний нетермінальний символ і єдине правило 8 ^ 081, права частина якого містить цей символ. Таким чином, єдиними виведеннями граматики О є виведення форми
8 ^ 081 ^ 00811 ^ ... ^ 0п81п ^ 0пе1п = 0п 1п
Отже,
£(О) = {0п 1п | п > 0}.
Якщо ми маємо багато правил граматики з однаковими лівими частинами
А ^ х1, А ^ х2,... А ^ хт,
то ми можемо об'єднати їх в одне правило наступного вигляду
А > Х1 | Х2 |... | хт.
Наприклад, правила з попереднього прикладу можуть бути записані як 5 ^ е | 051.
4.4. Приклад. Розглянемо граматику С = (Ж = {5, А, В},Т = {а, Ь}, 5, Р), де множина продукцій Р містить наступні правила:
5 ^ АВА, А ^ а | ЬЬ, В ^ Ь5 | е
і знайдемо мову Ь(С).
Оскільки нетермінальний символ А може тільки продукувати термінальні символи, то ми можемо відкласти його заміщення на- останок. Таким чином, виведення граматики С мають наступну загальну форму:
5 ^ АВА ^ АЬ5А ^ АЬАВАА ^ АЬАЬ5АА ^ А(ЬА)2 В А3 ^ ... ^ А(ЬА)пВАп+1 ^ А(ЬА)пАп+1.
Насамкінець, замінюємо нетермінал А терміналами а та ЬЬ, і одержуємо слова вигляду
(а + ЬЬ)(Ьа + ЬЬЬ)п (а + ЬЬ)п+1. Таким чином, Ь(С) складається з усіх таких слів, де п > 0.
Граматики класифікують за типами продукцій. Розглянемо класифікацію, яку запропонував американський математик і лінгвіст Н. Хомскі. Принцип цієї класифікації полягає в тому, що на продукції накладено певні обмеження. Він поділив граматики на чотири типи.
У граматиці типу 0 немає жодних обмежень на продукції. Граматика типу 1 може мати продукції лише у вигляді £ ^ п, де довжина слова п не менша, ніж довжина слова £, або у вигляді £ ^ е. У граматиці типу 2 можуть бути лише продукції А ^ ш, де А - нетер- мінальний символ, ш Є (Ж Ц Т)*. Граматика типу 3 може мати такі продукції: А ^ шВ, А ^ ш і А ^ е, де А, В - нетермінали, ш - слово з терміналів. Із цих означень випливає, що кожна граматика типу п, де п = 1, 2,3, є граматикою типу п—1. Граматики типу 2 називають контекстно вільними, бо нетермінал А в лівій частині продукції А ^ п можна замінити словом п в довільному оточенні щоразу, коли він зустрічається, тобто незалежно від контексту. Мову, яку породжує граматика типу 2, називають контекстно вільною. Якщо в множині продукцій Р є продукція виду ^ , < |п|, то граматику
а
а
а
а) (б)
В загальному випадку для контекстно вільної граматики О = (Ж, Т, 8, Р) дерево виведення будується наступним чином:
Вершиною дерева є початковий нетермінальний символ 8.
Повторюємо наступні кроки доти, доки кожен листок дерева буде або порожнім символом е або термінальним символом: для кожного листка А Є N дерева обираємо продукцію А ^ х\х2 .. .хп граматики О, де Хі Є N ЦІ Т і замінюємо вершину А Є N наступним деревом:
п
хп
—
1
Якщо конкатенація листків дерева виведення є словом ш Є Т*, то кажемо, що дане дерево є деревом виведення для слова ш.
Дерево виведення слова ш відповідає виведенню ш в граматиці О. Легко бачити, що часто дерево виведення відповідає більш ніж одному виведенню слова ш. Наприклад, для граматики О, визначеної вище, є 16 різних виведень слова ш = аЬаса в граматиці О. Серед них 8 виведень, які починаються з 8 ^ 8Ь8, зображуються одним і ти же деревом виведення, показаним на рисунку (а). Решту 8 виведень, що починаються з 8 ^ 8с8, зображені деревом виведення на рисунку (б).
Щоб зробити відповідність між деревами виведення і виведеннями в граматиці О взаємно однозначною, назвемо виведення слова ш Є £(О) лівим виведенням, якщо завжди застосовується відповідна продукція граматики О для заміни найлівішого нетермінального символу в проміжному слові при виведенні слова ш. Очевидно, що кожне дерево виведення слова ш відповідає єдиному лівому виведенню слова ш. Наприклад, серед восьми виведень для ш = а6аса, які починаються з 5 ^ 565 єдиним лівим виведенням є
5 ^ 565 ^ а65 ^ а65с5 ^ а6ас5 ^ а6аса.
Контекстно вільна граматика О = (^ Т, 5, Р) називається неоднозначною, якщо існує слово ш Є £(О), яке має два або більше різних дерев виведень. Якщо граматика використовується для визначення мови програмування, то бажано, щоб вона була однозначною. В іншому випадку програміст і компілятор можуть по різному зрозуміти смисл деяких програм.
Приклад. Найбільш відомим прикладом неоднозначності в мовах програмування є, очевидно, "плаваюче"еізе.
Розглянемо граматику О з правилами
5 ^ іґ 6 іЬеп 5 еІ8в 5 | іґ 6 іЬеп 5 | а. Ця граматика неоднозначна, оскільки слово
іґ 6 іЬеп іґ 6 іЬеп а еІзе а