Формальна граматика або просто граматика в теорії формальних мов — спосіб опису формальної мови, тобто виділення деякої підмножини з множини всіх слів деякого скінченного алфавіту. Розрізняють породжувальні і аналітичні граматики — перші ставлять правила, за допомогою яких можна побудувати будь-яке слово мови, а другі дозволяють по даному слову визначити, входить воно в мову чи ні. Формальні граматики були введені американським вченим, математиком та філософом Ноамом Чомскі у 50-тих роках 20 сторіччя.
Поняття алфавіту
Алфавіт — скінченна множина символів.
ε — порожній ланцюжок, слово, послідовність.
Алфавітом є об'єднання алфавітів, перетин, різниця алфавітів.
Нехай Т — алфавіт, тоді:
- Т+ — множина усіх можливих послідовностей, що складені з елементів цього алфавіту крім порожньої послідовності ε.
- Т* — множина усіх можливих послідовностей, що складені з елементів цього алфавіту, будь-якої довжини. Отже:
![{\displaystyle T^{*}=T^{+}\cup \{\varepsilon \}}](//wikimedia.org/api/rest_v1/media/math/render/svg/2fcfae37b6d9f9c7313ef9bb33d156d460bd08c8)
- Тk — множина усіх можливих послідовностей,що складені з елементів цього алфавіту, довжини не більше k.
Мова в алфавіті Т це множина ланцюжків скінченної довжини в цьому алфавіті. Зрозуміло, що кожна мова в алфавіті Т є підмножиною множини Т*.
Формальна граматика
Формальна граматика - це четвірка (кортеж)
. Де:
- Т — алфавіт термінальних символів, терміналів (від англ. terminate - завершитись). Термінальні символи є алфавітом мови.
- N — алфавіт нетермінальних символів, нетерміналів.
; Нетермінали не входять в алфавіт мови.
- S — аксіома, спеціально виділений нетермінальний символ з якого починається опис граматики.
![{\displaystyle {\mbox{S}}\in {\mbox{N}}}](//wikimedia.org/api/rest_v1/media/math/render/svg/0b4220dbd590112c1bf406219a27725367f22e00)
- P — правила виводу, скінченна підмножина множини
.
Інколи P визначають так:
.
Елемент (α,β) з множини Р називається правилом виводу і записується у вигляді
. Таким чином, ліва частина правила не може бути порожньою. Правила з однаковою лівою частиною записують:
,
- називаються альтернативами правила виводу з ланцюжка
.
Ланцюжок
назвемо безпосередньо виведеним з ланцюжка
в граматиці
(позначається
), якщо
.
Ланцюжок
назвемо виведеним з ланцюжка
в граматиці
(позначається
), якщо
![{\displaystyle \exists \gamma _{0},\gamma _{1},...,\gamma _{n},n\geq 0:\alpha =\gamma _{0}\Rightarrow \gamma _{1}\Rightarrow ...\Rightarrow \gamma _{n}=\beta }](//wikimedia.org/api/rest_v1/media/math/render/svg/8054d393630d7227a2d676d6cd9ea647f4b9e696)
Термінальний рядок називається правильним (або сентенціальною формою) відносно граматики G, якщо він виводиться з аксіоми цієї граматики.
Граматика G називається неоднозначною, якщо існує декілька варіантів виводу слова ω в G ( ω ∈ L(G ) ).
Приклад. Розглянемо таку граматику G = <N, Σ, P, S> зі схемою Р.
S → S +S |S *S |a
Покажемо, що для ланцюжка ω = a + a + a існує щонайменше два варіанти виводу:
S ⇒ S + S ⇒ S + S + S ⇒ a + S + S ⇒ a + a + S ⇒ a + a + a
S ⇒ S + S ⇒ a + S ⇒ a + S + S ⇒ a + a + S ⇒ a + a + a
В теорії граматик розглядається декілька стратегій виведення ланцюжка ω в G.
Лівостороння стратегія виводу ланцюжка ω в G — це послідовність кроків безпосереднього виводу, при якій на кожному кроку до уваги береться перший зліва направо нетермінал.
Правостороння стратегія виводу ω в G протилежна лівосторонній стратегії. З виводом ω в G пов'язане абстрактне синтаксичне дерево, яке визначає синтаксичну структуру програми.
Формальна мова породжена граматикою G - це множина термінальних рядків, що виводяться з аксіоми, тобто множина усіх правильних рядків.
![{\displaystyle L(G)=\{\alpha \in T^{*}\mid S\Rightarrow ^{*}\alpha \}}](//wikimedia.org/api/rest_v1/media/math/render/svg/62cffe95e2402562afe21285c0760c751b3f3196)
З іншого боку, множина термінальних рядків, таких, що вони можуть бути виведені в граматиці G, називається мовою, що може бути розпізнана в даній граматиці, або допускається даною граматикою.
- Граматики G1 та G2 називаються еквівалентними, якщо
.
- Граматики G1 та G2 називаються майже еквівалентними, якщо
, тобто мови, ними породжувані, відрізняються не більш ніж на ε.
Граматика може бути породжуючою та розпізнавальною, це залежить від "напрямку" застосування правил. Для породжуючих граматик виведення починається з аксіоми і закінчується термінальним рядком (рядком, що складається тільки з терміналів). А розпізнавальні аналізують вхідний термінальний рядок на правильність, чи можна такий рядок вивести в цій граматиці. Коротко кажучи - породжуючі це "згори вниз", а розпізнавальні - "знизу вгору".
Остання задача є практичнішою і гострою.
Чомскі також запропонував класифікацію граматик. Він виділив чотири типи граматик.
Класифікація за Чомскі
- Граматики Типу 0 — необмежені. Це найзагальніший клас граматик. На правила не накладаються ніяких обмежень, окрім зазначених у визначенні. Вони еквівалентні машині Тюрінґа. Доведено існування мов, які породжуються граматиками типу 0, але не граматиками типу 1, але невідомі прості приклади таких мов. Клас мов що породжуються необмеженою граматикою називається рекурсивно перелічними[en].
- Граматики Типу 1 — нескорочуючі або контекстно-залежні(КЗ) граматики. Вибір означення не впливає на множину мов, породжуваних граматиками цього класу, оскільки доведено, що множина мов, породжуваних граматиками, що не укорочують, збігається із множиною мов, породжуваних КЗ-граматиками.
- Нескорочуючі граматики. Всі правила мають вигляд
![{\displaystyle \alpha \to \beta }](//wikimedia.org/api/rest_v1/media/math/render/svg/0cea747f53e5d63b0f18b8d09505054d8150ee80)
![{\displaystyle \alpha \in (T\cup N)^{+},\beta \in (T\cup N)^{*}}](//wikimedia.org/api/rest_v1/media/math/render/svg/b531c2fbe15db652547b6268c8b61dab4a075c7a)
![{\displaystyle |\alpha |\leq |\beta |}](//wikimedia.org/api/rest_v1/media/math/render/svg/7d506f35505c5ca7bd1994920b449c03859b00cc)
- де
означає кількість символів у рядку
.
- Контекстно-залежні граматики. Всі правила мають вигляд:
![{\displaystyle \alpha \to \beta }](//wikimedia.org/api/rest_v1/media/math/render/svg/0cea747f53e5d63b0f18b8d09505054d8150ee80)
![{\displaystyle \alpha =\xi _{1}A\xi _{2},\beta =\xi _{1}\gamma \xi _{2}:A\in N,\gamma \in (T\cup N)^{+},\xi _{1},\xi _{2}\in (T\cup N)^{*}}](//wikimedia.org/api/rest_v1/media/math/render/svg/ecdec7f7198f83cba25d9c83aed0ef1294775f14)
![{\displaystyle \alpha \to \beta }](//wikimedia.org/api/rest_v1/media/math/render/svg/0cea747f53e5d63b0f18b8d09505054d8150ee80)
![{\displaystyle \alpha \in N,\beta \in (T\cup N)^{*}}](//wikimedia.org/api/rest_v1/media/math/render/svg/5b928cbe191af9cc390356535479cd0f0fbba9e0)
- Тобто в усіх правилах цього виду зліва стоїть тільки один нетермінал. Тому вони і контекстно вільні, бо на використання правила для даного нетерміналу не впливають символи, що оточують його. Ці символи називають контекстом.
- Граматики Типу 3 — регулярні граматики. А-граматики: можна визначити як праволінійну або ліволінійну граматику, або як змішану. Також ці мови називають скінченно-автоматними, бо вони еквівалентні скінченним автоматам, тобто клас мов, що породжуються граматиками типу 3, збігається з класом мов, які розпізнаються скінченими автоматами. Також ці граматики є основою регулярних виразів.
- Праволінійна граматика. Всі правила мають вигляд:
![{\displaystyle \alpha \to \beta }](//wikimedia.org/api/rest_v1/media/math/render/svg/0cea747f53e5d63b0f18b8d09505054d8150ee80)
![{\displaystyle \alpha \to \omega \beta ,\beta \in N,\omega \in T^{*}}](//wikimedia.org/api/rest_v1/media/math/render/svg/1b9c85380ba76b90a04613c8c69e627a2a281f1b)
- або
![{\displaystyle \alpha \to \omega ,\omega \in T^{*}}](//wikimedia.org/api/rest_v1/media/math/render/svg/b4cae3edd8c1f28d714dfee026b547e071948dde)
- Ліволінійна граматика. Всі правила мають вигляд:
![{\displaystyle \alpha \to \beta }](//wikimedia.org/api/rest_v1/media/math/render/svg/0cea747f53e5d63b0f18b8d09505054d8150ee80)
![{\displaystyle \alpha \to \beta \omega ,\beta \in N,\omega \in T^{*}}](//wikimedia.org/api/rest_v1/media/math/render/svg/9bfc8f5db550dd173b19eb33ae33d53a906e20f7)
- або
![{\displaystyle \alpha \to \omega ,\omega \in T^{*}}](//wikimedia.org/api/rest_v1/media/math/render/svg/b4cae3edd8c1f28d714dfee026b547e071948dde)
Доведено, що праволінійні та ліволінійні граматики еквівалентні, і існує алгоритм для переведення правил граматики одного типу в інший тип.
Співвідношення між типами граматик
- Будь-які граматики типу 3 є граматиками типу 2.
- Будь-які КВ-граматики є граматиками типу 1 (КЗ або неукорочуючі), з точністю до ε.
- Будь-які граматики типу 1 є граматиками типу 0.
Мова L(G) є мовою типу k, якщо її можна описати граматикою типу k.
Співвідношення між типами мов
- кожна регулярна мова є КВ-мовою, але існують КВ- мови, що не є регулярними (наприклад,
);
- кожна КВ- мова є КЗ- мовою, але існують КЗ-мови, що не є КВ-мовами ( наприклад,
);
- кожна КЗ-мова є мовою типу 0.
Варто підкреслити, що якщо мова задана граматикою типу k, то це не означає, що не існує граматики типу k' (k'>k), що описує ту ж мову. Тому, коли говорять про мову типу k, звичайно мають на увазі максимально можливе k.
Формальні граматики - це дуже потужний математичний інструмент, який використовується в математичній та комп'ютерній лінгвістиці, описі мов програмування, розробці компіляторів в теорії програмування. Найбільш вживаними є КВ-граматики і регулярні, бо їх найлегше описати алгоритмічно.
Сама по собі концепція формальних граматик доволі гнучка, тому не дивно, що з'явилося багато інших інструментів, що розширюють використання та потужність КВ-граматик і граматик третього типу. Наприклад, атрибутні граматики, LL-k граматики, скінченні автомати, регулярні вирази та множини.
- Українською
- (укр.) Гаврилків В. М. Формальні мови та алгоритмічні моделі. — : Голіней, 2023. — 180 с.
- Іншими мовами