Post on 04-Mar-2020
第2回 形式言語理論の基礎
広島大学工学部第二類
藤田 聡
今日の授業内容
• 「言語」とは?
• 「文法」とは?
• 「文法による言語の導出」とは?
• 「言語」はプログラミング言語に対応
• 「文法」は構文規則に対応
• 「導出」とは、構文チェックに対応(逆方向)
形式言語理論とは?
プログラム言語などの人工言語を機械的に取り扱うための基礎となる理論
文法規則や言語を受理するための抽象機械(解析プログラムそのもの)を通して言語を取り扱う
チョムスキーによって50年代から60年代にかけて基礎がつくられた(もともとの目的は自然言語理解のためのプログラムを作成すること)
基本となる概念
• アルファベット:記号の集合
• 語:記号の列
• 言語:語の集合
• 文法
Please be quiet !
Quiet please be !
英文は、26文字のアルファベットで表現される
アルファベットをどういう順に並べてもよいわけではない
いろいろなアルファベット
V = { 0,1 } 機械語のアルファベット
V = { a,b,c,..., Z } 英語のアルファベット
V = { A,B,C,..., H,♯,♭} 音階のアルファベット
V = { A,2,3,..., 10,J,Q,K } トランプのアルファベット
V中の要素の列が語(word)や文(sentence)に対応する
アルファベット上の言語(language)
• V上の語全体の集合をV+であらわし、V
*=V
+∪{ε}と
する(εを空列とよぶ)
– たとえば V={0,1}のときV+={0,1,00,01,…}であり、
V*={ε,0,1,00,01,…}である
• アルファベットV上の言語Lとは、V*の任意の部分集合
のことである
– 抽象的ではあるがかなり一般的な定義になっている
例0
以下はいずれも{0,1}上の言語
• 0を偶数個ならべてできる語の集合L1
• 0と1を同じ数だけ含む語の集合L2
• 1を素数個含むような語の集合L3
• C言語プログラムをコンパイルして得られるPentiumの機械語プログラムの集合
例0
0 1
00 01 10 11
000 001 010 011
100 101 110 111
0000 0001 0010 0011
0100 0101 0110 0111
1000 1001 1010 1011
1100 1101 1110 1111… V上の語全体の集合
例0 (言語L1)
0 1
00 01 10 11
000 001 010 011
100 101 110 111
0000 0001 0010 0011
0100 0101 0110 0111
1000 1001 1010 1011
1100 1101 1110 1111… 言語L1
例0 (言語L2)
0 1
00 01 10 11
000 001 010 011
100 101 110 111
0000 0001 0010 0011
0100 0101 0110 0111
1000 1001 1010 1011
1100 1101 1110 1111… 言語L2
文法(grammar)とは?
• (形式)言語をひとつ具体的に規定する方法
• 文法は四つ組G=(T,N,P,S)で定義される
T: 終端記号の集合 (⊆V)
N: 非終端記号の集合 (T∩N=φ)
P: 生成規則の集合(生成規則は x→y の形)
S: 出発記号
例1
アルファベットV = {a}上の文法の例
T={a}, N={E,F},
P={ E→F, F→a, F→aF }, S=E
導出とは?(1)
u,v∈(T∪N)*とする(εもO.K.)
• 1ステップ導出(one-step derivation) u→vとは、
u = msn, v = mtn, s→t ∈ P
であること。ただしm,n ∈(T∪N)* (εもO.K.)
uの中のsが、規則「s→t」によってtに書き換えられる
導出とは?(2)
u,v∈(T∪N)* とする(εもO.K.)
• 導出(derivation) u →v とは、u1, u2, …, un-1 ∈(T∪N)*
があり、u = u0 → u1 → … → un-1 → un = v となること(n≧0)
• n = 0 のときu →u
vu ⎯→⎯*
*
*
文法によって生成される言語
文法G=(T,N,P,S)が生成する言語L(G)は、
L(G) = { x ∈ T*
| S → x }
で定義される 出発記号から導出される語全体の集合
*
例1(つづき)
A={a}, N={E,F}, P={E→F, F→a, F→aF}
E→F→a
E→F→aF→aa
E→F→aF→aaF→aaa
⇒ この文法によって生成される言語はL1 = { a,aa,aaa,aaaa,… } (= A+)
例2
T={a}, N={E,F}, P={E→F, F→aa, F→aaF}
E→F→aa
E→F→aaF→aaaa
E→F→aaF→aaaaF→aaaaaa
⇒ この文法によって生成される言語はL2 = { aa,aaaa,aaaaaa, … }
(長さが偶数のもののみがつくられる)
例3
T={a,b}, N={E,F}, P={E→F, F→ab, F→aFb}
E→F→ab
E→F→aFb→aabb
E→F→aFb→aaFbb→aaabbb
⇒ この文法によって生成される言語はL3 = { ab,aabb,aaabbb, … }
例4(1)
T = { a,b,c,+,*,(,) }, N = { E,Y,F,I }
P = { E→E+Y, E→Y, Y→Y*F, Y→F, F→(E), F→I, I→a, I→b, I→c }
⇒ この文法で生成される言語は
a,b,c上の加算と乗算の式
例4(2)
• 規則の意図は以下の通り:
– YはいつでもFでおきかえられる;
– FはいつでもIあるいは(E)でおきかえられる;
– Iはいつでもa,bあるいはcとおきかえられる。
E → E+Y → E+Y+Y → … (和項の列)
E → Y → Y*F → Y*F*F → … (積項の列)
F → (E) (ネストの表現)
例4(3)
• もっとシンプルな文法で記述できないか? (⇒演習)
• ただしこの文法ではa+b*c という語も生成される
• (演算の優先順位も考慮してある)ことに注意
導出の道筋について
• つねに最も左にある非終端記号を置き換えるとき最左導出
• つねに最も右にある非終端記号を置き換えるとき最右導出
導出の道筋が唯一である文法も存在する
– たとえばa+を生成する正規文法 S→T, T→aT, T→a
最左導出(leftmost derivation)
E →T →T*F →F*F
→I*F →a*F →a*(E)
→a*(E+T) →a*(T+T)
→a*(F+T) →a*(I+T)
→a*(b+T) →a*(b+F)
→a*(b+I) →a*(b+c)
最右導出(rightmost derivation)
E→ T→ T*F →T*(E)
→T*(E+T) →T*(E+F)
→T*(E+I) →T*(E+c)
→T*(T+c) →T*(F+c)
→T*(I+c) →T*(b+c)
→F*(b+c) →I*(b+c)
→a*(b+c)
生成規則による言語のクラスわけ
• タイプ0文法: s→t
s∈(T∪N)+, t∈(T∪N)
*
• タイプ1文法(文脈依存文法): mAn→mtn
m,n∈(T∪N)* , A∈N, t∈(T∪N)
+
• タイプ2文法(文脈自由文法): A→t
A∈N, t∈(T∪N)+
• タイプ3文法(正規文法): A→a or A→bB
A,B∈N, a∈T または a=ε, b∈T
クラス間の関係
• タイプ3で表現できることはタイプ2でも表現できる
• タイプ2で表現できることはタイプ1でも表現できる
• タイプ1で表現できることはタイプ0でも表現できる
タイプ0がもっとも表現能力が高く、タイプ3がもっとも表現能力が低い
文脈依存のイメージ
• 文脈依存は、ドイツ語のように定冠詞が名詞が男性名詞が女性名詞かによって変化するようなものに似ている
– 「冠詞」という非終端記号を前後の状況を無視してかってに具体的なもの(DieやDerなど)におきかえることができない
文脈自由のイメージ
• いっぽう文脈自由は、英語のようにどんな名詞であるかにかかわらず定冠詞を決められる場合に似ている
– 「冠詞」という非終端記号をその前後の状況によらずかってに具体的なもの(the)におきかえることができる
文脈自由言語(CFL)と正規言語(RL)の違い
• RGで生成できる言語はCFGでも生成できる
• CFGでは{ anbn | n≧1 }という言語を生成できるが、RGでは生成できない
– aの繰り返し回数とbの繰り返し回数が同じであることを(有限個の規則で)表現できない
⇒ CFGとRGの間には真に能力差がある
ここまでのまとめ
• 形式言語の基礎について理解した
• 最左導出と最右導出の違い
• 言語は、表現能力によってクラス分けされる
• 正規言語 → 字句解析
• 文脈自由言語 → 構文解析