私は次の質問にこだわっています:
「通常の言語とは、有限オートマトンが受け入れる言語です。この事実を考えると、言語が有限オートマトンに受け入れられると、も有限オートマトンに受け入れられますはすべての単語逆転しました。」
私は次の質問にこだわっています:
「通常の言語とは、有限オートマトンが受け入れる言語です。この事実を考えると、言語が有限オートマトンに受け入れられると、も有限オートマトンに受け入れられますはすべての単語逆転しました。」
回答:
したがって、通常の言語与えられた場合、(本質的に)有限オートマトンによって受け入れられることがわかっているので、入力がは文字列です。物事を単純化するために、受け入れ状態は1つだけだと主張することさえできます。逆の言語を受け入れるために必要なことは、遷移の方向を逆にし、開始状態を受け入れ状態に変更し、受け入れ状態を開始状態に変更することだけです。次に、元のマシンと比較して「後方」にあり、言語を受け入れるマシンがあります。L L R
あなたは常にで文字列を受け入れる有限オートマトン構築できることを示さなければならない内の文字列を受け入れ有限オートマトン与え。これを行う手順を次に示します。
これらすべてを形式化しましょう。定理を述べることから始めます。
定理。が正規言語の場合、です。
レッツ NFAこととしましょう。 -NFA以下に定義言語受け付ける。
証明。まず、次のステートメントを証明:からパスしにで標識場合に限り、からパスにしてで標識(の逆用)。証明はの長さの帰納法によるものです。
まかせおよびいくつかのためと置換ための保証その。で標識されたパスがあるためから内のすべての状態に(の定義3.)およびすべての状態からパス状態にで標識、パスが存在しますで標識したからに。これは定理を証明します。
これはでもあることを証明していることに注意してください。
書式に誤りがある場合、または私の証拠に欠陥がある場合は編集してください。
上記のオートマトンベースの変換に追加するために、の正規表現を正規表現に変換する方法を示すことにより、反転時に正規言語が閉じていることを証明することもできます。そうするために、ある言語正規表現を入力として受け入れ、言語正規表現を生成する正規表現の関数を定義します。これは、正規表現の構造に帰納的に定義されます。
この構造が演習として正しいことを正式に証明できます。
お役に立てれば!
rev()
。表記法を使用しても、テーブルとほぼ正確に一致します。:)私も置くREV(R1&R2) = REV(R1)&REV(R2)
; 共通部分を持つ正規表現の実装があります。はい; 私は、おそらくR\r
逆に演算子を追加することを考えています(逆の先行する正規表現要素)。
REV(~R)
は、Rの外側のすべての文字列のセットの逆です。それは、~REV(R)
Rで示されるセットの逆の外側のすべての文字列のセットと同じですか?のパリンドロームR
もにあるため、これはまったく明確ではありませんREV(R)
。
その場合証明する、正規表現を使用して、の正規言語であり、次いで、\ EMPH {逆転}、、また規則的です。特に、を記述する正規表現が与えられた場合、を記述する正規表現に変換する方法を誘導により示します。あなたの証明はNFAに頼ることはできません。
を記述する正規表現が与えられていると仮定します。最初に連結演算子()を見てみましょう。次に、より高度な演算子に移ります。したがって、連結のケースでは、連結対象の長さを扱います。したがって、最初にからへのすべての連結を解除します。これらを扱うときは、可能な限りコンポーネントを分割します:ですが、もちろん、異なる理解の間の連想順序をすることはできません。
とき
とき、我々はすでにメカニズムがない変更を行いますので、逆転された空の文字列を持っています
ときちょうど手紙である、のように、逆転はちょうどその手紙であり、
場合、単一の構成要素があるため、その構成要素を反転するだけであるため、
kが奇数である場合、我々は、のように書くことができる正規表現有する。これらの偶数の長さの文字列の反転は簡単です。0インデックスをkインデックスに単に切り替えます。次に、1つのインデックスをk-1インデックスに切り替えます。各要素が一度切り替えられるまで続けます。したがって、最後の要素はreg exの最初であり、最初は最後です。最後から2番目が2番目で、2番目が最後から2番目です。したがって、逆の文字列(最初の文字が最後など)を受け入れる逆の正規表現があります。もちろん、各構成要素を逆にします。したがって、
kが偶数である場合、我々は、のように書くことができる一般的な正規表現有する。これらの偶数の長さの文字列の反転は簡単です。0インデックスをkインデックスに単に切り替えます。次に、1つのインデックスをk-1インデックスに切り替えます。各要素が1回切り替えられるまで続けますが、k / 2要素(kは偶数であるため整数)。したがって、最後の要素はreg exの最初であり、最初は最後です。最後から2番目が2番目で、2番目が最後から2番目です。したがって、逆の文字列を受け入れる逆の正規表現があります(最初の文字が最後など)。そしてその中間の手紙。そしてもちろん、各構成要素を逆にします。したがって、我々は得るだろう
さて、難しい部分は完了です。演算子を見てみましょう。これは単にセットの結合です。だから、二つの文字列、与えられた、逆のあるだけで。組合は変わりません。そしてこれは理にかなっています。これは、セットに文字列を追加するだけです。セットに追加される順序は問題ではありません。重要なのは、それらの順序です。
kleene star演算子は同じです。セットに文字列を追加するだけで、文字列の解釈をどのように解釈するかはわかりません。そのため、文字列 kleene starを反転するには、です。反転は、それらを通過するだけです。
したがって、これを逆にするには、ルールに従うだけです。外側のユニオンを逆にするには、単にその2つのコンポーネントを逆にします。これを逆にするには: kleene star、その中にあるものを単に反転します。次に、連結を逆にするために、インデックスを作成し、最小で最大に切り替えます。したがって、から始めてを取得します。その1文字を反転するには、ベースケースに到達してを取得します。上記で概説したこのプロセスは、この変更の帰納的記述を説明しています。((A )R ∘ (A ∪ B )R)(A )R → (A )