Apa itu Tata Bahasa Bebas Konteks?

104

Dapatkah seseorang menjelaskan kepada saya apa itu tata bahasa bebas konteks? Setelah melihat entri Wikipedia dan kemudian entri Wikipedia tentang tata bahasa formal, saya benar-benar bingung. Apakah seseorang akan berbaik hati menjelaskan tentang hal-hal ini?

Saya bertanya-tanya ini karena saya ingin menyelidiki penguraian, dan juga di samping, batasan mesin regex.

Saya tidak yakin apakah istilah-istilah ini terkait langsung dengan pemrograman, atau jika lebih terkait dengan linguistik secara umum. Jika demikian, saya minta maaf, mungkin ini bisa dipindahkan jika demikian?

Elo
sumber
2
Ini lebih terkait denganAutomata Theorem
Rahul
2
Jika Anda tertarik dengan bahasa formal dan teori automata untuk parsing, saya sarankan buku seperti Bahasa dan Mesin Sudkamp atau Aho, Sethi & Ullman Compilers . Setiap buku memberikan deskripsi formal tentang tata bahasa tanpa konteks, yang merupakan jenis tata bahasa formal, kemudian menyatakan dan membuktikan teorema dasar tentang tata bahasa bebas konteks yang diperlukan untuk memahaminya (seperti lemma pemompaan untuk bahasa dan konversi bebas konteks dan teorema bentuk normal). Tidak ada prasyarat matematika untuk mempelajari teori bahasa formal di luar pemahaman sepintas tentang teori himpunan.
danportin
1
Bukankah pertanyaan seperti itu harus dipindahkan ke Ilmu Komputer Teoretis?
Titik Biru Pucat

Jawaban:

110

Tata bahasa bebas konteks adalah tata bahasa yang memenuhi properti tertentu. Dalam ilmu komputer, tata bahasa menjelaskan bahasa; secara khusus, mereka menggambarkan bahasa formal.

Bahasa formal hanyalah satu set (istilah matematika untuk kumpulan objek) dari string (urutan simbol ... sangat mirip dengan penggunaan pemrograman kata "string"). Contoh sederhana dari bahasa formal adalah himpunan semua string biner dengan panjang tiga, {000, 001, 010, 011, 100, 101, 110, 111}.

Tata bahasa bekerja dengan menentukan transformasi yang dapat Anda buat untuk membuat string dalam bahasa yang dijelaskan oleh tata bahasa. Tata bahasa akan menjelaskan bagaimana mengubah simbol awal (biasanya S) menjadi beberapa string simbol. Tata bahasa untuk bahasa yang diberikan sebelumnya adalah:

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

Cara mengartikannya adalah dengan mengatakan Sbisa diganti dengan BBB, dan Bbisa diganti dengan 0, dan Bbisa diganti dengan 1. Jadi untuk mengkonstruksi string 010 bisa kita lakukan S -> BBB -> 0BB -> 01B -> 010.

Tata bahasa bebas konteks hanyalah tata bahasa di mana hal yang Anda ganti (kiri panah) adalah simbol "non-terminal" tunggal. Simbol non-terminal adalah simbol apa pun yang Anda gunakan dalam tata bahasa yang tidak dapat muncul di string akhir Anda. Dalam tata bahasa di atas, "S" dan "B" adalah simbol non-terminal, dan "0" dan "1" adalah simbol "terminal". Suka tata bahasa

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

Tidak teratur karena mengandung aturan seperti "AB -> 1".

aegrisomnia
sumber
12
Dengan 'tidak biasa', maksud Anda 'tidak bebas konteks'? (karena bahasa yang diwakili oleh CFG adalah himpunan super yang dapat diwakili oleh ekspresi reguler)
Anti Earth
3
Haruskah "S bisa diganti dengan B" dibaca "S bisa diganti dengan BBB"?
Cosmo Harrigan
4
Ya Tuhan, ini adalah salah satu jawaban terbaik yang pernah saya lihat di SO.
Rafael Dias da Silva
1
@AntiEarth contoh kedua bukan tata bahasa biasa karena memiliki aturan yang menghasilkan dua simbol non-terminal dari satu simbol nonterminal, yang tidak diperbolehkan dalam tata bahasa biasa (juga, seperti yang ditunjukkan OP, ia memiliki aturan dengan beberapa simbol nonterminal di kiri). en.wikipedia.org/wiki/Regular_grammar
awwsmm
21

Teori Bahasa terkait dengan Teori Komputasi. Sisi mana yang lebih filosofis dari Ilmu Komputer, tentang memutuskan program mana yang mungkin, atau mana yang mungkin untuk ditulis, dan jenis masalah apa yang tidak mungkin untuk dipecahkan oleh algoritma.

Ekspresi reguler adalah cara mendeskripsikan bahasa reguler. Bahasa biasa adalah bahasa yang dapat ditentukan oleh robot terbatas deterministik.

