[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)

本系列文章

  • 有穷自动机
  • 正则表达式
  • 上下文无关文法和下推自动机
  • 图灵机

文章目录:上下文无关文法和下推自动机

  • 1. 上下文无关文法(CFG)
    • 1. 形式化定义
    • 2. 语法分析树
    • 3. 二义性
    • 4. CFG的化简
    • 5. 乔姆斯基范式(CNF)
  • 2. 下推自动机(PDA)
    • 1. 形式化定义
    • 2. 确定的PDA
    • 3. PDA的瞬时描述
    • 4. PDA接受的语言
  • 3. CFG和PDA的等价性
    • 1. CFG ⇒ \Rightarrow PDA
    • 2. PDA ⇒ \Rightarrow CFG
  • 4. 上下文无关语言的性质
    • 1. 泵引理
    • 2. 封闭性

1. 上下文无关文法(CFG)

1. 形式化定义

上下文无关文法 (Context-Free Grammars):CFG是一个四元组,如: G = ( V , T , S , P ) G=(V,T,S,P) G=(V,T,S,P),其中

  • V V V:变元的集合,是一个有限集;(变量)
  • T T T:终结符的集合,是一个有限集,且 V ∩ T = ϕ V \cap T = \phi VT=ϕ;(值)
  • S S S:开始变元, S ∈ V S \in V SV
  • P P P:产生式的集合,是一个有穷集,其中的每个元素都有形式: A → α A \rightarrow \alpha Aα,其中 A ∈ V , α ∈ ( V ∪ T ) ∗ A \in V, \alpha \in (V \cup T)^* AV,α(VT)

派生:由产生式生成字符串的过程。

  • 最左派生:每次选取派生式的最左的变元派生替换。

  • 最右派生:每次选取派生式的最右变元派生替换。

例如: L = { a 2 n b m ∣ n ≥ 0 , m ≥ 0 } L=\{a^{2n}b^m | n \ge 0, m \ge 0 \} L={a2nbmn0,m0} 的产生式为: S → A B ,   A → ε ∣ a a A ,   B → ε ∣ B b S\rightarrow AB,\, A\rightarrow \varepsilon | aaA,\, B\rightarrow \varepsilon | Bb SAB,AεaaA,BεBb

对于字符串 w = a a b b w=aabb w=aabb 来说,派生式如下:

S ⇒ A B ⇒ a a A B ⇒ a a A B b ⇒ a a B b ⇒ a a B b b ⇒ a a b b S\Rightarrow AB \Rightarrow aaAB \Rightarrow aaABb \Rightarrow aaBb \Rightarrow aaBbb \Rightarrow aabb SABaaABaaABbaaBbaaBbbaabb

  • 最左派生: S ⇒ A B ⇒ a a A B ⇒ a a B ⇒ a a B b ⇒ a a B b b ⇒ a a b b S\Rightarrow AB\Rightarrow aaAB\Rightarrow aaB\Rightarrow aaBb\Rightarrow aaBbb \Rightarrow aabb SABaaABaaBaaBbaaBbbaabb

  • 最右派生: S ⇒ A B ⇒ A B b ⇒ A B b b ⇒ A b b ⇒ a a A b b ⇒ a a b b S\Rightarrow AB\Rightarrow ABb\Rightarrow ABbb\Rightarrow Abb\Rightarrow aaAbb\Rightarrow aabb SABABbABbbAbbaaAbbaabb

上下文无关语言 (CFL) G = ( V , T , S , P ) G=(V,T,S,P) G=(V,T,S,P) 是一个CFG,则 L ( G ) = { w    ∣    w ∈ T ∗    a n d    S ⟹ ∗ w } L(G)=\{w\;|\;w\in T^*\; and\; S \stackrel{*}{\Longrightarrow} w\} L(G)={wwTandSw}

2. 语法分析树

语法分析树 G = ( V , T , S , P ) G=(V,T,S,P) G=(V,T,S,P) 是一个CFG,一个G的语法分析树如下:

  • 每个内节点都标了一个 V V V 中的变元;
  • 每个叶节点都标了一个 T ∪ { ε } T\cup \{\varepsilon\} T{ε} 中的符号,所有被 ε 标记的叶节点都是其父节点的唯一子节点;
  • 如果一个内节点标记为A,它的子节点(从左到右)标记为 x 1 , x 2 , … , x k x_1,x_2, …, x_k x1,x2,,xk,则 A → x 1 , x 2 , … , x k ∈ P A\rightarrow x_1,x_2, …, x_k \in P Ax1,x2,,xkP

例: L = { w    ∣    w ∈ { 0 , 1 } ∗    a n d    w = w R } L=\{ w\; |\; w\in \{0,1\}^*\; and\; w = w^R \} L={ww{0,1}andw=wR} 产生式为 S → ε   ∣   0   ∣   1   ∣   0 S 0   ∣   1 S 1 S \rightarrow \varepsilon\, |\, 0\, |\, 1\, |\, 0S0\, |\, 1S1 Sε010S01S1 两个语法分析树如下:
[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)_第1张图片

