Bukti mudah untuk bahasa bebas konteks ditutup di bawah pergantian siklik

11

The pergeseran siklik (juga disebut rotasi atau konjugasi ) dari bahasa didefinisikan sebagai { y x | x y L } . Menurut wikipedia (dan di siniL{yxxyL} ) bahasa bebas konteks ditutup di bawah operasi ini, dengan referensi ke makalah dari Oshiba dan dari Maslov. Apakah ada bukti mudah dari fakta ini?

Untuk bahasa reguler penutupan dibahas dalam formulir ini sebagai " Buktikan bahwa bahasa reguler ditutup di bawah operator siklus ".

Hendrik Jan
sumber

Jawaban:

5

Anda dapat mencoba menggunakan automata pushdown. Diberi otomat pushdown untuk bahasa asli, kami membuat satu untuk pergantian siklik. Otomat baru beroperasi dalam dua tahap, sesuai dengan bagian dan x dari kata y x (di mana x y dalam bahasa aslinya). Pada tahap pertama, setiap kali otomat ingin pop non-terminal A , itu malah bisa mendorong non-terminal A ' ; idenya adalah bahwa pada akhir tahap pertama, tumpukan akan berisi, dalam urutan terbalik, simbol-simbol yang ditemukan dalam tumpukan setelah membaca xyxyxxyAAxoleh robot asli. Pada tahap kedua (sakelar non-deterministik), alih-alih mendorong non-terminal , kita diizinkan untuk mengeluarkan non-terminal A . Jika automaton asli memang dapat menghasilkan stack setelah membaca x , maka yang baru akan dapat persis pop seluruh stack.AAx

Sunting: Berikut adalah beberapa detail lainnya. Misalkan kita diberi PDA dengan alfabet , set status Q , set status penerimaan F , non-terminal Γ , status awal q 0 , dan serangkaian transisi yang diizinkan. Setiap transisi yang diijinkan adalah dari bentuk ( q , a , A , q , α ) , yang berarti bahwa ketika dalam keadaan q , setelah membaca a A (atau a = ϵ , dalam hal ini adalah transisi bebas), jika bagian atas -of-stack adalah A ΣQFΓq0(q,a,A,q,α)qaAa=ϵ.AΓ(atau , yang berarti tumpukan kosong), maka PDA dapat (ini adalah model non-deterministik) pindah ke status q , menggantikan A dengan α Γ A=ϵqAαΓ

