Saya mencari tata bahasa yang peka konteks yang menggambarkan bahasa berikut: .
Saya punya masalah dengan fakta bahwa tidak ada aturan seperti yang diizinkan dan oleh karena itu saya tidak dapat menempatkan sembarang yang mengindikasikan "tengah" dari kata tersebut. Apakah ada trik untuk masalah ini?
formal-languages
formal-grammars
context-sensitive
Tuan Bolton
sumber
sumber
Jawaban:
Memang, ada trik sederhana yang memungkinkan Anda untuk menambahkan informasi tambahan pada posisi tertentu: cukup ganti huruf yang berdekatan dengan posisi dan tandai dengan informasi, dan huruf aslinya.
Dalam contoh Anda, memiliki huruf non -tengah untuk bagian tengah, tetapi karena tidak dapat dihapus, ia juga dianggap sebagai huruf normal. Jadi kami memiliki dua salinan M a dan M b untuk menunjukkan huruf diganti. Di akhir derivasi penanda harus diganti dengan konten surat mereka, dengan produksi sederhana seperti M a → a .M Ma Mb Ma→a
Dalam kebanyakan kasus penerapan perlu dilakukan pada akhir proses derivasi. Dalam beberapa konstruksi ini tidak perlu "waktunya": ketika M menghilang terlalu cepat, derivasi tidak dapat menemukan posisi yang tepat dan proses tidak akan berhenti berhasil. Dalam kasus lain seseorang memang membutuhkan semacam kontrol. Ini kadang-kadang dilakukan dengan memperkenalkan nonterminal sebagai sinyal yang bergerak sepanjang huruf. Sekali lagi, sinyal ini juga harus membawa terminal jika tidak Anda akan mendapatkan masalah yang sama.Ma→a M
Memindahkan informasi dengan mudah dalam apa yang disebut tata bahasa monoton ( dengan | α | ≤ β | ) menggunakan aturan seperti X A → A X , yang dapat dilihat sebagai Xα→β |α|≤β| XA→AX X melompat lebih . Untuk tata bahasa konteks-sensitif yang tepat satu kebutuhan untuk membagi ini dalam tiga langkah: X A → X A X , X A X → A A X , A A X → A XA XA→XAX,XAX→AAX,AAX→AX . dalam setiap produksi satu huruf diubah dalam konteks yang tepat. Dibutuhkan beberapa imajinasi untuk melihat proses ini tidak berinteraksi dengan bagian lain dari derivasi. Misalnya, apa yang terjadi ketika pada langkah terakhir pertama kali terlibat dalam langkah derivasi lain?A
Ini mungkin tidak berfungsi untuk kata-kata yang sangat singkat, ketika ada lebih banyak informasi daripada posisi yang tersedia. Solusi paling sederhana untuk itu adalah dengan mengabaikan string pendek dalam konstruksi Anda, dan menghasilkan secara terpisah.
sumber
Jawaban standar pendek: muncul dengan LBA yang menerima bahasa dan menggunakan simulasi yang digunakan untuk membuktikan bahwa tata bahasa yang peka konteks dan LBA menentukan kumpulan bahasa yang sama. Tapi tentu saja bukan itu yang Anda cari.
Dalam kasus khusus ini, cobalah untuk berpikir menggunakan tata bahasa linear-kanan untuk dua kali, satu untuk kiri dan satu untuk setengah kanan. Yang harus Anda pastikan bahwa kedua tata bahasa berasal "sinkron".Σ∗
Ini bisa dilakukan dengan menukar token kontrol. Dengan kata lain, tata bahasa kiri mengambil aturan, menghasilkan token kontrol pas dan meneruskannya ke tata bahasa kanan. Tata bahasa kanan melihat token kontrol dan mengeksekusi aturan fitting. Perhatikan bahwa Anda juga dapat menerapkan komunikasi dua arah dengan cara ini, tetapi tidak perlu di sini.
Ada satu masalah dengan tata bahasa konteks-sensitif: mereka tidak pernah bisa menghapus non-terminal (kecuali jika kata kosong dalam bahasa). Oleh karena itu, kita harus membuat hanya non-terminal sebanyak yang kita butuhkan; tidak ada yang bisa berlebihan.S→ε
Salah satu cara untuk mencapai ini adalah dengan menggunakan trik yang sama seperti untuk bukti-bukti tertentu tentang LBA: menghasilkan semua non-terminal yang akan Anda butuhkan terlebih dahulu , yaitu menyiapkan "tape". Kemudian, "bergeraklah" pada rekaman itu. Hanya "di akhir", ganti semua non-terminal dengan terminal.
sumber
sumber