1

本を読んでいる間、私はこの疑問を抱きました。

それはそれについて言及しています

L = {s∈(0 + 1)* | n0(s)mod 7 = n1(s)mod5 = 0}は通常ですここで、n0(s)= sの0の数、n1(s)=sの1の数

さらにそれはそれを述べています

L = {s∈(0 + 1)* | d(s)mod 5 = 2およびd(s)mod 7!= 4}は規則的ではありません(文脈自由ではありませんが、再帰的です)。ここで、d(s)= sの10進値(例:d(101)= 5)

なんでそうなの?DFAにsの10進値を格納(記憶)するためのメモリがないためですか?しかし、その場合、どうして第一言語が規則的になるのでしょうか?

4

1 に答える 1

4

教科書に間違いがあるか、読み間違えています。あなたが名前を挙げた第二言語は普通です。

DFAは、 m(任意のm )を法とする2進数(または任意の基数)の値を計算できます。単純に、0からm -1までの番号が付けられたm個の状態があります。ゼロを読み取るときは、現在の状態sから(s * 2)modm移動します。1つを読むときは、(s * 2 + 1)modm移動します。これが機能することを確認するには、バイナリがどのように機能するか、および(a + b)mod m =(a mod m + b mod m)mod m(および乗算の場合も同様)を確認するだけで済みます。

k mod mに等しい数を受け入れるには、kを受け入れ状態にします。k mod mとは異なる数を受け入れるには、他のすべての状態を受け入れます。これは、{s∈{0,1} * | d(s)mod 5=2}および{s∈{0,1}*| d(s)mod 7!=4}は両方とも正規言語です。言語Lはそれらの共通部分であり、正規言語は共通部分の下で閉じられているため、Lは正規です。

言語{s∈{0,1}*| d(s)mod 5 =2}は正規表現で受け入れられます'(((0 * 10(10 * 10)* 10 * 11 | 0 * 11)((00 | 1)(10 * 10)* 10 * 11 | 01)*(00 | 1)(10 * 10)* 0 | 0 * 10(10 * 10)* 0)(0((00 | 1)(10 * 10)* 10 * 11 | 01)* (00 | 1)(10 * 10)* 0 | 1)* 0((00 | 1)(10 * 10)* 10 * 11 | 01)*(00 | 1)(10 * 10)* |(0 * 10(10 * 10)* 10 * 11 | 0 * 11)((00 | 1)(10 * 10)* 10 * 11 | 01)*(00 | 1)(10 * 10)* | 0 * 10 (10 * 10)*)$'(ここではPython表記を使用しましたが、表記を取得するには、|を+に置き換え、$を削除するだけです)。

于 2011-11-07T22:03:33.287 に答える