PDA baru memiliki non-terminal baru untuk setiap A Γ . Untuk setiap dua status q , q Q dan A Γ { ϵ } , ada dua status ( q , q , 1 ) , ( q , q , 2 , A ) . Status awal (kondisi awal aktual dipilih secara non-deterministik di antara mereka melalui transisi ϵ ) adalahAAΓq,qQAΓ{ϵ}(q,q,1),(q,q,2,A)ϵ . Untuk setiap transisi ( q , a , A , q , α ) ada transisi yang sesuai ( ( q , q , 1 ) , a , A , ( q , q , 1 ) , α ) dan ( ( q , q , 2 , B(q,q,1)(q,a,A,q,α)((q,q,1),a,A,(q,q,1),α). Ada transisi lain juga.((q,q,2,B),a,A,(q,q,2,B),α)

Untuk setiap transisi , ada transisi ( ( q , q , 1 ) , a , B , ( q , q , 1 ) , B A α ) , di mana B Γ { ϵ } dan ϵ =(q,a,A,q,α)((q,q,1),a,B,(q,q,1),BAα)BΓ{ϵ}ϵ=ϵ. Untuk setiap keadaan akhir , ada transisi ( ( q , q , 1 ) , ϵ , A , ( q 0 , q , 2 , ϵ ) , A ) , di mana A Γ { ϵ }qF((q,q,1),ϵ,A,(q0,q,2,ϵ),A)AΓ{ϵ} .

Untuk setiap transisi , ada transisi ( ( q , q , 2 , A ) , a , B , ( q , q , 2 , A ) , B α ) , di mana A Γ { ϵ } . Untuk setiap transisi(q,a,ϵ,q,α)((q,q,2,A),a,B,(q,q,2,A),Bα)AΓ{ϵ} , ada transisi ( ( q , q , 2 , B ) , a , A , ( q , q , 2 , A ) , ϵ ) , di mana B Γ { ϵ } . Untuk setiap transisi ( q , a(q,a,ϵ,q,A)((q,q,2,B),a,A,(q,q,2,A),ϵ)BΓ{ϵ} , , ada "transisi umum" ( ( q , q , 2 , C ) , a , B A , ( q , q , 2 , C ) , ϵ ) ; ini diimplementasikan sebagai urutan dua transisi melalui negara baru menengah. Transisi ( q , a , ϵ , q α ) dengan |(q,a,A,q,B)((q,q,2,C),a,BA,(q,q,2,C),ϵ)(q,a,ϵ,q,α) ditangani dengan cara yang sama. Untuk setiap transisi ( q , a , A , q , A ) , ada transisi ( ( q , q , 2 , A ) , a , B , ( q , q , 2 , A ) , B ) , dimana B |α|2(q,a,A,q,A)((q,q,2,A),a,B,(q,q,2,A),B) . Transisi ( q , a , A , q , A α ) ditangani dengan cara yang sama. Akhirnya, ada satu-satunya kondisi akhir f , dan transisi ( ( q , q , 2 , A ) , ϵ , ϵ , f , ϵ ) .BΓ{ϵ}(q,a,A,q,Aα)f((q,q,2,A),ϵ,ϵ,f,ϵ)

(Mungkin ada beberapa transisi yang saya lewatkan, dan beberapa detail yang saya hilangkan agak berantakan.)

Ingat, kami mencoba menerima kata , di mana x y diterima oleh PDA asli. Status ( q , q , 1 ) berarti kita berada pada tahap 1, pada keadaan q , dan PDA asli berada pada keadaan q setelah membaca x . Sebuah negara ( q , q ' , 2 , A ) adalah serupa, di mana A berkorespondensi untuk yang terakhir A ' yang muncul. Pada tahap 1, kita diizinkan untuk mendorong A yxxy(q,q,1)qqx(q,q,2,A)AAAbukannya bermunculan . Kami melakukan itu untuk setiap non-terminal yang diproduksi saat memproses x , tetapi hanya muncul saat memproses y . Pada tahap 2, kita diperbolehkan untuk pop A ' bukannya mendorong A . Jika kita melakukan ini, maka kita harus ingat bahwa persediaan tertinggi adalah A ; ini hanya berlaku ketika tidak ada hal-hal "sementara" pada stack, yang dalam simulasi PDA adalah sama dengan top-of-stack menjadi ϵ atau dari bentuk B .AxyAAAϵB

Ini adalah contoh sederhana. Pertimbangkan otomat untuk yang mendorong A untuk setiap x , dan muncul A untuk setiap y . Otomat baru menerima kata-kata dari dua bentuk: y k x n y n - k dan x k y n x n - k . Untuk kata-kata dari bentuk pertama, tahap 1 terdiri dari mendorong k kali A , tahap 2 terdiri dari muncul k kali A , mendorong nxnynAxAyykxnynkxkynxnkkAkA kali A , dan muncul n - k kali A . Untuk kata-kata dari bentuk kedua, pertama-tama kita mendorong k kali A , lalu pop k kali A , mendorong n - k kali A , transisi ke tahap 2, dan pop n - k kali A nkAnkAkAkAnkAnkA .

Berikut adalah contoh yang lebih rumit, untuk bahasa kurung yang seimbang dari berbagai jenis ("()", "[]", "<>") sehingga keturunan langsung dari masing-masing jenis kurung harus berasal dari jenis yang berbeda. Misalnya, "([] <>)" tidak apa-apa tapi "()" salah. Untuk setiap "(", kita mendorong jika top-of-stack tidak A , untuk setiap ")", kami pop A . Demikian pula B , C dikaitkan dengan "[]" dan "<>". Inilah cara kami menerima kata ">) ([()] <". Kami mengonsumsi ">)", mendorong C A , dan beralih ke tahap 2. Kami mengonsumsi "(", bermunculan A ' dan mengingat top-of-stack A . Kami mengkonsumsi "[()]", mendorong dan munculA AABCCAAA ; ketika mendorongBA , kami menyadari bahwa top-of-stack "nyata" adalah A , dan kurung kotak diperbolehkan (kami tidak akan tertipu oleh ">) (() <"); ketika mendorong A , karena top-of-stack adalah B (yang bukan ϵ atau dari bentuk X ), maka kita tahu bahwa B juga merupakan top-of-stack "nyata", sehingga tanda kurung bundar diperbolehkan ( meskipun shadow top-of-stack adalah A ). Akhirnya, kita mengkonsumsi "<" dan pop C .BAABϵXBAC

Yuval Filmus
sumber
Maaf, saya kesulitan memahami - dapatkah Anda menjelaskan lebih lanjut? Di mana otomat mulai dan apa transisi? Dan apakah saklar terjadi untuk setiap simbol tumpukan? Terima kasih! AA
usul
Saran yang sangat menarik. Terima kasih. Saya akan mengunyah ini sedikit, untuk membiarkannya meresap.
Hendrik
@ Usul, Anda harus mengisi sendiri detailnya. Saklar (pada tahap pertama) harus terjadi ketika otomat "ingin" untuk pop A tetapi tidak bisa, dan sebaliknya ia mendorong A . Anda dapat menganggapnya sebagai langkah non-deterministik. AAAA
Yuval Filmus
@Yuval: maaf tapi saya tidak bisa mewujudkannya. Ketika saya memahami ide Anda, robot baru mulai dengan mensimulasikan bagian , mengubah muncul dan mendorong. Kemudian hasilkan α pada tumpukan, di mana robot asli dimulai dengan α saat membaca y . Wah, apakah aslinya dimulai dengan mendorong? Maka otomat yang tidak perlu perlu muncul dari tumpukan kosong. Saya masih berpikir intuisi Anda bermanfaat, tetapi perhatian ekstra tampaknya diperlukan. yααy
Hendrik
@ Hendrik, saya minta maaf, tapi saya tidak bisa mengikuti contoh balasan Anda. Pada titik apa menurut Anda bahwa robot baru perlu keluar dari tumpukan kosong?
Yuval Filmus
4

Pertimbangkan bentuk normal Greibach . Untuk membangun sebuah bahasa bergeser Anda hanya perlu produksi perubahan untuk S A 1 ... A n α dan menambahkan non-terminal baru S ' yang berperilaku seperti S digunakan untuk, dalam beberapa kasus beberapa produksi dirujuk S .SαA1AnSA1AnαSSS

Karolis Juodelė
sumber
Terima kasih, tapi ini digeser dengan satu huruf. Saya tertarik pada rotasi umum, dengan jumlah huruf yang berubah-ubah.
Hendrik Jan
3
shift1(L)shiftn(L)=shift1(shift1((L))nshiftn(L)n=2SαABAβCSαβCB
1
nnL={anbnn0}{akbnak+=n}{bkanbk+=n}
@ HendrikJan, saya mengerti. Saya salah mengira pertanyaannya adalah tentang pergeseran yang terbatas. Saya akan mempertimbangkan kembali jawaban saya ...
Karolis Juodelė
4

Ternyata menjadi ide yang bagus untuk memeriksa Pengantar klasik Hopcroft dan Ullman klasik ke Teori Automata (1979). Penutupan di bawah siklus adalah Latihan 6.4c dan ditandai S **. Bintang ganda berarti itu adalah salah satu masalah yang paling sulit (dalam buku ini). Untungnya S menunjukkan itu adalah salah satu masalah yang dipilih dengan solusi.

S=X1,X2,,Xnx1,x2,,xny1,y2,,ynx1x2xnyny2y1xi

S,X^n,X^2,X^1yn,,y2y1xn,,x2x1yny2y1x1x2xn

Rincian lengkap konstruksi diberikan dalam buku ini.

Perhatikan bagaimana ini mengingatkan solusi (diterima) oleh Yuval. Nonterminals yang didorong bukannya muncul berada dalam urutan yang berlawanan pada stack. Cukup mirip terbalik di pohon.

Hendrik Jan
sumber