DFA、Aが与えられた場合、L(A)がAが受け入れる単語数を示すものとします。L(A)を計算するのは簡単だと思います。Aのエンコーディングを正規表現に変換します。クリーネの星が式のどこかに現れる場合-言語は無限です。それ以外の場合:式を使用して作成できるすべての単語の組み合わせを調べて数えます(基本的に、式に+演算子がある場合は、有効な単語の量に+で接続された文字列の量を掛けます。)
これは間違っていますか?前もって感謝します
DFA、Aが与えられた場合、L(A)がAが受け入れる単語数を示すものとします。L(A)を計算するのは簡単だと思います。Aのエンコーディングを正規表現に変換します。クリーネの星が式のどこかに現れる場合-言語は無限です。それ以外の場合:式を使用して作成できるすべての単語の組み合わせを調べて数えます(基本的に、式に+演算子がある場合は、有効な単語の量に+で接続された文字列の量を掛けます。)
これは間違っていますか?前もって感謝します
回答:
ええ、あいまいさのため、これは間違っています。
次の言語について考えてみましょう: 。
あなたの方法では、我々は4ワード、参照、A 、A 、。しかし、重複があります!特定の正規表現内で同じ単語を作成する方法は複数あります。
より良い方法は、「デッド」状態のない、言語の最小限のDFAで動的プログラミングを使用することです。最小DFAが循環的である場合、言語は無限であるため、循環はないと想定できます。確定性とは、各単語に対してDFAを通るパスが1つしかないため、DFAを使用することが重要です。
あなたがすることは、与えられた状態で終わる単語の数の繰り返しを構築することです:
単語の総数は、各最終状態で終了する単語の数の合計になります。
jmiteの答えを補足すると、「転送マトリックス」メソッドを使用して、通常の言語で単語数を計算することはそれほど難しくありません。これはjmiteの動的プログラミングと同じですが、この手法には漸近列挙などのアプリケーションがさらにあります。
DFAを指定して、行列M(Qは状態のセット)を作成します。ここで、M (i 、j )は、DFAを状態jから状態iに移動させる文字の数です。ましょう1 、Q 0及び1 Fは、初期状態に対するそれぞれ受容状態、の指標です。最後に、n = | Q | 。
長さの単語の数はc m:= 1 F M m 1 q 0です。計算C 、M用の0 ≤ M < 2 N。もしC N + ⋯ + C 2 N - 1 > 0、次いでDFAによって受け入れ言語は無限です。それ以外の場合、言語の単語数はc 0 + ⋯ + c n − 1です。
(べき乗を計算する場合、mの指数関数であるエントリの大きさについて注意する必要があります。それらのサイズは多項式だけなので、結果のアルゴリズムは多項式時間で実行されます。)
実際には、クリーネの星を含む明確な正規表現のカウント式を引き続き導出できます。
:正規表現の誘導定義として考えると
次の翻訳を検討してください正規表現を使用して、それを複素数値有理関数に変換します。
この変換がで構造的帰納を行うことにより有理式を返すことを示すことができ、右側で使用されるすべての演算が有理性を保持することに注意してください。
入力した正規表現が明確であるとすると、[で表される有理関数が実際には、基礎となる言語によって受け入れられる単語の家族のための生成機能である Eは、その長さによってランク付け。
例えば、言語検討のランの言語定義、で区切らBを。さて、この正規表現は明確であるため、翻訳トリックを実行できます。
結局のところ、上記の生成関数を考えると、その係数抽出は ここで、 δ(n)={ n = 0の場合は1 、 それ以外の場合は0
実際、私たちの翻訳有理関数を生成します。部分分数分解を使用して、明確な正規表現の列挙式を作成できます。
既約有理関数
In fact, the partial fraction decomposition generalize to multivariate rational functions, so you can actually construct counting formulas for queries such as "How many words are there where there are a
s and b
s?"
Unfortunately, the extent to which this method will be useful ends when you have an ambiguous expression.