Bằng chứng dễ dàng cho các ngôn ngữ không ngữ cảnh được đóng theo ca tuần hoàn


11

Sự dịch chuyển theo chu kỳ (còn được gọi là xoay hoặc chia động từ ) của ngôn ngữ được định nghĩa là . Theo wikipedia (và ở đây ), các ngôn ngữ không ngữ cảnh được đóng lại trong hoạt động này, với các tài liệu tham khảo từ các bài báo của Oshiba và từ Maslov. Có một bằng chứng dễ dàng về thực tế này?L{yxxyL}

Đối với các ngôn ngữ thông thường, việc đóng cửa được thảo luận trong biểu mẫu này là " Chứng minh rằng các ngôn ngữ thông thường được đóng dưới toán tử chu trình ".

Câu trả lời:


5

Bạn có thể thử sử dụng automata đẩy xuống. Đưa ra một máy tự động đẩy xuống cho ngôn ngữ gốc, chúng tôi xây dựng một cho sự thay đổi theo chu kỳ. Máy tự động mới hoạt động theo hai giai đoạn, tương ứng với phần và phần của từ (trong đó nằm trong ngôn ngữ gốc). Trong giai đoạn đầu tiên, bất cứ khi nào máy tự động muốn bật một thiết bị đầu cuối , nó có thể đẩy một thiết bị đầu cuối ; ý tưởng là ở cuối giai đoạn đầu tiên, ngăn xếp sẽ chứa, theo thứ tự ngược lại, các ký hiệu được tìm thấy trong ngăn xếp sau khi đọc bởi máy tự động ban đầu. Trong giai đoạn thứ hai (công tắc là không xác định), thay vì đẩy một thiết bị không đầu cuốiyxyxxyAAxA, chúng tôi được phép bật một thiết bị đầu cuối . Nếu máy tự động ban đầu thực sự có thể tạo ra ngăn xếp khi đọc , thì cái mới sẽ có thể bật chính xác toàn bộ ngăn xếp.Ax

Chỉnh sửa: Dưới đây là một số chi tiết. Giả sử chúng ta được cung cấp một thiết bị PDA có bảng chữ cái , tập hợp các trạng thái , tập hợp các trạng thái chấp nhận , không đầu cuối , trạng thái ban đầu và một bộ chuyển đổi cho phép. Mỗi lần chuyển đổi được phép có dạng , nghĩa là khi ở trạng thái , khi đọc (hoặc , trong trường hợp đó là chuyển tiếp tự do), nếu ngăn xếp trên cùng là (hoặc , có nghĩa là ngăn xếp trống), thì PDA có thể (đó là mô hình không xác định) chuyển sang trạng thái , thay thếQ F Γ q 0 ( q , a , A , q , α ) q a A a = ϵ A Γ A = ϵ q A α Γ ΣQFΓq0(q,a,A,q,α)qaAa=ϵAΓA=ϵqA với .αΓ