3. 二义性

对于一个CFG: G = ( { E , I } , { a , b , ( , ) , + , ∗ } , E , P ) G=(\{E,I\}, \{a, b, (, ), +, *\}, E, P) G=({E,I},{a,b,(,),+,},E,P),产生式为 E → I    ∣    E + E ∣    E ∗ E    ∣    ( E ) , I → a    ∣    b E\rightarrow I\; |\; E+E |\;E*E\;|\;(E), I\rightarrow a\;|\;b EIE+EEE(E),Iab

对于字符串 w = a + a ∗ a w=a+a*a w=a+aa 的两种最左派生如下:

E ⇒ E ∗ E ⇒ E + E ∗ E ⇒ I + E ∗ E ⇒ a + E ∗ E ⇒ a + a ∗ a E ⇒ E + E ⇒ I + E ⇒ a + E ⇒ a + E ∗ E ⇒ a + a ∗ a E\Rightarrow E*E\Rightarrow E+E*E\Rightarrow I+E*E\Rightarrow a+E*E\Rightarrow a+a*a\\ E\Rightarrow E+E\Rightarrow I+E\Rightarrow a+E\Rightarrow a+E*E\Rightarrow a+a*a EEEE+EEI+EEa+EEa+aaEE+EI+Ea+Ea+EEa+aa

对应的语法分析树如下,发现一个先算的是加法,一个先算的是乘法,出现了歧义。
[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)_第2张图片

重新构造产生式以消除歧义:

先算乘法的: E → I    ∣    E + E    ∣    E ∗ E    ∣    ( E ) ,    I → a    ∣    b E\rightarrow I\; |\; E+E\; |\; E*E\; |\; (E),\; I\rightarrow a\; |\; b EIE+EEE(E),Iab

先算加法的: E → T    ∣    E + T ,    T → F    ∣    T ∗ F ,    F → I    ∣    ( E ) ,    I → a    ∣    b    ∣    I a    ∣    I b E\rightarrow T\; |\; E+T,\; T\rightarrow F\; |\; T*F,\; F\rightarrow I\; |\;(E),\; I\rightarrow a\;|\;b\;|\;Ia\;|\;Ib ETE+T,TFTF,FI(E),IabIaIb

定义同样的语言可以有多个文法,如果一个CFL的所有文法都是歧义的,那么它是固有二义性的

4. CFG的化简

  • 去掉 ε 产生式;
  • 去掉单元产生式;
  • 去掉无用的产生式;

5. 乔姆斯基范式(CNF)

乔姆斯基范式(Chomsky Normal Form):一个CFG的所有的产生式都有如下两种形式之一:

  • A → B C A\rightarrow BC ABC A , B , C ∈ V A,B,C\in V A,B,CV
  • A → a A\rightarrow a Aa a ∈ T a\in T aT

CFG可以转换为CNF的形式,如下例子。

:将 S → A B a , A → a a b , B → A c S\rightarrow ABa , A\rightarrow aab , B \rightarrow Ac SABa,Aaab,BAc 转化为CNF的形式

S → A C , A → D E , B → A F , C → B D , D → a , F → c , E → D G , G → b S\rightarrow AC,A\rightarrow DE,B\rightarrow AF,C\rightarrow BD,D\rightarrow a,F\rightarrow c,E\rightarrow DG,G\rightarrow b SAC,ADE,BAF,CBD,Da,Fc,EDG,Gb

2. 下推自动机(PDA)

由于FA有局限性,可以识别 M = { 0 n 1 m ∣ n ≥ 0 , m ≥ 0 } M=\{0^n1^m | n \ge 0, m \ge 0 \} M={0n1mn0,m0},但不能识别 L = { 0 n 1 n ∣ n ≥ 0 } L=\{ 0^n1^n | n \ge 0 \} L={0n1nn0},所以有了PDA

1. 形式化定义

下推自动机(Pushdown Automata):PDA是一个七元组 P = ( Q ,   Σ ,   Γ ,   δ ,   q 0 ,   z 0 ,   F ) P=(Q,\,\Sigma,\,\Gamma,\,\delta,\,q_0,\,z_0,\,F) P=(Q,Σ,Γ,δ,q0,z0,F),其中,

  • Q Q Q 是有限的状态集;
  • Σ \Sigma Σ 是有限的输入字符集;
  • Γ \Gamma Γ 是有限的栈字符集;
  • δ \delta δ 是状态转移函数,是一个映射 Q × ( Σ ∪ { ε } ) × Γ ⇒ 2 Q × Γ ∗ Q\times (\Sigma\cup\{\varepsilon\})\times \Gamma \Rightarrow 2^Q\times \Gamma^* Q×(Σ{ε})×Γ2Q×Γ
  • q 0 q_0 q0 是初始状态;
  • z 0 z_0 z0 是初始栈符,表示栈是空的;
  • F F F 是终结状态集;

