重複するサイクルを持つNFAを正規表現に変換する方法は?


11

私が正しく理解すれば、NFAには正規表現と同じ表現力があります。多くの場合、NFAから同等の正規表現を読み取るのは簡単です。サイクルを星に変換したり、ジャンクションを代替として変換したりします。しかし、この場合何をすべきか:

ここに画像の説明を入力してください
[ ソース ]

オーバーラップするサイクルにより、このオートマトンが何を受け入れるか(正規表現に関して)がわかりにくくなります。トリックはありますか?


2
図に初期状態と最終状態を示すことができればよいでしょう。初期状態への小さな矢印と最終状態としての二重円です。また、何を試したのかを示さなければ、どこが悪いのかを知るのは困難です。
Dave Clarke

おそらく、このドキュメントはあなたを助けるでしょう:それはNFAをREに変換する方法を明確に説明します。
Vor

1
なんで難しいの?正規アルゴリズムの1つを試しましたか?あなたにできる最高の仮説は何ですか?
ラファエル

3
質問(imho)を面白くしてこのサイトに役立つように編集しました。意見を形成するには、改訂履歴を参照してください。
ラファエル

1
私はあなたのNFAを正規表現に変換する準備ができていますが、それを削除しました:ラファエルの答えはあなたがそれを自分で行うために必要な方法を提供します(それは例へのリンクも提供します)。欲しいです。それでも私の解決策が必要な場合は、回答の削除を取り消します。
アレックステンブリンク

回答:


5

これを行うには、いくつかの標準的な方法のうちの1つを「読む」のではなく、使用する必要があります。私が見た中で最も優れているのは、オートマトンを解くことができる(通常の)言語の方程式系として表現するものです。他の方法よりも簡潔な表現が得られるように見えるので、特に便利です。

私が書いたこの文書の最後の夏に学生のための方法を説明します。特定の講義に直接関連しています。言及されているリファレンスは正規表現の典型的な定義です。アーデンの補題の証明(必要な結果)が含まれています。メソッドの正確さの1つが欠落しています。講義で知ったので、残念ながら参考文献がありません。

qi

Qi=qiaqjaQj{{ε}, qiF, else

Fqiaqjqiqja+

QiqiQ0q0

与えられたオートマトンへの適用は演習として残されます。完全な例は、上記のリンクされたドキュメントに含まれています

同様の回答を投稿したこちらもご覧ください。


1
他の一般的な方法については、この参照質問を参照してください。
ラファエル

3

ループのない状態のチェーンだけがあった場合、何をすべきか知っていますか?

この重複する分岐のない単純なループがあった場合、何をすべきか知っていますか?

(答えが「いいえ」の場合、最初にこれらのケースについて考えてください。)

ここでのアイデアは、オートマトンを段階的に変換して、パターンを見つけることができる形式に配置することです。チェーン、ループ、および最終的に再収束する(交互につながる)分岐パスです。変換のすべてのステップで、変換されたオートマトンが依然として同じ言語を認識するように注意してください。

これは決定的なオートマトンであることを覚えておいてください。あなたが投稿したものはたまたま確定的ですが、変換するときにそのようにとどまる必要はありません。

q2q1fq2gq3q4q2q5q4jq5gq3

q3,q4,q5q3q3(hjg)

最終的な状態を確認するように注意してください。最初はこれを気にせずに1つの大きなループを作成し、次にループの途中で終了するパーツを複製するのに役立ちます。

これは必ずしも最も効率的な手法や最も単純な正規表現を生成する手法ではありませんが、簡単です。


3

q_1を分割


そして、これはどのように質問に答えますか?
ラファエル

1
この方法でステートマシンを書き換えると、同等の正規表現を読み取るのは簡単になります。
Jukka Suomela

1
これを回答テキストに含める必要があるかもしれません。これは常に機能しますか?
ラファエル

@Raphael:この場合は機能します。:)このトリックの背後にある一般的なアイデアは次のとおりです。サイクルを「正しくネスト」しました。つまり、サイクル構造はありません[(])[()]
Jukka Suomela
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.