私が正しく理解すれば、NFAには正規表現と同じ表現力があります。多くの場合、NFAから同等の正規表現を読み取るのは簡単です。サイクルを星に変換したり、ジャンクションを代替として変換したりします。しかし、この場合何をすべきか:
[ ソース ]
オーバーラップするサイクルにより、このオートマトンが何を受け入れるか(正規表現に関して)がわかりにくくなります。トリックはありますか?
私が正しく理解すれば、NFAには正規表現と同じ表現力があります。多くの場合、NFAから同等の正規表現を読み取るのは簡単です。サイクルを星に変換したり、ジャンクションを代替として変換したりします。しかし、この場合何をすべきか:
[ ソース ]
オーバーラップするサイクルにより、このオートマトンが何を受け入れるか(正規表現に関して)がわかりにくくなります。トリックはありますか?
回答:
これを行うには、いくつかの標準的な方法のうちの1つを「読む」のではなく、使用する必要があります。私が見た中で最も優れているのは、オートマトンを解くことができる(通常の)言語の方程式系として表現するものです。他の方法よりも簡潔な表現が得られるように見えるので、特に便利です。
私が書いたこの文書の最後の夏に学生のための方法を説明します。特定の講義に直接関連しています。言及されているリファレンスは正規表現の典型的な定義です。アーデンの補題の証明(必要な結果)が含まれています。メソッドの正確さの1つが欠落しています。講義で知ったので、残念ながら参考文献がありません。
与えられたオートマトンへの適用は演習として残されます。完全な例は、上記のリンクされたドキュメントに含まれています。
同様の回答を投稿したこちらもご覧ください。
ループのない状態のチェーンだけがあった場合、何をすべきか知っていますか?
この重複する分岐のない単純なループがあった場合、何をすべきか知っていますか?
(答えが「いいえ」の場合、最初にこれらのケースについて考えてください。)
ここでのアイデアは、オートマトンを段階的に変換して、パターンを見つけることができる形式に配置することです。チェーン、ループ、および最終的に再収束する(交互につながる)分岐パスです。変換のすべてのステップで、変換されたオートマトンが依然として同じ言語を認識するように注意してください。
これは非決定的なオートマトンであることを覚えておいてください。あなたが投稿したものはたまたま確定的ですが、変換するときにそのようにとどまる必要はありません。
最終的な状態を確認するように注意してください。最初はこれを気にせずに1つの大きなループを作成し、次にループの途中で終了するパーツを複製するのに役立ちます。
これは必ずしも最も効率的な手法や最も単純な正規表現を生成する手法ではありませんが、簡単です。
[(])
が[()]
。