:构造PDA识别 L = { w w R ∣ w ∈ { 0 , 1 } ∗ } L=\{ww^R|w\in\{0,1\}^*\} L={wwRw{0,1}}

:第一步,把 w w w 入栈
δ ( q , 0 , z 0 ) = ( q , 0 z 0 ) , δ ( q , 1 , z 0 ) = ( q , 1 z 0 ) δ ( q , 0 , 0 ) = ( q , 00 ) , δ ( q , 1 , 0 ) = ( q , 10 ) δ ( q , 0 , 1 ) = ( q , 01 ) , δ ( q , 1 , 1 ) = ( q , 11 ) \delta(q,0,z_0)=(q,0z_0),\quad \delta(q,1,z_0)=(q,1z_0)\\ \delta(q,0,0)=(q,00),\quad \delta(q,1,0)=(q,10)\\ \delta(q,0,1)=(q,01),\quad \delta(q,1,1)=(q,11) δ(q,0,z0)=(q,0z0),δ(q,1,z0)=(q,1z0)δ(q,0,0)=(q,00),δ(q,1,0)=(q,10)δ(q,0,1)=(q,01),δ(q,1,1)=(q,11)
第二步,从栈中弹出 w R w^R wR
δ ( q , 1 , 1 ) = ( p , ε ) , δ ( q , 0 , 0 ) = ( q , ε ) δ ( p , 1 , 1 ) = ( p , ε ) , δ ( p , 0 , 0 ) = ( q , ε ) \delta(q,1,1)=(p,\varepsilon),\quad \delta(q,0,0)=(q,\varepsilon)\\ \delta(p,1,1)=(p,\varepsilon),\quad \delta(p,0,0)=(q,\varepsilon) δ(q,1,1)=(p,ε),δ(q,0,0)=(q,ε)δ(p,1,1)=(p,ε),δ(p,0,0)=(q,ε)
第三步,转移到终结状态 δ ( p , ε , z 0 ) = ( r , z 0 ) \delta(p,\varepsilon, z_0)=(r,z_0) δ(p,ε,z0)=(r,z0)

图示如下,这是一个不确定的PDA
[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)_第3张图片

2. 确定的PDA

如果一个PDA P = ( Q ,   Σ ,   Γ ,   δ ,   q 0 ,   z 0 ,   F ) P=(Q,\,\Sigma,\,\Gamma,\,\delta,\,q_0,\,z_0,\,F) P=(Q,Σ,Γ,δ,q0,z0,F) 是确定的,那么它满足下面的条件:

  • ∀ q ∈ Q , ∀ a ∈ Σ ∪ { ε } , ∀ X ∈ Γ \forall q\in Q,\forall a\in \Sigma \cup \{\varepsilon\},\forall X\in \Gamma qQ,aΣ{ε},XΓ δ ( q , a , X ) \delta(q,a,X) δ(q,a,X) 的结果是唯一的;
  • δ ( q , a , X ) \delta(q,a,X) δ(q,a,X) δ ( q , ε , X ) \delta(q,\varepsilon ,X) δ(q,ε,X) 只能有一个有定义,因为对于状态 q q q来说,读 ε \varepsilon ε 意味着不读 a a a,而另一个意味着读 a a a,所以读与不读就产生了不确定性。

:构造确定的PDA识别 L = { 0 n 1 n ∣ n > 0 } L = \{ 0^n1^n | n > 0 \} L={0n1nn>0}

:这就是一个DPDA
[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)_第4张图片

3. PDA的瞬时描述

用一个三元组 ( q , w , α ) (q,w,\alpha) (q,w,α) 来描述一个PDA在某一时刻的格局,其中,

  • q q q 是PDA此时的状态;
  • w w w 是剩余的待读入字符串;
  • α \alpha α 是栈中的字符串。

:用格局序列描述2中构造的 L = { 0 n 1 n ∣ n > 0 } L = \{ 0^n1^n | n > 0 \} L={0n1nn>0} 的PDA接受 w = 0011 w=0011 w=0011 的过程。

( q , 0011 , z 0 ) ┝ ( q , 011 , 0 z 0 ) ┝ ( q , 11 , 00 z 0 ) ┝ ( p , 1 , 0 z 0 ) ┝ ( p , ε , z 0 ) ┝ ( r , ε , z 0 ) (q,0011,z_0)┝(q,011,0z_0)┝(q,11,00z_0)┝(p,1,0z_0)┝(p,\varepsilon,z_0)┝(r,\varepsilon,z_0) (q,0011,z0)(q,011,0z0)(q,11,00z0)(p,1,0z0)(p,ε,z0)(r,ε,z0)

简记为 ( q , 0011 , z 0 ) ┝ ∗ ( r , ε , z 0 ) (q,0011,z_0)┝^* (r,\varepsilon,z_0) (q,0011,z0)(r,ε,z0)

4. PDA接受的语言

