跳转至

CFG性质的进一步探讨

DFA转CFG

事实上,CFG是比正则表达能力更强的语言,其表达自然也包括正则,那如何把一个DFA转换成CFG的表达方式呢?

DFA 转 CFG

对于DFA \(M=(K,\sum,\delta,q_0,F)\),要转成CFG \(G=(V,\sum,S,R)\),可通过如下步骤:

  • 对于任意\(q_i\in K\) 创造中间符\(Q_i\)
  • \(S=Q_0\quad (s=q_0)\)
  • \(Q_i\Rightarrow^* \omega\) 当前仅当 \((q_i,\omega)\vdash^*(q_j,e)\ \And\ q_j\in F\),基于该条总结如下规则:
    • \(Q_i\rightarrow e\quad \forall q_i\in F\)
    • \(\forall q_i\in K\quad Q_i\rightarrow aQ_{i'}\quad if\ \delta(q_i,a)=q_{i'}\)

DFA的闭包性质探讨

DFA的闭包性与regular language略有不同,同样分情况讲述

union

我们采用构造法可以证明拼接闭包性 对于两个语言\(G_A,G_B\),我们只需要另设一个起始状态\(S\),和一条规则\(S\rightarrow S_A|S_B\),就可以通过\(S\)生成\(A\cup B\)了,所以\(A\cup B\)仍然并包

concatenation

我们同样可以采用如上构造方法证明闭包性 对于两个语言\(G_A,G_B\),我们只需要另设一个起始状态\(S\),和一条规则\(S\rightarrow S_AS_B\),就可以通过\(S\)生成\(AB\)了,所以\(AB\)仍然并包

Kleene star

我们同样可以采用如上构造方法证明闭包性 对于语言\(G_A\),我们只需要新增一条规则\(S\rightarrow SS_A\),同时为了包括重复次数为0,空字符串的情况,再增加一条规则\(S\rightarrow e\),所以\(A^*\)仍然并包

interset(交集)

与Regular Language不同,此处intersect是不满足闭包性质的,为了证明这一点,首先我们要学会Pumping Theorem for CFG

Pumping Theorem for CFL

Pumping Therom for CFL

对任意一个context free language \(L\),存在一个正整数p,使得对于任意一个string \(\omega\in L\),\(|\omega|\geq p\),他可以被写成\(uvxyz\),满足如下性质:

  • \(uv^ixy^iz\in L,\ i\geq 0\)
  • \(|v|+|y|\gt 0\)
  • \(|vxy|\leq p\)