DFAがNFAと同等であることを確認するにはどうすればよいですか?


10

NFAをDFAに変換する方法を学習しています。正しく実行されていることを確認したいと思います。明らかに、別の方向に戻ることは重要ではありません。DFAがNFAと同等であることを確認するアルゴリズムを知っている人はいますか?


解釈の候補の1つ:NFAからDFAへの変換の問題に対して(WassermanおよびBlumの意味で)「結果チェッカー」はありますか?言い換えると、変換アルゴリズムに対して主張された(入力、出力)ペアが与えられ、出力が正しいかどうかをチェックする、変換自体よりも漸近的に高速なアルゴリズムがありますか?
DW

回答:


7

これは問題のある質問です。オートマトンの同等性をチェックする方法があります。これについては、これから説明しますが、最後に説明するように、それは役に立たないと思います。

と場合、2つのセットとは等しいことを思い出してください(これは、セットの等価性の定義です)。したがって、およびであることを確認するだけで十分です。ここで、およびはそれぞれDFAおよびNFAです。ABABBAL(D)L(N)L(N)L(D)DN

しかし、どのようにして言語の包含をチェックするのか、あなたは尋ねるかもしれません。さて、今ことが観察 IFF(ここでの補数である)。ABAB¯=B¯B

最初にかどうかを確認してみましょう。これを行うには、を補完する(非常に簡単-受け入れ状態の受け入れを入れ替える)後、を使用して交差オートマトン(たとえば、製品構成を含む)を構築し、受け入れ状態へのパスを見つけることによって空性をチェックします。L(N)L(D)DN

しかし、逆の方向は、これがなぜあなたを助けないかを示します。かどうかを確認するには、を補う必要があります。ただし、NFAを補完するには、まずNFAをDFAに変換して、アイデア全体を無意味にする必要があります。L(D)L(N)N

基本的に、あなたの質問の問題ははるかに深いものです。自分(未定義の計算モデル)が適切に定義されたアルゴリズムを適切に実行したことを確認したいとします。したがって、これは実際にはコンピュータサイエンスの問題ではありません。

私はこれを言うだろう:私は提案構造を以下、結論するのは難しいではないでの長さの単語があるときに限りがほとんど(の状態の数であります)一方では受け入れられ、他方では受け入れられない。したがって、この長さまでのすべての単語を試すことができます。2 2 n n NL(D)L(N)22nnN


よく考えられた返事をありがとう。今日は新しいことを学びました。私の最善の策は、私の仕事をJFLAPと比較することです。
IAmOnStackExchange

2
NFAが大きい(7〜8州を超えるなど)場合を除いて、最善の方法はおそらく自分自身を注意深くチェックすることです。通常、到達不可能な状態を削除すると、小さなDFAが得られ、手動でのチェックはそれほど難しくありません。
Shaull、2015

1
両方のマシンを特定して最小化し、2つのマシンが同型であるかどうかを確認できませんか?
saadtaame

5

続行する1つの方法は、NFAをDFAに変換してから、線形アルゴリズム[1]がある2つのDFAの同等性を確認することです。

次のペーパーでは、2つのNFAが同等である、より一般的なケースを扱います(もちろん、ケースにも当てはまります)。

Filippo Bonchi、Damien Pous、合同までのバイシミュレーションによるNFAの同等性のチェック 、プログラミング言語の原則(POPL)、2013年1月、ローマ、イタリア。ACM、pp.457-468、2013。

要約。非決定性有限オートマトンの言語等価性を証明する手法として、合同までのバイシミュレーションを紹介します。この手法を利用して、HopcroftとKarpによる古典的なアルゴリズムの最適化を考案しました[1]。アプローチを最近導入されたアンチチェーンアルゴリズムと比較し、2つの基礎となる共帰証明法を分析して関連付けます。アンチチェーンに対して指数関数的に改善する具体例を示します。さらに、実験結果は無視できないほどの改善を示しています。

[1] JE HopcroftおよびRM Karp。有限オートマトンの等価性をテストするための線形アルゴリズム。TR 114、コーネル大学、1971年12月。

結果のCoq証明スクリプト、実装へのリンク、および対話型アプレットを含む、このペーパーのWeb付録も参照してください。


続行する1つの方法は、NFAをDFAに変換することです。ポスターの目的は、そのアルゴリズムの結果を検証することです。2回適用することは確かに1つの方法ですが、アルゴリズムの誤解を免れることはできません。それがおそらくチェック方法が求められた理由です。
AProgrammer

2
@aprogrammer私の答えの主要部分は、Coq証明スクリプトが利用可能なアルゴリズムへの参照です。これは、私が考えることができる最も安全なチェック方法です。
J.-E.

1
NFAからDFAへのような単純なアルゴリズムの彼の理解について誰かがCoq証明スクリプトで何をするのかわからない。これは、3年生の数学の問題を解決するために代数を使用しているように見えます。
AProgrammer

0

この質問は、理論的な質問というよりは、実際に適用されたソフトウェアのテストと正確性の検証についてです。

  • 交差と補数(および空のDFA言語)を計算する他のコードがある場合は、とが両方とも空であるという考え方を使用できます。ここで、は補数。 D 2¯ D 1 ˉ DD1D2¯D2D1¯D¯

  • 結果を検証するためにテストされた、以前にテストされたソフトウェアに依存できます。例:AT&T FSMライブラリ

  • 別のアイデア:ランダム化されたテスト。言語内でランダムな文字列を選択します。文字列がDFA / NFAによって受け入れられるかどうかを決定します。2つが等しくない場合、高い確率で一致しない文字列が見つかります。

  • 別のアイデア:DFAとNFAのすべてのブランチを特定の深さまでトラバースし、不一致を探すコードを記述できます。これは、指定された長さの受け入れ可能なすべての文字列を列挙することと同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.