PDA可以用两种方式描述接受语言:

  • 终结状态来描述: L ( P ) = { w   ∣   ( q 0 , w , z 0 ) ┝ ∗ ( q , ε , α ) , q ∈ F } L(P) = \{w\,|\, (q_0, w, z_0)┝^* (q, \varepsilon, \alpha), q\in F\} L(P)={w(q0,w,z0)(q,ε,α),qF}
  • 空栈状态来描述: N ( P ) = { w   ∣   ( q 0 , w , z 0 ) ┝ ∗ ( q , ε , α ) } N(P) = \{w\,|\, (q_0, w, z_0)┝^* (q, \varepsilon, \alpha)\} N(P)={w(q0,w,z0)(q,ε,α)}
  • 这两种描述方式是等价的,即 L ( P ) ⇔ N ( p ) L(P) \Leftrightarrow N(p) L(P)N(p)

例如2中构造的 L = { 0 n 1 n ∣ n > 0 } L = \{ 0^n1^n | n > 0 \} L={0n1nn>0} 的PDA就是用终结状态接受的,也可用空栈状态来描述,如下
[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)_第5张图片

但是并不是所有的PDA都可以用两种方式构造 (针对DPDA),当 L L L 可以被终结状态的DPDA接受并且 L L L 有前缀性的时候, L L L 才能被空栈状态的DPDA接受。

语言的前缀性:该语言中没有两个不同的字符串x和y,使得x是y的前缀。

如:语言 0* 就没有前缀性,因为0是00的前缀。

3. CFG和PDA的等价性

对于一个给定的上下文无关语言 L L L,存在一个CFG生成 L L L,且存在一个PDA识别 L L L

1. CFG ⇒ \Rightarrow PDA

把CFG G = ( V , T , S , P ) G=(V,T,S,P) G=(V,T,S,P) 转化为PDA,则对应的PDA为 B = ( { q } , T , V ∪ T , δ , q , S , {   } ) B=(\{q\},T,V\cup T,\delta,q,S,\{\,\}) B=({q},T,VT,δ,q,S,{}),其中,

  • δ ( q , ε , A ) = { ( q , α ) ∣ A → α ∈ P } \delta(q, \varepsilon, A) =\{(q, \alpha ) | A\rightarrow \alpha \in P \} δ(q,ε,A)={(q,α)AαP}
  • δ ( q , a , a ) = ( q , ε ) \delta(q, a, a) =(q, \varepsilon) δ(q,a,a)=(q,ε)

:将CFG G = ( { S } , { 0 , 1 } , { S → 0 S 1 , S → S S , S → ε } , S ) G=(\{S\},\{0,1\}, \{S\rightarrow 0S1, S\rightarrow SS, S\rightarrow \varepsilon \}, S) G=({S},{0,1},{S0S1,SSS,Sε},S) 转化为PDA。

:PDA为 P = ( { q } , { 0 , 1 } , { 0 , 1 , S } , δ , q , S , {   } ) P=(\{q\}, \{0,1\}, \{0,1,S\}, \delta, q, S, \{\,\}) P=({q},{0,1},{0,1,S},δ,q,S,{}),其中 δ \delta δ 定义如下:

  • δ ( q , ε , S ) = { ( q , 0 S 1 ) , ( q , S S ) , ( q , ε ) } \delta(q,\varepsilon, S)=\{(q,0S1), (q,SS), (q,\varepsilon)\} δ(q,ε,S)={(q,0S1),(q,SS),(q,ε)}
  • δ ( q , 0 , 0 ) = { ( q , ε ) } \delta (q,0,0)=\{(q,\varepsilon )\} δ(q,0,0)={(q,ε)}
  • δ ( q , 1 , 1 ) = { ( q , ε ) } \delta (q,1,1)=\{(q,\varepsilon )\} δ(q,1,1)={(q,ε)}

用图表示
[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)_第6张图片

该PDA识别字符串 w = 0011 w=0011 w=0011 的过程:

( q , 0011 , S ) ┝ ( q , 0011 , 0 S 1 ) ┝ ( q , 011 , S 1 ) ┝ ( q , 011 , 0 S 11 ) ┝ ( q , 11 , S 11 ) ┝ ( q , 11 , 11 ) ┝ ( q , 1 , 1 ) ┝ ( q , ε , ε ) (q,0011,S)┝(q,0011,0S1)┝(q,011,S1)┝(q,011,0S11) ┝(q,11,S11)┝(q,11,11)┝(q,1,1)┝(q,\varepsilon,\varepsilon) (q,0011,S)(q,0011,0S1)(q,011,S1)(q,011,0S11)(q,11,S11)(q,11,11)(q,1,1)(q,ε,ε)

对应的CFG派生序列: S ⇒ 0 S 1 ⇒ 00 S 11 ⇒ 0011 S \Rightarrow 0S1 \Rightarrow 00S11 \Rightarrow 0011 S0S100S110011

转化出的PDA实际上是在模拟CFG的派生过程,所以PDA一定能就识别CFG生成的字符串

