これは、研究プロジェクトの DFA です。DFA は手動で作成しました。DFAに対応した正規表現とは何かに興味があります。確かに、それに対応する複数の正規表現が存在する可能性があります。私たちはよりシンプルなものを好みます。
4 に答える
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 は次のとおりです。0
1
0
00* 10*1
これを理解するには:
0 0* 1 0* 1 A-E loop on E E-F loop on F F-A
下のグラフのから
A
に移動します。D
REは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*1
AEF からのループです。したがって、両方の式にプレフィックスを付けることができます
(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*))*