- •Розділ 7 Основи теорії кодування План викладення матеріалу
- •7.1. Алфавітне й рівномірне кодування
- •7.2. Достатні умови однозначності декодування. Властивості роздільних кодів
- •7.3. Оптимальне кодування
- •7.4. Коди, стійкі до перешкод. Коди Хемінга
- •8.2. Алгебри булевих функцій
- •8.3. Спеціальні форми зображення булевих функцій в алгебрах Буля і Жегалкіна
- •8.3.1. Диз'юнктивні нормальні форми
- •8.3.2. Кон'юнктивні нормальні форми
- •8.3.3. Поліном Жегалкіна
- •8.4. Повнота і замкненість
- •8.4.1. Функціонально повні системи
- •8.4.2. Замкнені класи
- •8.4.4. Послаблена функціональна повнота
- •8.4.5. Передповні класи
- •8.5. Мінімізація булевих функцій
- •8.5.1. Основні результати
- •8.5.2. Методи побудови скороченої днф
- •8.5.3. Побудова тупикових днф
- •8.5.4. Властивості скороченої днф
- •8.5.5.Метод карт Карно побудови мінімальних днф
- •8.6. Реалізація булевих функцій схемами з функціональних елементів
- •Комп'ютерні проекти
- •Література
- •9.2. Формальні породжувальні граматики
- •9.3. Типи граматик (ієрархія Хомські)
- •9.4. Дерева виведення
- •9.5. Форми Бекуса-Наура
- •9.6. Скінченні автомати з виходом
- •9.7. Скінченні автомати без виходу
- •9.8. Подання мов
- •Комп'ютерні проекти
- •Література
- •Розділ 10
- •План викладення матеріалу
- •10.1. Основні вимоги до алгоритмів
- •10.2. Машини Тьюрінга
- •10.3. Обчислення числових функцій на машинах Тьюрінга
9.2. Формальні породжувальні граматики
У лінгвістиці природних мов терміни "речення" й "слово" мають різний смисл; тому в математичній лінгвістиці послідовність символів звичайно називають нейтральним терміном "ланцюжок" (string), а мову, яку розуміють як множину формальних ланцюжків, - формальною мовою.
Формальна породжувальна граматика G(у подальшому граматика G)- це формальна система, визначена четвіркою об'єктів G=(V,T,S,P),де V— скінченна непорожня множина, яку називають алфавітом (або словником); T-її підмножина, елементи множини Т називають термінальними (основними) символами;S— початковий символ(S∈V), Р - скінченна множина продукцій (або правил перетворення) вигляду ξ→η, де ξ таη — ланцюжки в алфавіті V.
МножинуV\TпозначаютьN,її елементи називають нетермінальними (допоміжними) символами.
Формальні породжувальні граматики часто називають граматиками з фразовою структурою(phrase-structuregrammar),граматиками безпосередніх складових. Термінальні символи часто називають терміналами, а нетермінальні символи - нетерміналами.
У теорії формальних граматик усталилися традиції позначень, яких будемо дотримуватись. Символи термінального алфавіту прийнято позначати малими латинськими буквами або цифрами, символи нетермінального алфавіту - великими латинськими буквами, ланцюжки в алфавіті V— грецькими буквами. Довжину ланцюжкаα позначають l(α) або |α|. Нагадаємо, що множину всіх ланцюжків в алфавіті V позначають V*.
Нас цікавитимуть ланцюжки, які можуть бути породжені про-дукціями граматики.
Нехай G=(V,T,S,P)- граматика, і нехай α0=σξτ, ξ≠λ (тобто α0 – конкатенаціяσ, ξтаτ) та α1=σητ - ланцюжки над V. Якщо ξ→η є продукцією граматики G, то кажуть, що α1 безпосередньо виводиться зα0, і записуютьα0⇒α1.
Якщо α0, α1, …, αn- ланцюжки над V такі, що
α0⇒α1⇒α2, …, ⇒αn-1⇒αn ,
то кажуть, щоα0 породжуєαn,та використовують записα1⇒αn.
Послідовність кроків для отриманняαп з α0 називають виведенням.
Приклад 9.2. Речення українською мовою, наведене у прикладі 9.1, може бути виведене у граматиці G=(V,T,S,P),де
V= { , , , , , , , маленька, дівчина, нагодувала, котика},
Т= {маленька, дівчина, нагодувала, котика},
початковий символ , а множина Р містить такі продукції:
→ ,
→ , ,
→ , ,
→маленька,
→ дівчина,
→ нагодувала,
→ котика.
Ця система породжує тільки одне речення, тому їх можна замінити на
L= {маленька дівчина нагодувала котика}.
Та якщо ми в цьому випадку захочемо розширити мову, щоб увести до неї речення з означеннями "сусідська", "весела", присудком "попестила", і додатками "цуцика", "кролика" (тоді L матиме 18 речень), то це можна зробити відповідним розширенням алфавіту та додаванням лише п'яти продукцій до множини Р.▲
Приклад 9.3. Розглянемо граматикуG=(V,T,S,P). НехайV={a,b,A,B,S}Т={а,b},S - початковий символ, Р={S→АВа, А→ВВ, В→аb, АВ→b}. ЛанцюжокАаbа безпосередньо виводиться зАВа у цій граматиці, оскільки В-аb є продукцією граматики. Ланцюжок аbаbаbа породжується ланцюжкомАВа, оскільки
АВа⇒Ааbа⇒ВВаbа⇒Ваbаbа⇒аbаbаbа
за допомогою послідовного використання продукцій В→аb,А→ВВ, В→аb таВ→аb.▲
НехайG=(V,T,S,P)- граматика. Мовою, яка породжується G, називають множину всіх ланцюжків терміналів, які виводяться з початкового символу S Мову, що породжується граматикоюGпозначаютьL(G). Отже,
деT- множина всіх ланцюжків терміналів, включно з порожнім ланцюжком.
Приклад 9.4. Нехай G - граматика з алфавітомV={S,А,а,b}, множиною терміналів Т={а,b}, початковим символом S і множиною продукцій Р={S→аА,S→b, А→аа}. Знайдемо мову L(G), яка породжується цією граматикою.
Із початкового символу S можна вивести ланцюжокаА, використовуючи продукціюS→aA;або застосувати продукцію щоб вивестиb.ЗаА, скориставшись продукцієюА→аа, можна вивести ланцюжокааа. Ніяких інших ланцюжків вивести не можна. Отже, L(G)={b, ааа}.▲
Приклад 9.5. НехайG-граматика з алфавітом S={S,0,1}, Т={0,1}, початковим символом S та множиною продукцій Р={S→11S, S→0}. Знайдемо L(G).
З S отримаємо 0 (S→0) або 11S (S→11S). З 11S можна отримати 110 або 1111S. З 1111S виводяться 11110 або 111111S. Отже, після кожного виведення ми або додаємо дві одиниці у кінець ланцюжка, або закінчуємо ланцюжок нулем. Тобто L(G)={0, 110, 11110, 1111110, ...} - це множина всіх ланцюжків з парною кількістю тільки 1, після яких (у кінці) обов'язково один 0. ▲
Зауваження. Ми отримали нескінченну мову (L(G) складається з нескінченної кількості ланцюжків). Щоб граматика G породжувала нескінченну мову, у множині продукцій повинно бути принаймні одне рекурсивне правило (у прикладі 9.5 це правило S→11S).
Важливою є проблема побудови граматики для заданої мови.
Приклад 9.6. Знайдемо граматику, яка породжує мову {0m1m| т=0,1,2,...}. Потрібно дві продукції, щоб побудувати ланцюжок, який складається з деякої кількості нулів, за якими є така ж кількість одиниць. Перша продукція нарощує ланцюжок зсередини, додаючи зліва від центру 0, а справа 1. Друга продукція замінює S на порожній ланцюжок λ. Розв'язком є граматика G=(V,T,S,P), V={0,1,S}, T= {0,1}, S - початковий символ, Р={S→0S1,S→𝜆}. ▲
Приклад 9.7. Знайти граматику, яка породжує мову {0m1n|m, n=0,1,2,...}.
Таких граматик наведемо дві:
G1: V={S, 0, 1}, T={0,1}, P={S→0S, S→S1, S→λ};
G2: V={S, A, 0, 1}, T={0,1}, P={S→0S, S→1A,A→1A,A→1A, S→λ}
Пропонуємо обґрунтувати, що обидві ці граматики справді породжують мову {0m1n|m, n=0,1,2,...} (див задачі 3, 4). Цей приклад свідчить, що дві різні граматики можуть породжувати одну мову. ▲
Граматики G1таG2 називають еквівалентними, якщо L(G1)=L(G2). Граматики G1таG2з прикладу 9.7 еквівалентні.
Іноді мову, яку легко описати, доводиться задавати достатньо складною граматикою.
Приклад 9.8. Побудуємо граматику, яка породжує мову {0m1m2m|п=0,1,2,...}.
Розв'язком цієї задачі є така граматика:G=(V,T,S,P)V={0,1,2, S,А, В}, Т={0, 1,2}, початковий символ S, множина продукцій
.▲
Зауваження. Ми отримали нескінченну мову (L(G) складається з нескінченної кількості ланцюжків). Щоб граматика G породжувала нескінченну мову, у множині продукцій повинно бути принаймні одне рекурсивне правило (у прикладі 9.5 це правило S→11S).
Важливою є проблема побудови граматики для заданої мови.
Приклад 9.6. Знайдемо граматику, яка породжує мову {0m1m| т=0,1,2,...}. Потрібно дві продукції, щоб побудувати ланцюжок, який складається з деякої кількості нулів, за якими є така ж кількість одиниць. Перша продукція нарощує ланцюжок зсередини, додаючи зліва від центру 0, а справа 1. Друга продукція замінює S на порожній ланцюжок λ. Розв'язком є граматика G=(V,T,S,P), V={0,1,S}, T= {0,1}, S - початковий символ, Р={S→0S1,S→𝜆}. ▲
Приклад 9.7. Знайти граматику, яка породжує мову {0m1n|m, n=0,1,2,...}.
Таких граматик наведемо дві:
G1: V={S, 0, 1}, T={0,1}, P={S→0S, S→S1, S→λ};
G2: V={S, A, 0, 1}, T={0,1}, P={S→0S, S→1A,A→1A,A→1A, S→λ}
Пропонуємо обґрунтувати, що обидві ці граматики справді породжують мову {0m1n|m, n=0,1,2,...} (див задачі 3, 4). Цей приклад свідчить, що дві різні граматики можуть породжувати одну мову. ▲
Граматики G1таG2 називають еквівалентними, якщо L(G1)=L(G2). Граматики G1таG2з прикладу 9.7 еквівалентні.
Іноді мову, яку легко описати, доводиться задавати достатньо складною граматикою.
Приклад 9.8. Побудуємо граматику, яка породжує мову {0m1m2m|п=0,1,2,...}.
Розв'язком цієї задачі є така граматика:G=(V,T,S,P)V={0,1,2, S,А, В}, Т={0, 1,2}, початковий символ S, множина продукцій
.▲