2. PDA ⇒ \Rightarrow CFG

把PDA P = ( Q ,   Σ ,   Γ ,   δ ,   q 0 ,   z 0 ,   F ) P=(Q,\,\Sigma,\,\Gamma,\,\delta,\,q_0,\,z_0,\,F) P=(Q,Σ,Γ,δ,q0,z0,F) 转化为CFG,则对应的CFG为 G = ( V , Σ , S , R ) G=(V,\Sigma,S,R) G=(V,Σ,S,R),其中,

  • V V V :包括开始变元 S S S,这个变元和PDA没有关系,就是强行规定的;还有其他形如 [ q X p ] [qXp] [qXp] 的符号,其中 ∀ q , p ∈ Q , X ∈ Γ \forall q,p \in Q, X\in \Gamma q,pQ,XΓ

    • 符号 [ q X p ] [qXp] [qXp] 的意义是在 q q q 状态下,可以使栈中的 X X X 弹出并转移到 p p p 状态的字符串,例如有状态转移函数 δ ( q 0 , ε , z 0 ) = ( p , ε ) \delta(q_0, \varepsilon, z_0) = (p, \varepsilon) δ(q0,ε,z0)=(p,ε),则 [ q 0 z 0 p ] → ε [q_0z_0p]\rightarrow \varepsilon [q0z0p]ε,于是对于下面 R R R 的第一条产生式规则,就有 S → [ q 0 z 0 p ] S\rightarrow [q_0z_0p] S[q0z0p]
  • R R R :包括 ∀ p ∈ Q \forall p\in Q pQ S → [ q 0 z 0 p ] S\rightarrow [q_0z_0p] S[q0z0p];还有 [ q X r k ] → a [ r Y 1 r 1 ] [ r 1 Y 2 r 2 ] . . . [ r k − 1 Y k r k ] [q X r_k]\rightarrow a[rY_1r_1][r_1Y_2r_2]... [r_{k-1}Y_kr_k] [qXrk]a[rY1r1][r1Y2r2]...[rk1Ykrk],对于 ( r , Y 1 Y 2 . . . Y k ) ∈ δ ( q , a , X ) (r, Y_1Y_2...Y_k)\in \delta (q,a,X) (r,Y1Y2...Yk)δ(q,a,X)

    • 第一条产生式规则已经在上一条中描述了,下面是关于第二条产生式规则。对于状态转移函数 δ ( q , a , X ) = ( r , Y 1 Y 2 . . . Y k ) \delta(q, a, X) = (r,Y_1Y_2...Y_k) δ(q,a,X)=(r,Y1Y2...Yk),因为 [ q X r k ] [qXr_k] [qXrk] 表示的是把 X X X 全pop掉所需要的字符串,而状态转移函数读入字符串 a a a 之后栈中的元素是 Y 1 Y 2 . . . Y k Y_1Y_2...Y_k Y1Y2...Yk,所以需要把这些元素也pop掉,因此最后的状态就不是 r r r 而是 r k r_k rk,而第二条产生式规则的body部分 a a a 之后的部分就是做这个的。

:还是用 2.2确定的PDA 中的例子,将其转化成CFG
[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)_第7张图片

P = ( Q ,   Σ ,   Γ ,   δ ,   q 0 ,   z 0 ,   F ) ⇒ G = ( V , Σ , S , R ) P=(Q,\,\Sigma,\,\Gamma,\,\delta,\,q_0,\,z_0,\,F)\Rightarrow G=(V,\Sigma,S,R) P=(Q,Σ,Γ,δ,q0,z0,F)G=(V,Σ,S,R),其中 V = { S , [ q z 0 q ] , [ q z 0 p ] , [ q 0 q ] , [ q 0 p ] , [ q 1 q ] , [ q 1 p ] , [ p z 0 q ] , [ p z 0 p ] , [ p 0 q ] , [ p 0 p ] , [ p 1 q ] , [ p 1 p ] } V=\{S,[qz_0q], [qz_0p], [q0q], [q0p], [q1q], [q1p],[pz_0q], [pz_0p], [p0q], [p0p], [p1q], [p1p] \} V={S,[qz0q],[qz0p],[q0q],[q0p],[q1q],[q1p],[pz0q],[pz0p],[p0q],[p0p],[p1q],[p1p]}

