計算の理論 I
ー正則表現とFAの等価性 その2ー
月曜3校時
大月 美佳
連絡事項
自転車がまだ散乱してますね
今日の講義内容
1. 前回のミニテスト
1. ミニテストの解答例
2. 正則表現からDFAまで変換してみる
3. 今日の新しいこと
1. 正則表現とFAの等価性 つづき
1. 正則表現からのε-動作を含むNFAの作り方
→ 例2.12 (p. 42)
2. DFAからの正則表現の作り方
→ 例2.13 (p. 45)
前回のミニテスト
(演習問題 2.12, p. 66)
次の正則表現と同値な有限オートマトンを
構成せよ。
a) 10+(0+11)0*1
1. 括弧でくくってみる
((10)+(((0+(11))(0*))1) : 左優先
((10)+((0+(11))((0*)1)) : 右優先
構文木
((10)+(((0+11)(0*))1)
((10)+((0+11)((0*)1))
+
+
連接
1
連接
連接
0
+
0
1
1
連接
1
0
連接
0
+
0
連接
*
連接
1
連接
1
1
*
0
1
最初の組合せで考えてみる
r
+
r1
連接
r3
1
r2
0
連接
r5
r4
連接
r7
r9
0
1
+
* r8
r10
連接
0
r12 1
1 r13
r6
r11
式の分解
r
+
r1
連接
r3
1
0
r2
連接
r5
r4
連接
r7
r9
0
r12
1
+
* r8
r10
連接
0
1
1
r6
r13
r11
r=r1+r2
r1 =r3r4
r2 =r5r6
r3 =1
r4 =0
r5 =r7r8
r6 =1
r7 =r9 + r10
r8 =r11*
r9 =0
r10 =r12r13
r11 =0
r12 =1
r13 =1
どんどん変換していこう
1
r
r12
+
r1
連接
r3
1
0
r2
連接
r5
r4
連接
r7
r9
0
r12
* r8
r10
連接
0
1
1
1
q1
1
q2
q3
q4
r6
1
+
r13
開始
開始
r11
連接
r13
r10
ε
1
q1
開始
q2
1
q3
q4
どんどん変換していこう
2
r10
r9
q5
q1
q6
q2
1
q3
q4
開始
開始
r
ε
1
0
+
r1
連接
r3
1
0
r2
連接
r5
r4
連接
r7
r9
r12
1
r6
1
r7
* r8
+
r10
連接
0
+
1
0
r13
ε
r11
q7
開始
ε
q5
q2
ε
q6
q8
ε
1
q1
0
1
q3
q4
ε
どんどん変換していこう
3
r
r11
+
r1
連接
r3
1
0
r2
連接
r5
r4
連接
r7
r9
0
r12
* r8
r10
連接
0
1
q10
r6
1
+
1
0
q9
開始
r11
*
r13
r8
ε
ε
開始
q11
ε
0
q9
q10
ε
q12
どんどん変換していこう
4
r7
ε
q7
ε
q5
q2
ε
q8
q11
1
q3
q4
ε
開始
ε
q6
ε
1
q1
0
r8
ε
0
q9
ε
q10
q12
ε
開始
連接
ε
q7
開始
ε
q5
r5
q2
ε
q6
ε
ε
q8
ε
1
q1
0
ε
q11
q9
q10
1
q3
q4
ε
ε
0
ε
q12
どんどん変換していこう
5
ε
q7
0
q5
q1
1
q13
q8
q3
ε
q4
ε
開始
連接
ε
ε
q11
ε
0
q9
q14
1
q2
開始
r6
ε
q6
ε
1
ε
r5
q10
r2
q12
ε
ε
q7
ε
q5
0
q8
ε
1
q1
1
q2
開始
ε
q6
q3
ε
q4
ε
ε
q11
q9
ε
ε
0
q10
ε
q12
1
q13
q14
どんどん変換していこう
6
r
r3
+
r1
連接
r3
1
0
r2
連接
r5
r4
連接
r7
r9
0
r12
* r8
r10
連接
0
1
1
1
q15
0
q16
q17
q18
r6
1
+
r4
開始
開始
r11
連接
r13
r1
ε
1
q15
開始
q16
1
q17
q18
これで(やっと)完成!
r1
ε
1
r
q15
ε
q19
開始
r2
ε
q7
ε
1
q16
ε
q5
q17
q1
ε
q20
0
ε
q6
q8
ε
1
q18
1
q2
q3
ε
q4
ε
ε
ε
q11
q9
ε
ε
0
q10
ε
q12
1
q13
q14
オートマトンとして真面目に書く
δ
M(Q, {0, 1}, δ, q19,
{q20})
Q={q1, q2, q3, q4, q5,
q6, q7, q8, q9, q10,
q11, q12, q13, q14, q15,
q16, q17, q18, q19,
q20}
δ は右表
0
1
ε
q1
-
q2
-
q2
-
-
q3
q3
-
q4
-
q4
-
-
q8
q5
q6
-
-
q6
-
-
q8
q7
-
-
q1 , q 5
q8
-
-
q11
q9
q10
-
-
q10
-
-
q9 , q12
q11
-
-
q13
q12
-
-
q13
q13
-
q14
-
q14
-
-
q20
q15
-
q16
q16
-
-
q17
-
q18
q18
-
-
q20
q19
-
-
q7 , q15
q20
-
-
-
q17
ε
-
前回の例2.12の表記
q0
ε
q1
ε
q3
q2
1
0
q9
ε
q4
ε
ε
ε
q5
ε
q6
1 q7 ε
q8
ε
M(Q, {0, 1}, δ, q0, {q9})
Q={q1, q2, q3, q4, q5,
q6, q7, q8, q9}
δ は右表
δ
0
1
ε
q0
-
-
{q1 }
q1
-
{q2 }
-
q2
-
-
{q9 }
q3
{q4 }
-
-
q4
-
-
{q5 }
q5
-
-
{q6 ,
q8}
q6
-
{q7 }
-
q7
-
-
{q7,
q8}
q8
-
-
{q9 }
q9
-
-
-
εありNFAから
εなしNFAを生成してみる
q0
開始
ε
q1
ε
q3
q2
1
0
q9
ε
q4
ε
ε
ε
q5
ε
q6
1 q7 ε
q8
ε
ε-CLOSURE(q1)={q1}
ε-CLOSURE(q2)={q2 , q9}
ε-CLOSURE(q3)={q3}
ε-CLOSURE(q4)={q4 , q5 , q6 , q8 , q9}
- CLOSUREが Fの元を含むとき
F {q0 }
F
そう でないとき
F
(q, a) ˆ (q, a) (q Q, a )
ˆ (q , a) CLOSURE( (ˆ (q , ), a))
i
ε-CLOSURE(q0)={q0, q1, q3}
i
ˆ (qi , ) CLOSURE(qi )
ˆ (qi , a) CLOSURE( ( CLOSURE(qi ), a))
ε-CLOSURE(q5)={q5 , q6 , q8 , q9}
ε-CLOSURE(q6)={q6 }
ε-CLOSURE(q7)={q7 , q6 , q8 , q9}
ε-CLOSURE(q8)={q8 , q9}
ε-CLOSURE(q9)={q9}
δ´を求める
q0について
(qi , a) ˆ (qi , a) CLOSURE( ( CLOSURE(qi ), a))
ˆ (q0 ,0) CLOSURE( ( CLOSURE(q0 ),0))
CLOSURE( ({q0 , q1 , q3},0))
CLOSURE( (q0 ,0) (q1 ,0) (q3 ,0))
CLOSURE(○○{q4 })
CLOSURE(q4 ) {q4 , q5 , q6 , q8 , q9 }
ˆ (q0 ,1) CLOSURE( ( CLOSURE(q0 ),1))
CLOSURE( ({q0 , q1 , q3},1))
CLOSURE( (q0 ,1) (q1 ,1) (q3 ,1))
CLOSURE(○{q2 } ○)
CLOSURE(q2 ) {q2 , q9 }
δ´を求める
q1について
(qi , a) ˆ (qi , a) CLOSURE( ( CLOSURE(qi ), a))
ˆ (q1 ,0) CLOSURE( ( CLOSURE(q1 ),0))
CLOSURE( ({q1},0))
CLOSURE( (q1 ,0))
CLOSURE(○)
○
ˆ (q1 ,1) CLOSURE( ( CLOSURE(q1 ),1))
CLOSURE( ({q1},1))
CLOSURE( (q1 ,1))
CLOSURE({q2 })
CLOSURE(q2 ) {q2 , q9 }
δ´を求める
q2について
(qi , a ) ˆ (qi , a ) CLOSURE( ( CLOSURE(qi ), a ))
ˆ (q2 ,0) CLOSURE( ( CLOSURE(q2 ),0))
CLOSURE( ({q2 , q9 },0))
CLOSURE( (q2 ,0) (q9 ,0))
CLOSURE(○○)
CLOSURE(○) ○
ˆ (q2 ,1) CLOSURE( ( CLOSURE(q2 ),1))
CLOSURE( ({q2 , q9 },1))
CLOSURE( (q2 ,1) (q9 ,1))
CLOSURE(○○)
CLOSURE(○) ○
δ´を求める
q3について
(qi , a) ˆ (qi , a) CLOSURE( ( CLOSURE(qi ), a))
ˆ (q3 ,0) CLOSURE( ( CLOSURE(q3 ),0))
CLOSURE( ({q3},0))
CLOSURE( (q3 ,0))
CLOSURE({q4 })
CLOSURE(q4 ) {q4 , q5 , q6 , q8 , q9 }
ˆ (q3 ,1) CLOSURE( ( CLOSURE(q3 ),1))
CLOSURE( ({q3},1))
CLOSURE( (q3 ,1))
CLOSURE(○)
○
δ´を求める
q4について
(qi , a) ˆ (qi , a) CLOSURE( ( CLOSURE(qi ), a))
ˆ (q4 ,0) CLOSURE( ( CLOSURE(q4 ),0))
CLOSURE( ({q4 , q5 , q6 , q8 , q9 },0))
CLOSURE( (q4 ,0) (q5 ,0) (q6 ,0) (q8 ,0) (q9 ,0))
CLOSURE(○○○○○)
CLOSURE(○) ○
ˆ (q4 ,1) CLOSURE( ( CLOSURE(q4 ),1))
CLOSURE( ({q4 , q5 , q6 , q8 , q9 },1))
CLOSURE( (q4 ,1) (q5 ,1) (q6 ,1) (q8 ,1) (q9 ,1))
CLOSURE(○○{q7 } ○○)
CLOSURE(q7 ) {q7 , q6 , q8 , q9 }
δ´を求める
q5について
(qi , a) ˆ (qi , a) CLOSURE( ( CLOSURE(qi ), a))
ˆ (q5 ,0) CLOSURE( ( CLOSURE(q5 ),0))
CLOSURE( ({q5 , q6 , q8 , q9 },0))
CLOSURE( (q5 ,0) (q6 ,0) (q8 ,0) (q9 ,0))
CLOSURE(○○○○)
CLOSURE(○) ○
ˆ (q5 ,1) CLOSURE( ( CLOSURE(q5 ),1))
CLOSURE( ({q5 , q6 , q8 , q9 },1))
CLOSURE( (q5 ,1) (q6 ,1) (q8 ,1) (q9 ,1))
CLOSURE(○{q7 } ○○)
CLOSURE(q7 ) {q6 , q7 , q8 , q9 }
δ´を求める
q6について
(qi , a) ˆ (qi , a) CLOSURE( ( CLOSURE(qi ), a))
ˆ (q6 ,0) CLOSURE( ( CLOSURE(q6 ),0))
CLOSURE( ({q6 },0))
CLOSURE( (q6 ,0))
CLOSURE(○)
○
ˆ (q6 ,1) CLOSURE( ( CLOSURE(q6 ),1))
CLOSURE( ({q6 },1))
CLOSURE( (q6 ,1))
CLOSURE(q7 )
{q6 , q7 , q8 , q9 }
δ´を求める
q7について
(qi , a) ˆ (qi , a) CLOSURE( ( CLOSURE(qi ), a))
ˆ (q7 ,0) CLOSURE( ( CLOSURE(q7 ),0))
CLOSURE( ({q6 , q7 , q8 , q9 },0))
CLOSURE( (q6 ,0) (q7 ,0) (q8 ,0) (q9 ,0))
CLOSURE(○○○○)
CLOSURE(○) ○
ˆ (q7 ,1) CLOSURE( ( CLOSURE(q7 ),1))
CLOSURE( ({q6 , q7 , q8 , q9 },1))
CLOSURE( (q6 ,1) (q7 ,1) (q8 ,1) (q9 ,1))
CLOSURE({q7 } ○○○)
CLOSURE(q7 ) {q6 , q7 , q8 , q9 }
δ´を求める
q8について
(qi , a) ˆ (qi , a) CLOSURE( ( CLOSURE(qi ), a))
ˆ (q8 ,0) CLOSURE( ( CLOSURE(q8 ),0))
CLOSURE( ({q8 , q9 },0))
CLOSURE( (q8 ,0) (q9 ,0))
CLOSURE(○○)
CLOSURE(○) ○
ˆ (q8 ,1) CLOSURE( ( CLOSURE(q8 ),1))
CLOSURE( ({q8 , q9 },1))
CLOSURE( (q8 ,1) (q9 ,1))
CLOSURE(○○)
CLOSURE(○) ○
δ´を求める
q9について
(qi , a) ˆ (qi , a) CLOSURE( ( CLOSURE(qi ), a))
ˆ (q9 ,0) CLOSURE( ( CLOSURE(q9 ),0))
CLOSURE( ({q9 },0))
CLOSURE( (q9 ,0))
CLOSURE(○)
○
ˆ (q9 ,1) CLOSURE( ( CLOSURE(q9 ),1))
CLOSURE( ({q9 },1))
CLOSURE( (q9 ,1))
CLOSURE(○)
○
生成されたNFA
δ´
M´(Q´, {0,1},δ´,q0,{q9})
Q´={q0, q1, q2, q3, q4, q5, q6, q7,
q8, q9}
δ ´は右表
0
1
q0
{q4 , q5 , q6 , q8 , q9}
{q2 , q9}
q1
-
{q2 , q9}
q2
-
-
q3
{q4 , q5 , q6 , q8 , q9}
-
q4
-
{q6 , q7 , q8 , q9}
q5
-
{q6 , q7 , q8 , q9}
q6
-
{q6 , q7 , q8 , q9}
q7
-
{q6 , q7 , q8 , q9}
q8
-
-
q9
-
-
さらにDFAへ変換してみる
δ´
δ´´
0
1
0
1
q0
{q4 , q5 , q6 , q8 ,
q9}
{q2 , q9}
[q0 ]
[q4 , q5 , q6 , q8 , q9]
[q2 , q9]
q1
-
{q2 , q9}
[q4 , q5 , q6 , q8 ,
q9]
-
[q6 , q7 , q8 , q9]
q2
-
-
[q2 , q9]
-
-
q3
{q4 , q5 , q6 , q8 ,
q9}
-
[q6 , q7 , q8 , q9]
-
[q6 , q7 , q8 , q9]
q4
-
{q6 , q7 , q8 ,
q9}
q5
-
{q6 , q7 , q8 ,
q9}
q6
-
{q6 , q7 , q8 ,
q9}
q7
-
{q6 , q7 , q8 ,
q9}
q8
-
-
q9
-
-
M´´ (Q´´, {0,1},δ´´,[q0 ],F)
Q´´={[q0 ], [q4, q5, q6, q8, q9 ],
[q2, q9 ], [q6, q7, q8, q9 ]}
δ´´は上表
F= {[q4, q5, q6, q8, q9 ], [q2, q9 ],
[q6, q7, q8, q9 ]}
もとの正則表現と比べてみる
δ´´
[q2 , q9]
0
1
[q0 ]
[q4 , q5 , q6 , q8 , q9]
[q2 , q9]
[q4 , q5 , q6 , q8 ,
q9]
-
[q6 , q7 , q8 , q9]
[q2 , q9]
-
-
[q6 , q7 , q8 , q9]
-
[q6 , q7 , q8 , q9]
1
[q0 ]
0
[q4 ,q5 ,q6 ,q8 ,q9]
1
開始
[q4 ,q5 ,q6 ,q8 ,q9]
1
01*+1
今日の新しいこと
1. 正則表現とFAの等価性
NFA
ε-動作を含む
NFA
DFA
正則表現
1.
正則表現からのε-動作を含むNFAの作り方
先週やった
→NFAの生成例 (例2.12, p. 42)
2.
DFAからの正則表現の作り方
→正則表現の生成例 (例2.13, p. 45)
DFAからの正則表現の作り方
考え方
1.ある状態からある状態の間の状態を0か
らひとつずつ増やしていって、
2.途中の状態の任意の組からなる道が生
成することのできる文字列の正則表現を
再帰的に拡張していき、
3.最後に、初期状態から最終状態への道が
生成できる文字列の正則表現を求める。
状態を増やしていくとは?
q1
…
qn
…
q1
qs
k=2
qn
qn
…
qe
k=0
…
q1
qn
q1
q2
qs
qe
k=1
qs
qs
qe
qe
k=n
Rijk Rikk 1 ( Rkkk 1*)Rkjk 1 Rijk 1 (k 1)
0
Rij {a | (qi , a ) q j } { } (i jのとき )
0
Rij {a | (qi , a ) q j } (i jのとき )
正則表現の式との対応
Rijk Rikk 1 ( Rkkk 1*)R kjk1 Rijk 1 (k 1)
0
Rij {a | (qi , a ) q j } { } (i jのとき )
0
Rij {a | (qi , a ) q j } (i jのとき )
↓ 証明はp.44~45
rijk rikk 1 (rkkk 1*)rkjk 1 rijk 1 (k 1)
0
rij a (i jのとき )
0
rij a (i jのとき )
正則表現の生成例
(例2.13, p. 45)
1
0
q1
0
1
q2
0,1
開始
δ
q3
r110 {a | (q1 , a ) q1}
(1 1)
r120 {a | (q1 , a ) q2 } 0
(1 2)
r130 {a | (q1 , a ) q3 } 1
(1 3)
r210 {a | (q2 , a ) q1} 0
(2 1)
r220 {a | (q2 , a ) q2 }
( 2 2)
0
1
q1
q2
q3
r230 {a | (q2 , a ) q3 } 1
(2 3)
q2
q1
q3
r310 {a | (q3 , a ) q1} ○
(3 1)
q3
q2
q2
r320 {a | (q3 , a ) q2 } 0 1
(3 2)
r330 {a | (q3 , a ) q3 }
(3 3)
どんどん進める
1
k=1
r r (r *)r r ( *)
1
11
0
11
0
11
0
11
0
11
0
q1
開始
r121 r110 (r110 *)r120 r120 ( *)0 0 0 0 0
r131 r110 (r110 *)r130 r130 ( *)1 1 1 1 1
r211 r210 (r110 *)r110 r210 0( *) 0 0 0 0
r221 r210 (r110 *)r120 r220 0( *)0 00
r231 r210 (r110 *)r130 r230 0( *)1 1 01 1
r311 r310 (r110 *)r110 r310 ○( *) ○○
r321 r310 (r110 *)r120 r320 ○( *)0 0 1 0 1
r331 r310 (r110 *)r130 r330 ○( *)1
0
1
q2
0,1
q3
どんどん進める
k=2
1
0
q1
r112 r121 (r221 *)r211 r111 0((00 )*)0 0(00) * 0 (00) * 開始
r122 r121 (r221 *)r221 r121 0((00 )*)(00 ) 0 0(00) * 0 0(00) *
r132 r121 (r221 *)r231 r131 0((00 )*)(01 1) 1 0(00) * (0 )1 1
00*1 1 0 *1
r212 r221 (r221 *)r211 r211 (00 )((00 )*)0 0 (00) * 0 0 (00) * 0
r222 r221 (r221 *)r221 r221 (00 )((00 )*)(00 ) (00 )
(00) * 00 (00) *
r232 r221 (r221 *)r231 r231 (00 )((00 )*)(01 1) (01 1)
(00) * (0 )1 01 1 0 *1 01 1 0 *1
r312 r321 (r221 *)r211 r311 (0 1)((00 )*)0 ○ (0 1)(00) * 0
r322 r321 (r221 *)r221 r321 (0 1)((00 )*)(00 ) (0 1)
(0 1)(00) * (0 1) (0 1)(00) *
r332 r321 (r221 *)r231 r331 (0 1)((00 )*)(01 1)
(0 1)(00) * (01 1) (0 1)(00) * (0 )1 (0 1)0 *1
0
1
q2
0,1
q3
最終状態への道
1
k=3
r r (r *)r r
3
12
2
13
2
33
2
32
2
12
(0 *1)(((0 1)0 *1 )*)(0 1)(00) * 0(00) *
0 *1((0 1)0 *1) * (0 1)(00) * 0(00) *
0
q1
0
1
q2
0,1
q3
開始
r133 r132 (r332 *)r332 r132
0 *1(((0 1)0 *1 )*)((0 1)0 *1 ) (0 *1)
0 *1((0 1)0 *1) * ((0 1)0 *1 ) 0 *1
0 *1((0 1)0 *1) *
r123 r133 0 *1((0 1)0 *1) * (0 1)(00) * (00) * 0 *1((0 1)0 *1) *
0 *1((0 1)0 *1) * ((0 1)(00) * ) 0(00) *
今日のミニテスト
ミニテスト
– 演習問題 2.13のa
– 教科書・資料を見ても良い
資料、ミニテストがない人は前へ
提出したら帰って良し
次回
– 3章いきます。反復補題。
© Copyright 2026 ExpyDoc