Граматики за своєю суттю є рекурсивними предметами, тому відповідь здається очевидною: шляхом індукції. Однак, специфіка часто складна для отримання правильних питань. У подальшому я опишу техніку, яка дозволяє звести багато доказів правильності граматики до механічних кроків за умови певної творчої попередньої обробки.
Основна ідея - не обмежувати себе словами граматики та мови; важко зрозуміти структуру граматики таким чином. Натомість ми будемо сперечатися про набір речень, які може створити граматика. Крім того, ми розділимо одну грізну доказову мету на безліч дрібних цілей, які можна простежити.
Нехай , формальна граматика з нетерміналів , клеми , правила і починається символ . Позначимо через набір речень, які можуть бути похідні від заданого , тобто . Мова, породжена , . Припустимо, ми хочемо показати, що для деякого .N T δ S ∈ N ϑ ( G ) S δ α ∈ ϑ ( G )G=(N,T,δ,S)NTδS∈ Nϑ ( G )SδG L ( G ) = ϑ ( G ) ∩ T ∗ L = L ( G ) L ⊆ T ∗α ∈ ϑ ( G )⟺S⇒∗αГL (G)=ϑ(G)∩ T∗L = L ( G )L ⊆ T∗
Ансац
Ось як ми йдемо з цього приводу. Визначимо так щоМ1, … , Мк⊆ ( N∪ Т)∗
- ϑ ( G ) = ⋃i = 1кМi і
- Т∗∩ ⋃i = 1кМi= L .
Хоча 2., як правило, зрозуміло за визначенням , 1. вимагає серйозної роботи. Два елементи разом чітко означають за бажанням.L ( G ) = LМiL (G)=L
Для зручності позначення позначимо .М= ⋃кi = 1Мi
Скеляста дорога
Для виконання такого доказу є два основних кроки.
Як знайти (хороший) ? Мi
Одна з стратегій полягає у дослідженні фаз, через які працює граматика. Не кожна граматика піддається цій ідеї; загалом це творчий крок. Це допомагає, якщо ми можемо самі визначити граматику; маючи певний досвід, ми зможемо визначити граматики, більш простежувані при такому підході.
Як довести 1.?
Як і у будь-якої встановленої рівності, є два напрямки.
- Gϑ ( G ) ⊆ M : (структурна) індукція над виробництвами .Г
- M i SМ⊆ ϑ ( G ) : Зазвичай один індукцію , починаючи з того, який містить .МiS
Це настільки ж специфічно, як і виходить; деталі залежать від граматики та мови.
Приклад
Розглянемо мову
L={anbncm∣n,m∈N}
і граматика з заданимиδG=({S,A},{a,b,c},δ,S)δ
SA→Sc∣A→aAb∣ε
для якого ми хочемо показати, що . Через які етапи працює ця граматика? Ну, спочатку він генерує а потім . Це негайно інформує наш вибір , а самеc m a n b n M iL=L(G)cmanbnMi
M0M1M2={Scm∣m∈N},={anAbncm∣m,n∈N},={anbncm∣m,n∈N}.
Оскільки і , пункт 2. вже подбаний. Назустріч 1. ми розділили доказ на дві частини, як було оголошено.M 0 ∩ T ∗ = M 1 ∩ T ∗ = ∅M2=LM0∩T∗=M1∩T∗=∅
ϑ(G)⊆M
Проводить структурну індукцію уздовж правил .G
IA: Оскільки ми успішно закріплюємося.S=Sc0∈M0
IH: Нехай для деякого безлічі пропозицій , що ми знаємо .X ⊆ MX⊆ϑ(G)X⊆M
IS: Нехай довільним. Ми повинні показати , що незалежно від форми має і те , що правило застосовується наступний, ми не залишаємо . Ми робимо це шляхом повного розрізнення випадків. За допомогою індукційної гіпотези ми знаємо, що (саме) застосовується один із таких випадків:α Mα∈X⊆ϑ(G)∩MαM
- w = S c m m ∈ N Mw∈M0 , тобто для деяких .
Можна застосувати два правила, обидва з яких виводять речення в :
w=Scmm∈N
M
- Scm⇒Scm+1∈M0 і
- Scm⇒Acm=a0Ab0cm∈M1 .
- w = a n A b n c m m , n ∈ Nw∈M1 , тобто для деяких :
w=anAbncmm,n∈N
- w⇒an+1Abn+1cm∈M1 і
- w⇒anbncm∈M2 .
- w ∈ T ∗w∈M3 : оскільки , подальший похід неможливий.w∈T∗
Оскільки ми успішно охопили всі випадки, індукція завершена.
ϑ(G)⊇M
Виконуємо один (простий) доказ на . Зверніть увагу, як ми ланцюжок доказів так "пізніше" може закріпити за допомогою "раніше" .М i М iMiMiMi
- m S c 0 = S S → S cM1 : Виконуємо індукцію над , закріплюючи в і використовуючи на кроці.mSc0=SS→Sc
- m n A c m S ⇒ ∗ S c m ⇒ A c m A → a A bM2 : фіксуємо довільним значенням та індукуємо над . Ми закріплюємо в , використовуючи цей за попереднім доказом. Крок прогресує через .mnAcmS⇒∗Scm⇒AcmA→aAb
- M3 : Для довільних ми використовуємо колишній доказ для .m,n∈NS⇒∗anAbncm⇒anbncm
Це завершує другий напрямок доказування 1., і ми закінчили.
Ми можемо бачити, що ми сильно використовуємо, що граматика лінійна . Для нелінійних граматик нам потрібні з більш ніж одним змінним параметром (у доказі), який може стати некрасивим. Якщо ми маємо контроль над граматикою, це вчить нас робити це просто. Розглянемо як стримуючий приклад цю граматику, еквівалентну :MiG
SAC→aAbC∣ε→aAb∣ε→cC∣ε
Вправа
Дайте граматику для
L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}
і довести її правильність.
Якщо у вас є проблеми, граматика:
Розглянемо з виробництвамиG=({S,Br,Bl,A,C},{a,b,c},δ,S)
SBlBrAC→bSb∣Bl∣Br→bBl∣bA→Brb∣Ab→aAaa∣C→bcC∣bcbc
і :Mi
M0M1M2M3M4M5={biSbi∣i∈N}={biBlbo∣o∈N,i≥o}={bkBrbi∣k∈N,i≥k}={bkaiAa2ibo∣k,o,i∈N,k≠o}={bkal(bc)iCa2lbo∣k,o,l,i∈N,k≠o}=L
Що з нелінійними граматиками?
Характерною особливістю класу безконтекстних мов є мова Dyck : по суті, кожна безконтекстна мова може бути виражена як перетин мови Dyck та звичайної мови. На жаль, мова Дайка не є лінійною, тобто ми не можемо дати жодної граматики, яка по суті відповідає такому підходу.
Ми, звичайно, можемо все-таки визначити і зробити доказ, але це, мабуть, буде більш важким із вкладеними індукціями та чим ні. Я знаю один загальний спосіб, який мені може допомогти певною мірою. Ми змінюємо ансац, показуючи, що ми створюємо принаймні всі необхідні слова, і що ми створюємо потрібну кількість слів (на довжину). Формально ми це показуємоMi
- ϑ(G)⊇L і
- n∈ N|L(G)∩Tn|=|L∩Tn|для всіх .n∈N
Таким чином, ми можемо обмежитися "легким" напрямком від початкового ансацу та експлуатаційної структури в мові, ігноруючи надскладні функції, які може мати граматика. Звичайно, немає безкоштовного обіду: ми отримуємо все нове завдання підрахунку слів, які генерує для кожного . На щастя, це часто простежується; см тут і тут для details¹. Ви можете знайти приклади моєї дипломної роботи .n ∈ NG n∈N
Для неоднозначних і безконтекстних граматик, я боюся, ми повернулися до ансацу та думок.
- Використовуючи саме цей метод підрахунку, ми отримуємо як бонус, що граматика однозначна. У свою чергу, це також означає, що методика повинна мати збій для неоднозначних граматик, як ми ніколи не можемо довести 2.