web-dev-qa-db-ja.com

DFAの補完物を探していますか?

RegEx (00 + 1)*の補足として、DFAダイアグラムとRegExを表示するように求められます。前の問題では、DFAの補集合が閉じており、正規表現でもあることを証明する必要がありました。したがって、DFA Mを補集合M`に変換するには、最初の受け入れ状態を交換するだけで済みます。最終的な受け入れ状態。

ただし、RegExの最初の受け入れ状態は{00, 1, ^}であり、最後の受け入れ状態も{00, 1, ^}であるようです。したがって、それらを交換すると、まったく同じ正規表現とDFAが生成され、矛盾しているように見えます。

私は何か間違ったことをしていますか、またはこのRegExは実際の補完機能を備えていないと思われますか?

ありがとうございました

16
Matt Hintzke

あなたが問題に言うように:

DFA Mを補数M`に変換するには、最初の受け入れ状態と最終的な受け入れ状態を入れ替えるだけでよいことを私は知っています。

その補完ではありませんが、言語の逆正規言語は逆転中の閉鎖

DFAの逆転

逆転言語とは何ですか?

言語Lの逆転(Lと表記)R)は、Lのすべての文字列の反転で構成される言語です。

LがL(A)であるFA Aの場合、Lのオートマトンを構築できます。R

  • 遷移図のすべてのエッジ(円弧)を反転します

  • lの受け入れ状態R オートマトンはAの開始状態です

  • aの各受け入れ状態へのイプシロン遷移を使用して、新しいオートマトンの新しい開始状態を作成します。

:すべての矢印を逆にして、DFAの初期状態と受け入れ状態の役割を交換することにより、代わりにNFAを取得できます。
そのため、私はDFAではなくFAと書きました

補完DFA

DFAの補集合を見つけますか?

Defination:言語の補集合は、Σ*(シグマスター)との集合の差によって定義されます。それはLです'* -L。

そして補語(L')のLには、Lの文字列を除くΣ*(シグマスター)のすべての文字列が含まれます。Σ*は、アルファベットΣ上のすべての可能な文字列です。
Σ=言語記号のセット

Lの補数を受け入れるDFA Dを作成するには、Aの各受け入れ状態をDの非受け入れ状態に変換し、Aの各非受け入れ状態をDの受け入れ状態に変換します。
警告!これはNFAには当てはまりません

AはLのDFA、Dは補完用です

:補完DFAを作成するには、古いDFAが完全でなければなりません。つまり、各状態からすべての可能なエッジが出て行く必要があります(つまり、 δは完全な関数である必要があります )。

補足:例の参照

正規表現の補完DFA(00+1)*

以下はDFAという名前です[〜#〜] a [〜#〜]

00+1

しかし、このDFAは完全なDFAではありません。遷移関数δは部分的に定義されていますが、完全なドメインQ×Σではありません(lableのq1から外れるEdgeがありません1)。

その完全なDFAは次のようになります([〜#〜] a [〜#〜]):

completeDFA

上記のDFAでは、すべての可能なトランザクションが定義され(* Q,Σ *のすべてのペアに対して)、この場合δは完全な関数です。

Reff:部分関数とは何かを学ぶ。

新しい補完DFA [〜#〜] d [〜#〜]は、すべての最終状態q0を最終状態ではなく、またはその逆に変更することで構築できます。

したがって、補足として、q0は非最終状態になり、q1, q2は最終状態になります。

complement

これで、 ARDEN'S THEOREM and DFA を使用して、補完言語の正規表現を記述できます。

ここでは、補完のための正規表現を直接書いています。

(00 + 1)*0(^ + 1(1 + 0)*)

ここで、^はヌルシンボルです。

いくつかの役立つリンク
ここ から、そして私のプロフィールを通して、FAに関するいくつかのより役立つ答えを見つけることができます。また、正規言語のプロパティに関する2つの優れたリンク: onesecond

33
Grijesh Chauhan

時間をかけてグリジェシュの回答をすべて読んだわけではありませんが、DFAが言語を受け入れる場合、DFAが言語の補足を受け入れる簡単な方法は次のとおりです。同じDFAを使用しますが、受け入れ状態を非受け入れに変更します、 およびその逆。

以前に受け入れられた文字列は拒否され、以前に拒否された文字列は受け入れられます。すべての遷移は有効なDFAで定義する必要があり、すべての入力文字列は正確に1つの状態につながるため、これは常に機能します。

反転用のDFAを取得するには、最初に、元のDFAのすべての受け入れ状態に非決定的に分岐する新しい初期状態を追加してNFAを構築できます。元のDFAのすべての遷移を逆にし、受け入れ状態を元のDFAの初期状態のみにします。

0
Patrick87