PDA mới có thiết bị đầu cuối cho mỗi . Cứ hai trạng thái và , có hai trạng thái . Các trạng thái bắt đầu (trạng thái bắt đầu thực tế được chọn không xác định trong số chúng thông qua -transitions) là . Đối với mỗi chuyển đổi có các chuyển đổi tương ứng và . Có những chuyển tiếp khác là tốt. Một gamma q , q 'Q Một gamma { ε } ( q , q ' , 1 ) , ( q , q ' , 2 , Một ) ε ( q , q , 1 )AAΓq,qQAΓ{ϵ}(q,q,1),(q,q,2,A)ϵ(q,q,1)(q,a,A,q,α)( ( q , q , 2 , B ) , a , A , ( q , q , 2 , B ) , α )((q,q,1),a,A,(q,q,1),α)((q,q,2,B),a,A,(q,q,2,B),α)

Đối với mỗi chuyển đổi , có các chuyển tiếp , trong đó và . Đối với mọi trạng thái cuối cùng , có các chuyển tiếp , trong đó .( ( q , q " , 1 ) , một , B ' , ( q ' , q " , 1 ) , B ' A ' α ) B gamma { ε } ϵ = ϵ q F ( ( q ,(q,a,A,q,α)((q,q,1),a,B,(q,q,1),BAα)BΓ{ϵ}ϵ=ϵqFA Γ { ϵ }((q,q,1),ϵ,A,(q0,q,2,ϵ),A)AΓ{ϵ}

Đối với mọi chuyển đổi , có các chuyển tiếp , trong đó . Đối với mọi chuyển đổi , có các chuyển tiếp , trong đó . Đối với mọi chuyển đổi , có "chuyển tiếp tổng quát" ; chúng được thực hiện như một chuỗi gồm hai lần chuyển tiếp thông qua trạng thái mới trung gian. Chuyển tiếp\ alpha) với( ( q , q " , 2 , Một ) , một , B ' , ( q ' , q " , 2 , Một ) , B ' α ) Một gamma { ε } ( q , một , ε , q '(q,a,ϵ,q,α)((q,q,2,A),a,B,(q,q,2,A),Bα)AΓ{ϵ}( ( q , q " , 2 , B ) , một , Một ' , ( q ' , q " , 2 , Một ) , ε ) B gamma { ε } ( q , một , Một , q ' , B ) ( ( q , q " , 2(q,a,ϵ,q,A)((q,q,2,B),a,A,(q,q,2,A),ϵ)BΓ{ϵ}(q,a,A,q,B)( q , a , ϵ , q , α ) | alpha | 2 ( q , a , A , q , A ) ( ( q , q , 2 ,((q,q,2,C),a,BA,(q,q,2,C),ϵ)(q,a,ϵ,q,α)|α|2được xử lý tương tự. Với mọi chuyển đổi , có các chuyển tiếp , trong đó . Các hiệu ứng chuyển tiếp được xử lý tương tự. Cuối cùng, có một trạng thái cuối cùng duy nhất là và chuyển tiếp .(q,a,A,q,A)B Γ { ϵ } ( q , a , A , q , A α ) f ( ( q , q , 2 , Một ) , ε , ε , f , ε((q,q,2,A),a,B,(q,q,2,A),B)BΓ{ϵ}(q,a,A,q,Aα)f((q,q,2,A),ϵ,ϵ,f,ϵ)

(Có thể có một vài chuyển đổi mà tôi đã bỏ lỡ và một số chi tiết tôi bỏ qua có phần lộn xộn.)

Hãy nhớ lại rằng chúng tôi đang cố gắng chấp nhận một từ , trong đó được chấp nhận bởi PDA gốc. Trạng thái có nghĩa là chúng ta đang ở giai đoạn 1, ở trạng thái và PDA gốc ở trạng thái sau khi đọc . Một trạng thái tương tự nhau, trong đó tương ứng với cuối cùng được bật lên. Ở giai đoạn 1, chúng ta được phép đẩy thay vì popping . Chúng tôi làm điều đó cho mỗi thiết bị đầu cuối được sản xuất trong khi xử lý , nhưng chỉ xuất hiện trong khi xử lý . Ở giai đoạn 2, chúng tôi được phép bậtx y ( q , q ' , 1 ) q q ' x ( q , q ' , 2 , Một ) Một Một ' Một ' Một x y A ' Một Một ε B 'yxxy(q,q,1)qqx(q,q,2,A)AAAAxyAthay vì đẩy . Nếu chúng ta làm điều này, thì chúng ta phải nhớ rằng cổ phiếu hàng đầu thực sự là ; điều này chỉ áp dụng khi không có những thứ "tạm thời" trên ngăn xếp, mà trong PDA mô phỏng giống như trên cùng của ngăn xếp là hoặc ở dạng .AAϵB

Đây là một ví dụ đơn giản. Hãy xem xét một máy tự động cho đẩy cho mỗi và bật cho mỗi . Máy tự động mới chấp nhận các từ có hai dạng: và . Đối với lời của hình thức đầu tiên, giai đoạn 1 bao gồm đẩy lần'giai đoạn 2 bao gồm popping lần , đẩy lần , và popping lần . Đối với các từ ở dạng thứ hai, trước tiên chúng ta đẩy lần A x A y y k x n y n - k x k y n x n - k k A k A n - k A n - k A k A k A n - k A n - k Một 'xnynAxAyykxnynkxkynxnkkAkAnkAnkAkA, sau đó pop lần , đẩy lần , chuyển sang giai đoạn 2 và pop lần .kAnkAnkA

Dưới đây là một ví dụ phức tạp hơn, đối với ngôn ngữ của dấu ngoặc đơn cân bằng thuộc nhiều loại khác nhau ("()", "[]", "<>") sao cho hậu duệ ngay lập tức của mỗi loại dấu ngoặc đơn phải thuộc một loại khác nhau. Ví dụ: "([] <>)" là OK nhưng "()" sai. Đối với mỗi "(", chúng tôi đẩy nếu top-of-chồng không phải là , đối với mỗi ")", chúng tôi bật . Tương tự , được liên kết với "[]" và "<>". Đây là cách chúng tôi chấp nhận từ ">) ([()] <". Chúng tôi tiêu thụ ">)", đẩy và chuyển sang giai đoạn 2. Chúng tôi tiêu thụ "(", bậtvà nhớ top-of-stack . Chúng tôi tiêu thụ "[()]", đẩy và bật ; khi đẩyMột Một B C C ' Một ' Một ' Một B Một B Một Một B ε X ' B A C 'A AABCCAAABAB , chúng tôi biết rằng ngăn xếp trên cùng "thực" là và vì vậy dấu ngoặc vuông được cho phép (chúng tôi sẽ không bị lừa bởi ">) (() <"); khi đẩy , vì đỉnh của ngăn xếp là (không phải là hoặc ở dạng ), nên chúng ta biết rằng cũng là chồng trên cùng "thực sự" và vì vậy dấu ngoặc tròn được phép (mặc dù bóng trên cùng của ngăn xếp là ). Cuối cùng, chúng tôi tiêu thụ "<" và pop .AABϵXBAC


Xin lỗi, tôi đang gặp khó khăn trong việc hiểu - bạn có thể giải thích thêm không? Máy tự động bắt đầu từ đâu và quá trình chuyển đổi của nó là gì? Và việc chuyển đổi xảy ra cho mọi biểu tượng ngăn xếp không? Cảm ơn! AA
usul

Đề nghị rất thú vị. Cảm ơn. Tôi sẽ nhai nó một chút, để cho nó chìm vào.
Hendrik ngày

@usul, bạn sẽ phải tự điền thông tin chi tiết. Công tắc (trong giai đoạn đầu tiên) sẽ xảy ra khi máy tự động "muốn" bật nhưng không thể, và thay vào đó, nó đẩy . Bạn có thể nghĩ về nó như là một động thái không xác định. Một Một 'AAAA
Yuval Filmus

@Yuval: xin lỗi nhưng tôi không thể làm điều này xảy ra. Theo tôi hiểu ý tưởng của bạn, máy tự động mới bắt đầu bằng cách mô phỏng phần , thay đổi bật và đẩy. Sau đó tạo trên ngăn xếp, trong đó máy tự động ban đầu bắt đầu bằng khi đọc . Waht là khởi đầu bằng cách đẩy? Sau đó, máy tự động nwe cần bật từ ngăn xếp trống. Tôi vẫn nghĩ rằng trực giác của bạn là đáng giá, nhưng một số chăm sóc thêm dường như cần thiết. a α yyααy
Hendrik ngày

@Hendrik, tôi xin lỗi, nhưng tôi không thể làm theo mẫu của bạn. Tại thời điểm nào bạn nghĩ rằng máy tự động mới cần bật ra từ ngăn xếp trống?
Yuval Filmus

4

Hãy xem xét hình thức bình thường của Greibach . Để tạo ngôn ngữ đã thay đổi, bạn chỉ cần thay đổi sản phẩm thành và thêm không đầu cuối mới hoạt động như sử dụng, trong trường hợp một số sản xuất tham chiếu . S A 1 Voi A n α S S SSαA1AnSA1AnαSSS


Cảm ơn, nhưng đây là thay đổi bởi một chữ cái duy nhất. Tôi quan tâm đến việc luân chuyển chung, bởi một số lượng chữ tùy ý.
Hendrik ngày

3
@HendrikJan, Chà, nếu có ngữ cảnh, vì vậy chắc chắn cũng sẽ không có ngữ cảnh. Bạn có thể xây dựng ngữ pháp cho nó bằng cách áp dụng phương pháp tôi đã đề xuất lần. Bạn cũng có thể trực tiếp xây dựng ngữ pháp , bằng cách "làm phẳng" ngữ pháp đã cho Ví dụ: nếu và ngữ pháp có các sản phẩm và , bạn sẽ thêm sản xuất và xoay vòng đó. Tất nhiên, kích thước của ngữ pháp của bạn có thể phát triển rất nhanh.shift1(L)shiftn(L)=shift1(shift1((L))nshiftn(L)n=2SαABAβCSαβCB
Karolis Juodelė

1
Đối với cố định bạn đúng. Nhưng ở đây là cố định cũng không bị ràng buộc. Chẳng hạn, nếu thì chúng ta thu được . nnL={anbnn0}{akbnak+=n}{bkanbk+=n}
Hendrik ngày

@HendrikJan, tôi hiểu rồi. Tôi đã giả định sai câu hỏi là về một sự thay đổi hữu hạn. Tôi sẽ xem xét lại câu trả lời của mình ...
Karolis Juodelė

4

Hóa ra đó là một ý tưởng tốt để kiểm tra Giới thiệu cổ điển Hopcroft và Ullman về Thuyết tự động (1979). Đóng cửa theo chu kỳ là Bài tập 6.4c và được đánh dấu S **. Các ngôi sao đôi có nghĩa là nó là một trong những vấn đề khó khăn nhất (trong cuốn sách). May mắn thay, S chỉ ra nó là một trong những vấn đề được lựa chọn với một giải pháp.

Giải pháp như sau. Lấy một CFG ở dạng bình thường Chomsky. Xem xét bất kỳ cây phái sinh và về cơ bản đảo ngược nó. Hãy xem xét một đường dẫn trong cây gốc. Ở bên trái cây có các đóng góp ở bên phải , có nghĩa là chuỗi dẫn xuất bằng . (Trên thực tế, ngữ pháp là CNF khi đường dẫn tiếp tục bên trái, đóng góp sẽ ở bên phải và tương ứng trống, v.v.)S=X1,X2,,Xnx1,x2,,xny1,y2,,ynx1x2xnyny2y1xi

Cây lộn ngược có đường dẫn với các đóng góp ở bên trái và ở bên phải, do đó, kết quả là một dẫn xuất cho . Theo yêu cầu.y n , ... , y 2 y 1 x n , ... , x 2 x 1 y n ... y 2 y 1 x 1 x 2 ... x nS,X^n,X^2,X^1yn,,y2y1xn,,x2x1yny2y1x1x2xn

Chi tiết đầy đủ của việc xây dựng được đưa ra trong cuốn sách.

Lưu ý cách điều này nhắc nhở về giải pháp (được chấp nhận) của Yuval. Các nonterminals được đẩy thay vì popped theo thứ tự ngược lại trên stack. Khá giống với lộn ngược trong cây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.