Pendekatan praktis yang dalam banyak contoh berhasil [tetapi tidak selalu, saya tahu] sedang mencoba menemukan struktur bersarang dari string dalam bahasa. "Ketergantungan bersarang" harus dihasilkan pada waktu yang sama di berbagai bagian string.
Kami juga memiliki kotak alat dasar :
rangkaian: jika Anda dapat membagi bahasa menjadi dua bagian berturut-turut, gunakan produksi iniS→ S1S2
union: dibagi menjadi beberapa bagian yang terpisahS→ S1∣ S2
iterasi:S→ S1S∣ ε
Contoh 1
Berikut contoh untuk bersarang (terima kasih Raphael).
L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}
Ganti dengan . Kami sekarang dapat drop dalam kondisi.2 l nn2ln
Ganti dengan (bingung? adalah 'oh' bukan 'nol'). Terapkan alat untuk serikat pekerja. Kami bekerja dengan sini. Juga iff dan mana adalah variabel baru. Ganti dengan .k > o atau k < o o k > o k > o k = s + o s > 0 s k s + ok≠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}
Beberapa penulisan ulang sederhana.
L1={bbsboalbcbc(bc)m(aa)lbo∣l,m,o,s∈N}
Sekarang kita melihat struktur bersarang, dan mulai membangun tata bahasa.
T → b U U → b U ∣ εS1→TV , , (lihat: rangkaian dan iterasi di sini)T→bUU→bU∣ε
o bV→bVb∣W (kita menghasilkan 's di kedua sisi)o b
W→aWaa∣X
Y → b c b c Z → b c Z ∣ εX→YZ , ,Y→bcbcZ→bcZ∣ε
Contoh 2
K={akblcm∣l=m+k}
Penulisan ulang "jelas" pertama.
K={akbm+kcm∣m,k≥0}={akbmbkcm∣m,k≥0}
Dalam linguistice ini disebut "dependensi lintas-seri": interleaving (biasanya) sangat menunjukkan sifat tidak kontekstual. Tentu saja dan kita diselamatkan.m + k = k + mk,m,k,mm+k=k+m
K={akbk+mcm∣m,k≥0}={akbkbmcm∣m,k≥0}
dengan produksi , ,X → a X b ∣ ε Y → b Y c ∣ εS→XYX→aXb∣εY→bYc∣ε
Demikian pulaK′={akblcm∣m=k+l}={akblclck∣k,l≥0}
dengan produksi ,X → b X c ∣ εS→aSc∣XX→bXc∣ε
Komentar akhir: teknik-teknik ini membantu Anda menghasilkan tata bahasa kandidat bebas konteks yang diharapkan akan mengenali bahasa Anda. Bukti kebenaran mungkin masih diperlukan, untuk memastikan bahwa tata bahasa benar-benar berfungsi untuk mengenali bahasa Anda (tidak lebih, dan tidak kurang).