Практичний підхід, який у багатьох прикладах працює [але не завжди, я знаю] намагається знайти це в мові структуру гніздування струн. "Вкладені залежності" повинні створюватися одночасно в різних частинах рядка.
Також у нас є базовий інструментарій :
конкатенація: S→S1S2 якщо ви можете розділити мову на дві послідовні частини, використовуйте це виробництво
союз: S→S1∣S2 розділиться на роз'єднані частини
ітерація: S→S1S∣ε
Приклад 1
Ось приклад для гніздування (дякую Рафаелю).
L = { bкал( b c )манбо∣ k , l , m , n , o ∈ N , k ≠ o , 2 l = n , m ≥ 2 }
Замініть на 2 л . Тепер ми можемо скинути nн2 лн в умовах.
Замініть на k > o або k < o (плутати? O - це "о", а не "нуль"). Застосовуйте інструменти для об'єднання. Ми працюємо з k > o тут. Також k > o iff k = s + o і s > 0, де s - нова змінна. Замініть k на s + o .k≠ok>o or k<ook>ok>ok=s+os>0sks+o
L1={bs+oal(bc)ma2lbo∣l,m,o,s∈N,s>0,m≥2}
Деякі прості переписування.
L1={bbsboalbcbc(bc)m(aa)lbo∣l,m,o,s∈N}
Тепер ми бачимо структуру гніздування і починаємо будувати граматику.
, T → b U , U → b U ∣ ε (див. Тут: конкатенація та ітерація)S1→TVT→bUU→bU∣ε
(генеруємо o b з обох сторін)V→bVb∣Wo b
W→aWaa∣X
, Y → b c b c , Z → b c Z ∣ εX→YZY→bcbcZ→bcZ∣ε
Приклад 2
K={akblcm∣l=m+k}
Перший "очевидний" перепис.
K={akbm+kcm∣m,k≥0}={akbmbkcm∣m,k≥0}
У лінгвістиці це називається " міжсеріальна залежність": переплетення (як правило) сильно вказує на безконфліктність. Звичайно, m + k = k + m і ми врятовані.k,m,k,mm+k=k+m
K={akbk+mcm∣m,k≥0}={akbkbmcm∣m,k≥0}
з виробництвами , X → a X b ∣ ε , Y → b Y c ∣ εS→XYX→aXb∣εY→bYc∣ε
Аналогічно K′={akblcm∣m=k+l}={akblclck∣k,l≥0}
з виробництвами , X → b X c ∣ εS→aSc∣XX→bXc∣ε
Остаточний коментар: ці методи допоможуть вам розібратися з кандидатською граматикою без контексту, яка, сподіваємось, розпізнає вашу мову. Доказ коректності все ж може знадобитися для того, щоб граматика справді працювала на розпізнавання вашої мови (нічого більше, і не менше).