Що таке контекстна безкоштовна граматика?


104

Чи може хтось пояснити мені, що таке контекстна граматика? Подивившись на запис у Вікіпедії, а потім у Вікіпедію на офіційній граматиці, я залишаюсь абсолютно і зовсім збентежений. Невже хтось буде такий добрий, щоб пояснити, що це за речі?

Мені це цікаво, тому що я хочу дослідити синтаксичний аналіз, а також збоку, обмеження двигуна регулярних виразів.

Я не впевнений, що ці терміни пов'язані безпосередньо з програмуванням чи вони стосуються більше мовознавства загалом. Якщо це так, я вибачаюся, можливо, це могло б бути перенесено, якщо так?


2
Це більше пов’язано зAutomata Theorem
Рахул

2
Якщо вас цікавлять формальні мови та теорія автоматів для розбору, я пропоную книгу на кшталт " Мови та машини Sudkamp" або "Aho, Sethi & Ullman's Compilers" . Кожна книга надає формальний опис без контекстної граматики, яка є типом формальної граматики, а потім викладається та доводиться основні теореми про безконтекстні граматики, необхідні для їх розуміння (наприклад, накачана лема для без контекстних мов та конвертація та теореми нормальної форми). Не існує жодної математичної передумови для вивчення формальної теорії мови за межами короткого розуміння теорії множин.
danportin

1
Чи не варто такі питання переносити на теоретичні інформатики?
Блідо-блакитна крапка

Відповіді:


110

Граматика без контексту - це граматика, яка задовольняє певні властивості. В інформатиці граматики описують мови; конкретно, вони описують формальні мови.