Anda harus membaca artikel di Finite State Machines: http://en.wikipedia.org/wiki/Finite_state_machine

Dan bahasa Reguler: http://en.wikipedia.org/wiki/Regular_language

Semua Bahasa Reguler adalah Bahasa Bebas Konteks, tetapi ada Bahasa Bebas Konteks yang tidak teratur. Bahasa Bebas Konteks adalah himpunan semua string yang diterima oleh Grammer Bebas Konteks atau Pushdown Automata yang merupakan Mesin Keadaan Hingga dengan satu tumpukan: http://en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context-free_Languages

Ada bahasa yang lebih rumit yang memerlukan Mesin Turing (Program apa pun yang mungkin Anda tulis di komputer Anda) untuk memutuskan apakah sebuah string ada dalam bahasa tersebut atau tidak.

Teori bahasa juga sangat berkaitan dengan masalah P vs. NP, dan beberapa hal menarik lainnya.

Buku teks Pengantar Ilmu Komputer tahun ketiga saya cukup bagus dalam menjelaskan hal-hal ini: Pengantar Teori Komputasi. Oleh Michael Sipser. Tapi, saya harus membayar $ 160 untuk membelinya baru dan itu tidak terlalu besar. Mungkin Anda dapat menemukan salinan bekas atau menemukan salinan di perpustakaan atau sesuatu yang dapat membantu Anda.

EDIT:

Batasan Ekspresi Reguler dan kelas bahasa yang lebih tinggi telah banyak diteliti selama 50 tahun terakhir ini. Anda mungkin tertarik dengan pumping lemma untuk bahasa biasa. Ini adalah cara untuk membuktikan bahwa bahasa tertentu tidak teratur:

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

Jika suatu bahasa tidak teratur, mungkin ia Bebas Konteks, yang artinya dapat dijelaskan oleh Grammer Bebas Konteks, atau bahkan mungkin di kelas bahasa yang lebih tinggi, Anda dapat membuktikan bahwa itu bukan Bebas Konteks dengan memompa lemma untuk Bebas Konteks bahasa yang mirip dengan ekspresi reguler.

Sebuah bahasa bahkan bisa tidak dapat diputuskan, yang berarti bahkan mesin Turing (mungkin memprogram komputer Anda dapat berjalan) tidak dapat diprogram untuk memutuskan apakah sebuah string harus diterima seperti dalam bahasa atau ditolak.

Saya pikir bagian yang paling Anda minati adalah Finite State Machines (Baik Deterministik dan Deterministik) untuk melihat bahasa apa yang dapat diputuskan oleh Ekspresi Reguler, dan lemma pemompaan untuk membuktikan bahasa mana yang tidak teratur.

Pada dasarnya sebuah bahasa tidak teratur jika membutuhkan semacam memori atau kemampuan untuk berhitung. Bahasa pencocokan tanda kurung tidak teratur misalnya karena mesin perlu mengingat jika telah membuka tanda kurung untuk mengetahui apakah harus menutupnya.

Bahasa semua string yang menggunakan huruf a dan b yang mengandung minimal tiga b adalah bahasa biasa: a ba ba ba

Bahasa semua string yang menggunakan huruf a dan b yang mengandung lebih banyak b daripada a bukanlah bahasa biasa.

Juga Anda tidak boleh bahwa semua bahasa terbatas adalah reguler, misalnya:

Bahasa semua string yang panjangnya kurang dari 50 karakter menggunakan huruf a dan b yang mengandung lebih banyak b daripada a adalah biasa, karena terbatas kita tahu itu dapat dijelaskan sebagai (b | abb | bab | bba | aabbb | ababb |. ..) dll hingga semua kemungkinan kombinasi terdaftar.

Paul
sumber
1
Ekspresi reguler bukanlah program keputusan yang mencocokkan string dengan pola. Mereka adalah ekspresi yang menunjukkan himpunan reguler, yang masalah keanggotaannya dapat diputuskan.
danportin
1
Jika satu set biasa, itu jelas bisa diputuskan. Saya tidak yakin bagaimana lagi mengatakannya. Mereka adalah program keputusan yang efektif yang tidak memiliki memori.
Paul
Anda menjelaskan automata terbatas deterministik, yang menyediakan prosedur keputusan untuk bahasa biasa ("program keputusan yang tidak memiliki memori"). Ekspresi reguler adalah istilah yang menunjukkan bahasa reguler, bukan program adalah prosedur. Ini adalah satu-satunya keluhan saya.
danportin
1
Saya mengubahnya menjadi "Ekspresi reguler adalah cara mendeskripsikan bahasa reguler. Bahasa reguler adalah bahasa yang dapat ditentukan oleh automaton terbatas deterministik." Apakah itu terdengar lebih baik?
Paul