
- •Тема 3. Алгоритмічні системи
- •3.1. Визначення алгоритмічної системи
- •3.2. Рекурсивні функції
- •3.3. Нормальні алгоритми Маркова
- •3.4. Машини Поста
- •3.5. Машини Тьюринга
- •3.6. Абстрактні автомати
- •Недетермінований скінченний автомат
- •Детермінований скінченний автомат
- •3.7. Формальні граматики
- •Класифікація формальних граматик.
- •6.2. Приклади, що ілюструють первинні поняття
- •3.8. Алгоритмічні основи еом
- •3.9. Термінологічний словник
Класифікація формальних граматик.
Розрізняють розпізнавальні, породжувальні та перетворювальні формальні граматики, контекстовільні та контекстозалежні і т.д.
Розпізнавальна граматика — якщо для будь-якого ланцюжка символів вона може вирішити, чи є він правильним чи ні, і якщо так, то як він побудований.
Породжувальна граматика — якщо вона може побудувати будь-який правильний ланцюжок символів, даючи вказівки щодо його побудови, і не будує жодного неправильного ланцюжка.
Перетворювальна граматика — якщо для будь-якого правильно побудованого ланцюжка вона вміє побудувати відображення у вигляді знов-таки правильного ланцюжка, задаючи вказівки щодо порядку проведення відображень.
Контекстовільні граматики: правила підстановок застосовуються до ланцюжків символів (до окремих сполучень символів, до окремих символів) незалежно від тих символів, які їх оточують (від контексту), і при виконанні підстановок цей контекст залишається без змін.
Контекстозалежні граматики: до ланцюжків символів застосовуються різні правила підстановок залежно від їх контексту. Наприклад, при перекладі текстів з однієї мови спілкування на іншу використовуються правила контекстозалежних граматик, бо одному й тому самому слову у різних контекстах будуть ставитись у відповідність різні слова іншої мови. Водночас мови програмування побудовано за правилами контекстовільних граматик, і кожна конструкція такої мови завжди має один і той самий зміст, смисл і тлумачення, тому при перекладі (трансляції) на будь-яку іншу мову програмування та мову комп’ютерних команд (ЕХЕ-модулі), в першу чергу за правилами перетворювальних граматик можна отримати тільки один варіант вихідного тексту, з одним ланцюжком символів вхідного тексту, незалежно від контексту, зіставити один і той самий вихідний ланцюжок.
Дві граматики називають слабо еквівалентними, якщо вони породжують одну й ту саму мову, тобто одну й ту саму множину термінальних ланцюжків.
Дві граматики називають сильно еквівалентними, якщо вони породжують одну й ту саму мову та однаковим ланцюжком приписують однакові виводи (однакові алгоритми).
Формальні граматики є складовою частиною науки, що відокремилась від теорії алгоритмів, — математичної лінгвістики, яка вив-чає природні мови, їх розвиток та вживання за допомогою законів математики, а також є основою створення мов програмування.
Наведемо приклад формальної породжувальної граматики, за правилами якої будуються речення певної конструкції.
Нехай маємо граматику
G = {VT, VH, P, S},
де VH = {S, B, C, D, E, F, K} — нетермінальний словник, символи якого означають:
S — речення (виділений символ);
B — група підмета;
C — група присудка;
D — іменник;
E — прикметник;
F — дієслово;
K — прислівник.
Термінальний словник
VT = {a, b, c, d, e, f, i, j, k, e, m, n, p, r, t}, символи якого означають:
а — пес в — сніг с — малюк d — комар |
е — білий f — пухнастий i — веселий j — бігає |
к — кусає е — стрибає m — сміється n — падає |
p — швидко r — голосно t — тихенько |
Правила підстановок:
P = {SàBC, BàED, CàKF, Eàe, Eàf, Eài, Dàa, Dàb,
Dàc, Dàd, Kàp, Kàr, Kàt, Fàj, Fàk, Fàl, Fàm,Fàn}.
Таку граматику можна представити у вигляді графа (рис. 3.5):
Рис. 3.5. Граф
породжувальної граматики
— веселий пес швидко бігає;
— білий сніг тихенько падає;
— пухнастий комар голосно сміється
та багато інших. З точки зору породжувальної граматики всі ці речення є правильними, тобто побудованими за правилами синтаксису даної граматики. Інша справа, що останнє речення не має смислу в український мові, отже, не належить їй, тільки у формальних мовах існує взаємнооднозначна відповідність між породженими текстами (ланцюжками) та смислами.
Породжуючі граматики Хомського
Граматики, що породжують (граматики Н. Хомского).
Ноам Хомський (Noam Chomsky, p. 1928) - американський лінгвіст і політичний активіст. Починаючи з 1957 року опублікував ряд робіт, що заклали основи математичної лінгвістики).
Граматики, що породжують, - це простий і потужний механізм, який дозволяє задавати великий клас мов, які містять нескінченну множину ланцюжків. За допомогою граматик, що породжують, ми зможемо, зокрема, визначити мови L3, L4 і L5, для завдання яких ми раніше обмежувалися словесними формулюваннями. Граматики, що породжують, використовуються і при описі синтаксису мов програмування.
Граматикою, що породжує, називається четвірка:
G = (T,N,P,S),
де Т - кінцева множина термінальних (основних) символів - основний алфавіт. Елементами множини T являются символи, з яких в остаточному підсумку і складаються ланцюжки мови, породжуваної даною граматикою. Термінальний (від лат. termіnus - межа, кінець) і означає "кінцевий, кінцевий". Т - це не що інше, як алфавіт мови, породжуваною граматикою. Надалі, якщо не оговорено особливо, термінальні символи, або просто термінали, будуть позначатися малими буквами латинського алфавіту: а,b,с т.д.;
N- кінцева множина нетермінальних (допоміжних) символів - допоміжний алфавіт. Нетермінальні символи, по-іншому нетермінали, - це поняття граматики (мови), які використовуються при її описі. Нетермінали будемо позначати заголовними латинськими буквами: А, В, C,D,E і т.д.;
Р- кінцева множина правил виводу, що називається також продукціями. Кожне правило множини Р має вигляд:
,
де і - ланцюжки термінальних і нетермінальних символів. Ланцюжок не повинен бути порожнім, ланцюжок може бути порожнім: (T N)+; (T N)*. (ланцюжок символів належить термінальному словнику T або N, - символ об’єднання)
означає
множину елементів, що належать до множині
A або B (або до двох множин
відразу).
Правило визначає можливість підстановки замість в процесі виводу (породженні) ланцюжків мови;
S (S N) - початковий символ граматики - один з множини нетермінальних символів, початковий (стартовий) нетермінал. Початковий нетермінал - це поняття, що відповідає правильному реченню мови. Наприклад, початковий нетермінал граматики виразів позначає "вираз", а початковий нетермінал граматики мови Паскаль - "програма".