Формальна мова - це лише набір (математичний термін для колекції об'єктів) рядків (послідовності символів ... дуже схожий на використання програми програмування слова "рядок"). Простим прикладом формальної мови є сукупність усіх двійкових рядків довжиною три {000, 001, 010, 011, 100, 101, 110, 111}.

Граматики працюють, визначаючи перетворення, які можна зробити, щоб побудувати рядок мовою, описаною граматикою. Граматики скажуть, як перетворити символ запуску (зазвичай S) в якийсь рядок символів. Граматика для мови, що була надана раніше:

S -> BBB
B -> 0
B -> 1

Спосіб інтерпретації цього полягає в тому, щоб сказати, що Sможе бути замінено на BBB, і Bможе бути замінено на 0, і Bможе бути замінено на 1. Отже, для побудови рядка 010 ми можемо зробити S -> BBB -> 0BB -> 01B -> 010.

Безтекстова граматика - це просто граматика, де те, що ти замінюєш (ліворуч від стрілки), є єдиним символом "нетермінального". Нетермінальний символ - це будь-який символ, який ви використовуєте в граматиці, який не може відображатися у ваших заключних рядках. У граматиці вище "S" і "B" є нетермінальними символами, а "0" і "1" - символами "кінцевих". Граматики як

S -> AB
AB -> 1
A -> AA
B -> 0

Не є регулярними, оскільки вони містять правила типу "AB -> 1".


12
Під "не регулярним", ви маєте на увазі "не контекстно"? (тому що мова, що представлена ​​CFG, - це сукупність тих, які представлені регулярними виразами)
Anti Earth

3
Чи слід "S можна замінити B" читання "S можна замінити BBB"?
Cosmo Harrigan

4
Добрий пане, це одна з найкраще пояснених відповідей, яку я бачив на SO.
Рафаель Діас да Сілва

1
@AntiEarth другий приклад - це не звичайна граматика, оскільки в ній є правила, які генерують два нетермінальних символи з одного нетермінального символу, що заборонено в звичайних граматиках (також, як зазначав ОП, він має правила з кількома нетермінальними символами на ліворуч). en.wikipedia.org/wiki/Regular_grammar
awwsmm

21

Мовна теорія пов'язана з теорією обчислень. Яка більш філософська сторона Інформатики, щодо вирішення того, які програми можливі, або які коли-небудь можна буде написати, і про те, які проблеми неможливо написати алгоритм для вирішення.

Регулярний вираз - це спосіб опису звичайної мови. Звичайна мова - це мова, яку можна визначити детермінованим кінцевим автоматом.

Ви повинні прочитати статтю про Кінцеві державні машини: http://en.wikipedia.org/wiki/Finite_state_machine

І звичайні мови: http://en.wikipedia.org/wiki/Regular_language

Усі звичайні мови - це контекстні вільні мови, але є вільні контекстні мови, які не є регулярними. Безкоштовна мова контексту - це сукупність усіх рядків, які приймає вільний граммер контексту або автомат Pushdown, який є кінцевою машиною стану з єдиним стеком: http://en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context-free_Languages

Є більш складні мови, для яких потрібна машина Тьюрінга (будь-яка можлива програма, яку ви можете написати на своєму комп’ютері), щоб вирішити, чи є рядок мовою чи ні.

Теорія мови також дуже пов'язана з проблемою P проти NP та деякими іншими цікавими матеріалами.

Моє знайомство з інформатикою третього курсу з інформатики було досить добре в поясненні цього матеріалу: Вступ до теорії обчислень. Автор Майкла Шипсера. Але це коштувало мені як 160 доларів, щоб придбати його нове, і воно не дуже велике. Можливо, ви можете знайти використану копію або знайти її в бібліотеці або щось, що може вам допомогти.

Редагувати:

Обмеження регулярних виразів та вищих мовних класів були досліджені тонною протягом останніх 50 років. Можливо, вас зацікавить накачана лема для звичайних мов. Це засіб довести, що певна мова не є регулярною:

http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages

Якщо мова не є регулярною, вона може бути вільною від контексту, а це означає, що вона може бути описана граммером без контексту, а може бути навіть у вищому мовному класі, ви можете довести, що це не Context Free, накачуючи лему для Context Free мови, яка схожа на ту, що використовується для регулярних виразів.

Мова може бути навіть нерозбірливою, що означає, що навіть машина Тьюрінга (може програмувати ваш комп’ютер може працювати) не може бути запрограмована, щоб вирішити, чи слід приймати рядок як на мові чи відхиляти.

Я думаю, що частина, яка вас найбільше цікавить, - це Машини кінцевих держав (як детерміновані, так і детерміновані), щоб побачити, які мови може вирішити регулярний вираз, і перекачувати лему, щоб довести, які мови не є регулярними.

В основному мова не є регулярною, якщо їй потрібна якась пам'ять або вміння рахувати. Мова відповідних дужок не є звичайною, наприклад, тому що машині потрібно пам'ятати, чи вона відкрила дужки, щоб знати, чи має закрити її.

Мова всіх рядків з використанням літер a і b, які містять щонайменше три b, є звичайною мовою: a ba ba ba

Мова всіх рядків, що використовують букви a і b, які містять більше b, ніж a, не є регулярною.

Крім того, не слід, щоб усі кінцеві мови були регулярними, наприклад:

Мова всіх рядків довжиною менше 50 символів, що використовують літери a і b, які містять більше b, ніж a, є регулярною, оскільки це кінцеве значення, ми знаємо, що це може бути описано як (b | abb | bab | bba | aabbb | ababb |. ..) ect, поки не перераховані всі можливі комбінації.


1
Регулярні вирази - це не програми прийняття рішень, які відповідають рядкам та зразкам. Вони є виразами, що позначають регулярні набори, для яких проблема членства вирішується.
danportin

1
Якщо набір регулярний, це, очевидно, можна вирішити. Я не впевнений, як ще сказати це слово. Це фактично програми прийняття рішень, які не мають пам'яті.
Пол

Ви описуєте детерміновані кінцеві автомати, які забезпечують процедуру прийняття рішень для звичайних мов ("програми прийняття рішень, які не мають пам'яті"). Регулярні вирази - це терміни, що позначають звичайні мови, а не програми - це процедури. Це була моя єдина скарга.
danportin

1
Я змінив його на "Регулярний вираз - це спосіб опису звичайної мови. Регулярна мова - це мова, яку можна визначити детермінованим кінцевим автоматом". Це краще звучить?
Пол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.