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ốiyxyxxyAA′xA, 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.A′x
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′,α)qa∈Aa=ϵA∈ΓA=ϵq′A 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 )A′A∈Γq,q′∈QA∈Γ∪{ϵ}(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),B′A′α)B∈Γ∪{ϵ}ϵ′=ϵq∈FA ∈ Γ ∪ { ϵ }((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,B′A,(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)qq′x(q,q′,2,A)AA′A′AxyA′thay 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 'xnynAxAyykxnyn−kxkynxn−kkA′kA′n−kAn−kAkA, sau đó pop lần , đẩy lần , chuyển sang giai đoạn 2 và pop lần .kAn−kA′n−kA′
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 AABCC′A′A′ABAB , 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ϵX′BAC′