サイクリックシフト (別名回転又は抱合言語の)ように定義される{ Y 、X | のX 、Y ∈ L }。ウィキペディア(およびここ)によると、文脈自由言語はこの操作のもとで閉鎖されており、大芝とMaslovの論文を参照しています。この事実の簡単な証拠はありますか?
通常の言語の場合、この形式では、「通常の言語がサイクル演算子の下で閉じられていることを証明する」という形でクロージャーが説明されます。
サイクリックシフト (別名回転又は抱合言語の)ように定義される{ Y 、X | のX 、Y ∈ L }。ウィキペディア(およびここ)によると、文脈自由言語はこの操作のもとで閉鎖されており、大芝とMaslovの論文を参照しています。この事実の簡単な証拠はありますか?
通常の言語の場合、この形式では、「通常の言語がサイクル演算子の下で閉じられていることを証明する」という形でクロージャーが説明されます。
回答:
プッシュダウンオートマトンを使用してみることができます。元の言語のプッシュダウンオートマトンを前提として、循環シフトのオートマトンを作成します。新しいオートマトンはに対応する2つの段階で動作及びXの単語の一部のy のx(xはyは元の言語です)。オートマトンは、非末端ポップしたいときはいつでも第一段階では、Aが、その代わりに非末端プッシュすることができAを' ; アイデアは、最初のステージの終わりに、スタックには逆の順序で、xを読み取った後にスタックで見つかったシンボルが含まれるということです。オリジナルのオートマトンによる。2番目の段階(スイッチは非決定的)では、非端末をプッシュする代わりに、非端末A ′をポップすることができます。元のオートマトンが実際にxの読み取り時にスタックを生成できる場合、新しいオートマトンはスタック全体を正確にポップできます。
編集:詳細は次のとおりです。アルファベット、状態のセットQ、受け入れ状態のセットF、非終端記号、、初期状態q 0、および許容される遷移のセットを含むPDAが与えられているとします。各許容遷移の形式である(Q 、、A 、Q '、α )を意味し、そのときの状態でQ、読め∈ A(または= εトップ場合、それは自由な遷移ですその場合には、) -of-スタックがあるA ∈(又は A = εスタックが空であることを意味する)、その後PDA状態への移行(これは、非決定論的モデルの)缶 Q '置き換え、 Aと α ∈ Γ *。
新しいPDAは、新しい非終端持っそれぞれのA ∈ Γを。各2つの状態についてのQ 、Q ' ∈ Q及びA ∈ Γ ∪ { ε }、二つの状態がある(Q 、Q '、1 )、(Q 、Q '、2 、Aが)。開始状態(実際の開始状態はϵ遷移を介してそれらの中から非決定的に選択されます)は(。各遷移(q 、a 、A 、q ′、α )には、対応する遷移((q 、q ″、1 )、a 、A 、(q ′、q ″、1 )、α )および((q 、q ″、2 、B。他のトランジションもあります。
各遷移には、遷移((q 、q ″、1 )、a 、B ′、(q ′、q ″、1 )、B ′ A ′ α )があります。ここで、B ∈ Γ ∪ { ε }とε ' =。すべての最終状態のための Q ∈ F、遷移が存在する((Q 、Q "、1 )、ε 、A 、(Q 0、Q "、2 、ε )、A )、ここで、 A ∈ Γ ∪ { εは}。
すべての遷移には、遷移((q 、q ″、2 、A )、a 、B ′、(q ′、q ″、2 、A )、B ′があります。 α )、ここで、A ∈ Γ ∪ { ε }。すべての移行について、遷移がある((q 、q ″、2 、B )、a 、A ′、(q ′、q ″、2 、A )、ϵ )、ここで B ∈ Γ ∪ { ε }。すべての遷移(q 、a、「一般化された遷移」((q 、q ″、2 、C )、a 、B ′ A 、(q 、q ″、2 、C )、ϵ )があります。これらは、中間の新しい状態を通る2つの遷移のシーケンスとして実装されます。遷移(q 、a 、ϵ 、q ′、で | α | ≥ 2は、同様に処理されます。すべての遷移(q 、a 、A 、q ′、A )には、遷移((q 、q ″、2 、A )、a 、B 、(q ′、q ″、2 、A )、B )があります。どこ B ∈。遷移(Q 、、A 、Q '、αは)同様に処理されます。最後に、唯一の最終状態 fと遷移((q 、q 、2 、A )、ϵ 、ϵ 、f 、ϵ )があります。
(私が見逃したいくつかの移行があるかもしれません、そして私が省略している詳細のいくつかはやや面倒です。)
私たちは言葉の承諾しようとしている思い出して、xがyは、元のPDAで受け入れられているが。状態(q 、q ′、1 )は、ステージ1の状態qにあり、元のPDAがxを読み取った後の状態q ′であることを意味します。状態(q 、q ′、2 、A )は類似しており、Aは最後にポップされたA ′に対応します。ステージ1で、我々は、プッシュする許可されているAを"をポップする代わりに。xの処理中に生成される非ターミナルごとにそれを行いますが、yの処理中にのみポップされます。ステージ2では、Aをプッシュする代わりに、A 'をポップすることができます。これを行う場合、在庫の上限は実際にはAであることを覚えておく必要があります。これは、スタックに「一時的な」ものが存在しない場合にのみ適用されます。これは、シミュレートされたPDAで、スタックの最上位がϵまたはフォームB の場合と同じです。
これは簡単な例です。各xに対してAをプッシュし、各yに対してAをポップするオートマトンを考えます。新しいオートマトンは、y k x n y n − kとx k y n x n − kの2つの形式の単語を受け入れます。最初の形式の単語の場合、ステージ1はk回A 'をプッシュすることで構成され、ステージ2はk回A 'をポップすることで構成され、nをプッシュします。時間 Aを、そしてポップ N - k個の時間 A。2番目の形式の単語の場合、まず k回 Aをプッシュし、次に k回 Aをポップし、 n − k回 A ′をプッシュして、ステージ2に遷移し、 n − k回 A ′をポップします。
次に、より複雑な例を示します。さまざまなタイプ( "()"、 "[]"、 "<>")のバランスのとれた括弧の言語の場合、括弧の各タイプの直接の子孫は異なるタイプに属している必要があります。たとえば、「([] <>)」は問題ありませんが、「()」は誤りです。各「(」、我々は押しのためにトップ・オブ・スタックがない場合にはAごとに、「)」、私たちは、ポップAを。同様に、B、Cは「[]」と「<>」に関連付けられています。">)([()] <"という単語を受け入れる方法を次に示します。>を消費し、C ′ A ′をプッシュして、ステージ2に移行します。「(」、飛び出るAを「トップ・オブ・スタック思い出しAを。"[()]"を消費し、プッシュしてポップします ; Bをプッシュするとき、「本当の」スタックのトップが Aであることを認識しているため、角括弧を使用できます(>)(()<")にだまされることはありません)。Aをプッシュするとき、スタックの先頭は B(これは ϵでも形式 X ′でもない)なので、 Bも "実際の"スタックの先頭であることを知っているので、丸括弧を使用できます(スタックの最上部のシャドウは Aですが)。最後に、「<」を消費して C ′をポップします。
グレイバッハの正規形を考えます。あなたが唯一の変更の制作に必要なシフト言語構築するため、のS → A 1 ... A N αを、新たな非終端追加S "のように振る舞うことをSがするために使用し、ケースにはいくつかのいくつかの生産は、参照S。
古いHopcroftとUllmanの古典的なIntroduction to Automata Theory(1979)をチェックするのは良い考えであることがわかりました。サイクル中の閉鎖は演習6.4cであり、S **とマークされています。二重の星は、それが(本の中で)最も難しい問題の1つであることを意味します。幸い、Sは、それがソリューションで選択された問題の1つであることを示しています。
構造の詳細は本に記載されています。
これが、Yuvalによる(受け入れられた)ソリューションを思い出させることに注意してください。ポップされる代わりにプッシュされる非ターミナルは、スタック上で逆の順序になります。ツリーの逆さまに非常に似ています。