然后根据转移函数导出产生式 R R R

  • δ ( q , 0 , z 0 ) = ( q , 0 z 0 ) ⇒ [ q z 0 r 2 ] → 0 [ q 0 r 1 ] [ r 1 z 0 r 2 ] , ∀ r 1 , r 2 ∈ Q ⇒ [ q z 0 q ] → 0 [ q 0 q ] [ q z 0 q ]    ∣    0 [ q 0 p ] [ p z 0 q ] [ q z 0 p ] → 0 [ q 0 q ] [ q z 0 p ]    ∣    0 [ q 0 p ] [ p z 0 p ] \delta (q, 0, z_0) = (q, 0z_0)\Rightarrow [qz_0r_2]\rightarrow 0[q0r_1][r_1z_0r_2], \forall r_1,r_2\in Q \Rightarrow\\ [qz_0q] \rightarrow 0[q0q][qz_0q]\; |\; 0[q0p][pz_0q]\\ [qz_0p] \rightarrow 0[q0q][qz_0p]\; |\; 0[q0p][pz_0p] δ(q,0,z0)=(q,0z0)[qz0r2]0[q0r1][r1z0r2],r1,r2Q[qz0q]0[q0q][qz0q]0[q0p][pz0q][qz0p]0[q0q][qz0p]0[q0p][pz0p]
  • δ ( q , 0 , 0 ) = ( q , 00 ) ⇒ [ q 0 r 2 ] → 0 [ q 0 r 1 ] [ r 1 0 r 2 ] , ∀ r 1 , r 2 ∈ Q ⇒ [ q 0 q ] → 0 [ q 0 q ] [ q 0 q ]    ∣    0 [ q 0 p ] [ p 0 q ] [ q 0 p ] → 0 [ q 0 q ] [ q 0 p ]    ∣    0 [ q 0 p ] [ p 0 p ] \delta (q, 0, 0) = (q, 00)\Rightarrow [q0r_2] \rightarrow 0[q0r_1][r_10r_2], \forall r_1,r_2\in Q \Rightarrow \\ [q0q] \rightarrow 0[q0q][q0q]\; |\; 0[q0p][p0q] \\ [q0p] \rightarrow 0[q0q][q0p]\; |\; 0[q0p][p0p] δ(q,0,0)=(q,00)[q0r2]0[q0r1][r10r2],r1,r2Q[q0q]0[q0q][q0q]0[q0p][p0q][q0p]0[q0q][q0p]0[q0p][p0p]
  • δ ( q , ε , z 0 ) = ( p , z 0 ) ⇒ [ q z 0 r 1 ] → [ p z 0 r 1 ] , ∀ r 1 ∈ Q ⇒ [ q z 0 q ] → [ p z 0 q ] [ q z 0 p ] → [ p z 0 p ] \delta(q, \varepsilon, z_0)=(p,z_0) \Rightarrow [qz_0r_1] \rightarrow [pz_0r_1], \forall r_1\in Q \Rightarrow \\ [qz_0q] \rightarrow [pz_0q]\\ [qz_0p] \rightarrow [pz_0p] δ(q,ε,z0)=(p,z0)[qz0r1][pz0r1],r1Q[qz0q][pz0q][qz0p][pz0p]
  • δ ( q , 1 , 0 ) = ( p , ε ) ⇒ [ q 0 p ] → 1 \delta(q, 1, 0) = (p,\varepsilon) \Rightarrow [q0p] \rightarrow 1 δ(q,1,0)=(p,ε)[q0p]1
  • δ ( p , 1 , 0 ) = ( p , ε ) ⇒ [ p 0 p ] → 1 \delta(p, 1, 0) = (p,\varepsilon) \Rightarrow [p0p] \rightarrow 1 δ(p,1,0)=(p,ε)[p0p]1
  • δ ( p , ε , z 0 ) = ( p , ε ) ⇒ [ p z 0 p ] → ε \delta(p, \varepsilon, z_0) = (p,\varepsilon) \Rightarrow [pz_0p] \rightarrow \varepsilon δ(p,ε,z0)=(p,ε)[pz0p]ε

把得到的产生式整合在一起得到 R R R
R = { S → [ q z 0 q ]    ∣    [ q z 0 p ] , [ q z 0 q ] → 0 [ q 0 q ] [ q z 0 q ]    ∣    0 [ q 0 p ] [ p z 0 q ] , [ q z 0 p ] → 0 [ q 0 q ] [ q z 0 p ]    ∣    0 [ q 0 p ] [ p z 0 p ] , [ q 0 q ] → 0 [ q 0 q ] [ q 0 q ]    ∣    0 [ q 0 p ] [ p 0 q ] , [ q 0 p ] → 0 [ q 0 q ] [ q 0 p ]    ∣    0 [ q 0 p ] [ p 0 p ] , [ q z 0 q ] → [ p z 0 q ] ,    [ q z 0 p ] → [ p z 0 p ] , [ q 0 p ] → 1 ,    [ p 0 p ] → 1 ,    [ p z 0 p ] → ε } R = \{\quad S \rightarrow [qz_0q]\,\, |\,\, [qz_0p],\\ [qz_0q] \rightarrow 0[q0q][qz_0q] \,\,|\,\, 0[q0p][pz_0q],\\ [qz_0p] \rightarrow 0[q0q][qz_0p] \,\,|\,\, 0[q0p][pz_0p],\\ [q0q] \rightarrow 0[q0q][q0q] \,\,|\,\, 0[q0p][p0q],\\ [q0p] \rightarrow 0[q0q][q0p] \,\,|\,\, 0[q0p][p0p],\\ [qz_0q] \rightarrow [pz_0q],\;[qz_0p] \rightarrow[pz_0p],\\ [q0p] \rightarrow 1,\; [p0p] \rightarrow 1,\; [pz_0p] \rightarrow \varepsilon \quad\} R={S[qz0q][qz0p],[qz0q]0[q0q][qz0q]0[q0p][pz0q],[qz0p]0[q0q][qz0p]0[q0p][pz0p],[q0q]0[q0q][q0q]0[q0p][p0q],[q0p]0[q0q][q0p]0[q0p][p0p],[qz0q][pz0q][qz0p][pz0p],[q0p]1,[p0p]1,[pz0p]ε}
最后 R R R 按如下规则化简一下:

  • 消除含有没有终结符的变元的产生式,如:含有 [ p z 0 q ] [pz_0q] [pz0q] 的产生式;
  • 消除死循环的产生式,如: [ q 0 q ] [q0q] [q0q] 的第一个产生式,因为它的第二个产生式由于 [ p 0 q ] [p0q] [p0q] 满足第一条化简规则,所以它只剩下第一个产生式,所以它死循环了;
  • 消除含有由于前两条规则导致的无用变元的产生式,如:因为 [ q 0 q ] [q0q] [q0q] 无用,所以含有它的产生式也无用。

