これは、研究プロジェクトの DFA です。DFA は手動で作成しました。DFAに対応した正規表現とは何かに興味があります。確かに、それに対応する複数の正規表現が存在する可能性があります。私たちはよりシンプルなものを好みます。

これは、研究プロジェクトの DFA です。DFA は手動で作成しました。DFAに対応した正規表現とは何かに興味があります。確かに、それに対応する複数の正規表現が存在する可能性があります。私たちはよりシンプルなものを好みます。

B と E のセルフ ループでDFAのラベルを見逃してい0ます。
DFA の正しい正規表現は次のとおりです。
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
簡単な説明:
である最終状態は 1 つだけですD。そのため、文字列が で終わる場合は受け入れられますD。着信エッジDがラベル付けされ1、ラベル付けさDれた自己ループがあることに気づきましたか0。
開始状態は、文字列をまたは でA開始できるようにするためです。実際には、A には 2 つのループがあり ます。
上部ループの RE は次のとおりです。 01000* 10*1
これを理解するには:
0 0* 1 0* 1
A-E loop on E E-F loop on F F-A
下のグラフのからAに移動します。DREは1 (0 + 10)* 1 1
これを理解するために:
1 (0 + 10)* 1 1
A - B loop on B B-C C-D
DFA の完全な RE は次のとおりです: ( answer )
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
これを理解するには:
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
^ ^ ^
upper loop A to D loop on D * for loop on D
( 0 + 1 (00* 10*1)* 1 (0 + 10)* 1 1 )*
^ D-A A-A A-B loop on B, B-c c-D
self loop on D
@RedBaronがコメントしたように編集すると、この正規表現は文字列を生成します01110100110:
最初のチェックは、DFA によって受け入れられるかどうかです。
A--0--> E--1---> F--1---> A---1---> B--0---> B---1--->C ---0--- ->B---0---> B--1-->C---1---> D---0--->D </p>
はい、文字列は DFA で受け入れられます。
RE から生成する方法 回答で示しました。以下に RE と文字列を配置しました。
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
0^ 1^ 1 1 0100 1 1 0
あなたが理解しなければならないかもしれない難しさだけ:どのように(0 + 10)*生成され0100ますか?以下のこのチェックについて:
(0 + 10)*3回繰り返す:
(0 + 10)(0 + 10)(0 + 10)
0 10 0
使用する必要があるアルゴリズムについては、こちらで説明しています。このトピックにもっと興味がある場合は、 Michael Sipser のIntroduction to the Theory of Computation を読むことを強くお勧めします。
特定の DFA の場合、アルゴリズムに従って次の正規表現を取得します。
[(010*1)*1(10*)110*1]*(010*1)*1(10)*110*
ジャック、基本的にこの DFA には 2 つの正規表現があります。1 つ目は AB*CD*A、2 つ目は AE*F* です。
10*110*cB のループなしで ABCD から遷移するためのものです。
1(0*(10)*)*110*CとBの間のループもカバーしていると思います
0+10*1AEF からのループです。したがって、両方の式にプレフィックスを付けることができます
(0+10*1)*10*110*ループなしでもループあり(0+10*1)*1(0*(10)*)*110*でも取得できます
したがって、最終的な表現は
(0+10*1)*1(0*(10)*)*110*
AからDへの移行用
最終的に状態 D に到達すると、 を取得し1、到達Aして、すべてをもう一度繰り返すことができます
((0+10*1)*1(0*(10)*)*110*)(1((0+10*1)*1(0*(10)*)*110*))*
この DFA の有効な文字列と無効な文字列の実際の動作を確認してください
明確化- この正規表現は、PCRE で受け入れられている正規表現に基づいています。So+は文字列が 1 回以上出現することを*意味し、0 回以上出現することを|意味します。OR
編集は、次の(0*(10)*)*ように書くことができます(0|(10))*(その方向に私を向けてくれた@grijesh-chauhanに感謝します)。したがって、RE (PCRE ベース) は次のようになります。
((0+10*1)*1(0|(10))*110*)(1((0+10*1)*1(0|(10))*110*))*