最终得到
R = { S → [ q z 0 p ] ,    [ q z 0 p ] → 0 [ q 0 p ] [ p z 0 p ] , [ q 0 p ] → 0 [ q 0 p ] [ p 0 p ] ,    [ q z 0 p ] → [ p z 0 p ] , [ q 0 p ] → 1 ,    [ p 0 p ] → 1 ,    [ p z 0 p ] → ε } R = \{\quad S \rightarrow [qz_0p],\;[qz_0p] \rightarrow 0[q0p][pz_0p],\\ [q0p] \rightarrow 0[q0p][p0p],\; [qz_0p] \rightarrow[pz_0p],\\ [q0p] \rightarrow 1,\; [p0p] \rightarrow 1,\; [pz_0p] \rightarrow \varepsilon \quad\} R={S[qz0p],[qz0p]0[q0p][pz0p],[q0p]0[q0p][p0p],[qz0p][pz0p],[q0p]1,[p0p]1,[pz0p]ε}
看起来不太方便,于是令 A = [ q z 0 p ] , B = [ q 0 p ] , C = [ p 0 p ] , D = [ p z 0 p ] A=[qz_0p], B=[q0p], C=[p0p], D=[pz_0p] A=[qz0p],B=[q0p],C=[p0p],D=[pz0p],得到

R = { S → A ,    A → 0 B D ∣ D ,    B → 1 ∣ 0 B C ,    C → 1 ,    D → ε } R = \{ S \rightarrow A,\; A\rightarrow 0BD|D,\; B\rightarrow1|0BC,\; C\rightarrow1,\; D\rightarrow \varepsilon \} R={SA,A0BDD,B10BC,C1,Dε}

再次化简得到: R = { S → 0 B ∣ ε ,    B → 1 ∣ 0 B C ,    C → 1 } R = \{ S\rightarrow 0B|\varepsilon,\; B\rightarrow 1| 0BC,\; C\rightarrow1 \} R={S0Bε,B10BC,C1}

4. 上下文无关语言的性质

1. 泵引理

上下文无关语言的泵引理 L L L 是一个CFL,则 ∃ n \exist n n,对 ∀ w ∈ L \forall w\in L wL,若 ∣ w ∣ ≥ n |w|\ge n wn,则 w w w 可以划分为 w = u v x y z w=uvxyz w=uvxyz,其中

  • ∣ v x y ∣ ≤ n |vxy| \le n vxyn

  • ∣ v y ∣ ≥ 1 |vy| \ge 1 vy1,(要是vy同时为空就出现 A → A A\rightarrow A AA 这种没有意义的产生式了)

  • u v i x y i z ∈ L ,     ∀ i = 0 , 1 , 2 , . . . uv^ixy^iz\in L,\;\,\forall i=0,1,2,... uvixyizL,i=0,1,2,...

n的取法:令 m = ∣ V ∣ m=|V| m=V k = m a x { ∣ α ∣ ∀ A → α } k=max\{ |\alpha| \forall A\rightarrow \alpha \} k=max{αAα},则 n = k m n=k^m n=km

派生过程: S ⇒ ∗ u A z ⇒ ∗ u v A y z ⇒ ∗ w S\stackrel*\Rightarrow uAz \stackrel*\Rightarrow uvAyz\stackrel*\Rightarrow w SuAzuvAyzw,语法解析树如下,对于重复出现的 A 来说,则可用子树的A代替父节点,此时失去的就是一对vy节点。
[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)_第8张图片

:证明 L = { w w ∣ w ∈ { 0 , 1 } ∗ } L=\{ww|w\in \{0,1\}^*\} L={www{0,1}} 不是CFL。

:假设L是CFL。则由泵引理可知,存在一个常数n,对于L中长度不小于n的字符串w就可以划分为五个部分, w = u v x y z w=uvxyz w=uvxyz,其中 ∣ v x y ∣ ≤ n |vxy| \le n vxyn v y ≠ ε vy \ne \varepsilon vy=ε u v k x y k z ∈ L uv^kxy^kz\in L uvkxykzL

w = 0 n 1 n 0 n 1 n ∈ L w=0^n1^n0^n1^n\in L w=0n1n0n1nL,则 u v x y z = 0 n 1 n 0 n 1 n uvxyz=0^n1^n0^n1^n uvxyz=0n1n0n1n(如果要推出矛盾,就需要推出 u x z ∉ L uxz\notin L uxz/L)。v和y不能同时为空串且 ∣ v x y ∣ ≤ n |vxy| \le n vxyn,所以它们的取值情况可以分为7种情况,这七种情况又可以分为两类:

  • 第一类:vxy在同一类字符里,即同在开始的n个0、同时在开始的n个1里、同时在结束的n个0里,同时在结束的n个1里。这四种情况是等价的,而显然在第一种情况下有 u x z ∉ L uxz\notin L uxz/L,因为开始的0的个数不足n了。
  • 第二类:vxy在连续的两类字符里,即在前半部分的 0 n 1 n 0^n1^n 0n1n 中、在中间的 1 n 0 n 1^n0^n 1n0n 中、在后半部分的 0 n 1 n 0^n1^n 0n1n中。这三种情况是等价的,而显然在第一种情况下有 u x z ∉ L uxz\notin L uxz/L,因为开始的0和1的个数都不足n了。

所有的情况都推出了矛盾,所以假设错误,即 L 不是CFL。

2. 封闭性

CFL在并、连接、星、反转、交、同态、逆同态运算下是封闭的,而在交、补运算下不是封闭的。

对于两个CFL L 1 L_1 L1 L 2 L_2 L2,令 G ( L 1 ) = ( V 1 , T 1 , R 1 , S 1 ) , G ( L 2 ) = ( V 2 , T 2 , R 2 , S 2 ) G(L_1)=(V_1,T_1,R_1,S_1), G(L_2)=(V_2,T_2,R_2,S_2) G(L1)=(V1,T1,R1,S1),G(L2)=(V2,T2,R2,S2)

  • 并: G ( L 1 ∪ L 2 ) = ( V 1 ∪ V 2 ∪ { S } , T 1 ∪ T 2 , R , S ) G(L_1 \cup L_2 ) = (V_1\cup V_2\cup \{S\},T_1\cup T_2, R,S) G(L1L2)=(V1V2{S},T1T2,R,S) R = { S → S 1 ∣ S 2 } ∪ R 1 ∪ R 2 R= \{S\rightarrow S_1 | S_2\} \cup R_1\cup R_2 R={SS1S2}R1R2
  • 连接: G ( L 1 ∪ L 2 ) = ( V 1 ∪ V 2 ∪ { S } , T 1 ∪ T 2 , R , S ) G(L_1 \cup L_2 ) = (V_1\cup V_2\cup \{S\},T_1\cup T_2, R,S) G(L1L2)=(V1V2{S},T1T2,R,S) R = { S → S 1 S 2 } ∪ R 1 ∪ R 2 R= \{S\rightarrow S_1 S_2\} \cup R_1\cup R_2 R={SS1S2}R1R2
  • 星: G ( L 1 ∗ ) = ( V 1 , T 1 , { S 1 → S 1 S 1 ∣ ε } ∪ R 1 , S 1 ) G(L_1^*) = (V_1,T_1, \{S_1\rightarrow S_1S_1|\varepsilon\}\cup R_1,S_1) G(L1)=(V1,T1,{S1S1S1ε}R1,S1)
  • 反转: G ( L 1 R ) = ( V 1 , T 1 , { A → α R ∣ A → α R 1 } , S 1 ) G(L_1^R)=(V_1,T_1, \{A\rightarrow \alpha^R|A\rightarrow \alpha R_1\},S_1) G(L1R)=(V1,T1,{AαRAαR1},S1)

交运算不封闭,例如: L 1 = { a n b n c m ∣ n ≥ 0 , m ≥ 0 } ,    L 2 = { a n b m c m ∣ n ≥ 0 , m ≥ 0 } L_1 =\{a^nb^nc^m | n\ge 0, m\ge 0\},\;L_2 =\{a^nb^mc^m | n\ge 0, m\ge 0\} L1={anbncmn0,m0},L2={anbmcmn0,m0} 是两个CFL,它们的交就是 L 1 ∪ L 2 = { a n b n c n ∣ n ≥ 0 } L_1 \cup L_2 =\{ a^nb^nc^n | n\ge 0\} L1L2={anbncnn0},这不是CFL,可以按照上面的方式用泵引理证明。

但是一个CFL和一个RL做交运算之后得到的还是CFL,这个条件下它是封闭的。

你可能感兴趣的:(形式语言与自动机)