个人用计算理论导引笔记(待补充)

文章目录

一、正则语言

预备知识

字母表:任意非空有穷集合

字符串:用字母表 中的字母组成的序列,比如 Σ = { 0 , 1 } , x = 01001 \Sigma=\{0,1\},x=01001 Σ={0,1},x=01001

连接:首尾连接,如 x = 01001 , w = a b c d e , x w = 01001 a b c d e x=01001,w=abcde,xw=01001abcde x=01001,w=abcde,xw=01001abcde

(特别地, x . . . x = x n x...x=x^n x...x=xn,表示n个x首尾连接)

串长度: x = 01001 , ∣ x ∣ = 5 x=01001,|x|=5 x=01001,∣x∣=5
空串: ε , ∣ ε ∣ = 0 , x 0 = ε \varepsilon,|\varepsilon|=0,x^0=\varepsilon ε,∣ε∣=0,x0=ε。
(空串 ≠ \neq =空格!)

子串&子序列:略
串的 标准序:并非字典序 !而是先比较长度,再逐位比较大小!

语言:由字符串 组成的集合,令字母表为 Σ \Sigma Σ(里面的串要根据标准序排列 )
Σ ∗ \Sigma^* Σ∗: Σ \Sigma Σ上有穷长度 的串(包括 ε \varepsilon ε)
Σ + \Sigma^+ Σ+: Σ \Sigma Σ上正有穷长度 的串(不包括 ε \varepsilon ε)
Σ ' \Sigma^' Σ': Σ \Sigma Σ上无穷长度 的串
Φ \varPhi Φ:空语言
(与空串语言 { ε } \{\varepsilon\} {ε}不同!空串语言 { ε } \{\varepsilon\} {ε}也与空串 ε \varepsilon ε不同!)

语言连接:类似于笛卡尔积,两两搭配。 A B = { x y ∣ x ∈ a , y ∈ b } AB=\{xy|x\in a,y\in b\} AB={xy∣x∈a,y∈b}

(特殊地, { ε } A = A { ε } = A \{\varepsilon\}A=A\{\varepsilon\}=A {ε}A=A{ε}=A, Φ A = A Φ = Φ \varPhi A=A\varPhi =\varPhi ΦA=AΦ=Φ)

确定性有穷自动机(DFA)

M = ( Q , Σ , δ , q 0 , F ) M=(Q,\Sigma,\delta,q_0,F) M=(Q,Σ,δ,q0,F)
Q Q Q:有穷状态集
Σ \Sigma Σ:输入字母表
δ : Q × Σ → Q \delta:Q \times \Sigma \rightarrow Q δ:Q×Σ→Q(转移函数 ,也就是映射关系)

(特殊地, Q × Σ ∗ → Q Q \times \Sigma^* \rightarrow Q Q×Σ∗→Q(多了个空串)为扩展转移函数 )
q 0 q_0 q0:初始状态
F F F:接受状态/终止状态

语言:能够被自动机接受的串集合 , L ( M ) = { w ∈ Σ ∗ ∣ δ ( q 0 , w ) ∈ F } L(M)=\{w\in \Sigma^*|\delta(q_0,w)\in F\} L(M)={w∈Σ∗∣δ(q0,w)∈F}
正则语言 :可以被有穷自动机 接受的语言/可以用正则表达式 描述的语言

设计DFA

  1. 确定状态集
  2. 确定转移函数
  3. 标注初始状态&终结状态

正则运算

正则语言对正则计算封闭!

正则语言的**交并补、差、对称差、连接、*(星号)**封闭!
A ∪ B = { x ∣ x ∈ A 或 x ∈ B } A\cup B=\{x|x\in A或x\in B\} A∪B={x∣x∈A或x∈B}
A B = { x y ∣ x ∈ A 且 y ∈ B } AB=\{xy|x\in A且y\in B\} AB={xy∣x∈A且y∈B}
A ∗ = A 0 ∪ A 1 ∪ A 2 ∪ . . . A^*=A^0\cup A^1\cup A^2\cup... A∗=A0∪A1∪A2∪...(见前,包括 ε \varepsilon ε)

非确定性有穷自动机(NFA,含有 ε \varepsilon ε,下一个状态可以有若干种选择(包括0种))

筹码集:字符集中只有 ε \varepsilon ε与一种字符 的语言
M = ( Q , Σ ε , δ , q 0 , F ) M=(Q,\Sigma_{\varepsilon},\delta,q_0,F) M=(Q,Σε,δ,q0,F)
Q Q Q:有穷状态集
Σ \Sigma Σ:输入字母表( Σ ε = Σ ∪ { ε } \Sigma_{\varepsilon}=\Sigma\cup\{\varepsilon\} Σε=Σ∪{ε})
δ : Q × Σ ε → P ( Q ) \delta:Q \times \Sigma_{\varepsilon} \rightarrow P(Q) δ:Q×Σε→P(Q)(转移函数 )
q 0 q_0 q0:初始状态
F F F:接受状态/终止状态

任何一个NFA都有等价的DFA!
一个语言是正则语言,当且仅当只有一个NFA可以识别!

(具体转换见其他)

正则表达式

定义

对于 R R R,有

  1. a a a表示语言 { a } \{a\} {a},其中 a ∈ Σ a\in\Sigma a∈Σ(包括 ε \varepsilon ε)
  2. Φ \varPhi Φ表示空语言
  3. R = ( R 1 ∪ R 2 ) R=(R_1\cup R_2) R=(R1∪R2)是正则表达式
  4. R = ( R 1 ∘ R 2 ) R=(R_1\circ R_2) R=(R1∘R2)是正则表达式
  5. R = ( R 1 ∗ ) R=(R_1^*) R=(R1∗)是正则表达式

则 R R R是正则表达式

eg:数值常量:
{ + , − , ε } ( D D ∗ ∪ D D ∗ . D ∗ ∪ D ∗ . D D ∗ ) , D = { 0 , 1 , 2 , . . . , 9 } \{+,-,\varepsilon\}(DD^*\cup DD^*.D^*\cup D^*.DD^*),D=\{0,1,2,...,9\} {+,−,ε}(DD∗∪DD∗.D∗∪D∗.DD∗),D={0,1,2,...,9}

eg:72、3.14159、+7.、-.01

计算优先级

星号 ∗ > *> ∗>连接 > > >并 ∪ \cup ∪

定理

Φ ∗ = { ε } \varPhi^*=\{\varepsilon\} Φ∗={ε}
R ∪ Φ = R R\cup\varPhi=R R∪Φ=R
R ε = R R\varepsilon=R Rε=R
R ∪ ε = R ∪ { ε } ≠ R R\cup \varepsilon=R\cup \{\varepsilon\}\neq R R∪ε=R∪{ε}=R
R Φ = Φ ≠ R R\varPhi=\varPhi\neq R RΦ=Φ=R

正则表达式与一个确定自动机等价!

GNFA(广义非确定自动机,NFA的推广)

(与NFA不同的是,转移用的并非是单个字符,而是一个正则表达式! )
G = ( Q , Σ , δ , q s t a r t , q a c c e p t ) G=(Q,\Sigma,\delta,q_{start},q_{accept}) G=(Q,Σ,δ,qstart,qaccept)
Q Q Q:有穷状态集
Σ \Sigma Σ:输入字母表( Σ ε = Σ ∪ { ε } \Sigma_{\varepsilon}=\Sigma\cup\{\varepsilon\} Σε=Σ∪{ε})
δ : ( Q − { q a c c e p t } ) × ( Q − { q s t a r t } ) → R \delta:(Q-\{q_{accept}\}) \times (Q-\{q_{start}\}) \rightarrow R δ:(Q−{qaccept})×(Q−{qstart})→R

(与NFA不同的是,转移状态用的并非是单个字符,而是一个正则表达式! )
q s t a r t q_{start} qstart:初始状态
q a c c e p t q_{accept} qaccept:接受状态/终止状态

CONVERT(G)(过程函数)

对于任意GNFA G,C O N V E R T ( G ) CONVERT(G) CONVERT(G)与 G G G等价!

对于 G G G的状态数 k k k, k = 2 k=2 k=2时, C O N V E R T ( G ) = δ ( q s t a r t , q a c c e p t ) CONVERT(G)=\delta(q_{start},q_{accept}) CONVERT(G)=δ(qstart,qaccept)。

当 k > 2 k>2 k>2时,令 q r i p ∈ Q − { q s t a r t } − { q a c c e p t } , Q ′ = Q − q r i p q_{rip}\in Q-\{q_{start}\}-\{q_{accept}\},Q'=Q-{q_{rip}} qrip∈Q−{qstart}−{qaccept},Q′=Q−qrip。

构造 G ′ = ( Q ′ , Σ ε , δ ′ , q s t a r t , q a c c e p t ) G'=(Q',\Sigma_{\varepsilon},\delta',q_{start},q_{accept}) G′=(Q′,Σε,δ′,qstart,qaccept),如此循环直到 k = 2 k=2 k=2。

其中,对于每个非起始态 q i q_i qi与每个非终结态 q j q_j qj, δ ′ ( q i , q j ) = ( R 1 ) ( R 2 ) ∗ ( R 3 ) ∪ ( R 4 ) \delta'(q_i,q_j)=(R_1)(R_2)*(R_3)\cup(R_4) δ′(qi,qj)=(R1)(R2)∗(R3)∪(R4)

其中 R 1 = δ ( q i , q r i p ) , R 2 = δ ( q r i p , q r i p ) , R 3 = δ ( q r i p , q j ) , R 4 = δ ( q i , q j ) R_1=\delta(q_i,q_{rip}),R_2=\delta(q_{rip},q_{rip}),R_3=\delta(q_{rip},q_{j}),R_4=\delta(q_i,q_j) R1=δ(qi,qrip),R2=δ(qrip,qrip),R3=δ(qrip,qj),R4=δ(qi,qj)

(选择 i → j i\rightarrow j i→j和 i → ( r i p ) ∗ → j i\rightarrow (rip)^*\rightarrow j i→(rip)∗→j的并集来转移状态不断递归)

转化方法

  1. 增加新的起始点与终结点,并将其与原来的起始点/终结点用 ε \varepsilon ε连接
    (类似最大流的源点与汇点,使得起始点没有入度,终结点没有出度 )
  2. 合并平行边
  3. 去除中心点(使得点减少更精简 )

    以下图为例。
    1.添加新起始点s 与新终结点a ,用 ε \varepsilon ε连接。
    2.将状态2去消除中心点 ,变为 b ( a ∪ b ) ∗ b(a\cup b)^* b(a∪b)∗后删除状态2
    3.将状态1去消除中心点 ,变为 a ∗ b ( a ∪ b ) ∗ a^*b(a\cup b)^* a∗b(a∪b)∗,结束。
    (合并的时候,如果有不含 ε \varepsilon ε的部分,则消去所有 ε \varepsilon ε,否则不消去!)

    以下图为例。
    1.添加新起始点s 与新终结点a ,用 ε \varepsilon ε连接。
    2.将状态1去消除中心点 。
    (消除路径经过1的、且不是回路的)
    (1)把 2 → a 1 → b 3 2\xrightarrow{a}1\xrightarrow{b}3 2a 1b 3变为 2 → a b 3 2\xrightarrow{ab}3 2ab 3
    (2)把 3 → b 1 → a 2 3\xrightarrow{b}1\xrightarrow{a}2 3b 1a 2与 3 → a 2 3\xrightarrow{a}2 3a 2变为 3 → b a ∪ a 2 3\xrightarrow {ba\cup a}2 3ba∪a 2
    (消除新起始点/新终结点相关的)
    (3)把 s → ε 1 → a 2 s\xrightarrow{\varepsilon}1\xrightarrow{a}2 sε 1a 2变为 s → a 2 s\xrightarrow{a}2 sa 2
    (4)把 s → ε 1 → b 3 s\xrightarrow{\varepsilon}1\xrightarrow{b}3 sε 1b 3变为 s → b 3 s\xrightarrow{b}3 sb 3
    (消除路径经过1的、且是回路的)
    (5)把 2 → a 1 → a 2 2\xrightarrow{a}1\xrightarrow{a}2 2a 1a 2与 2 → b 2 2\xrightarrow{b}2 2b 2变为 2 → a a ∪ b 2 2\xrightarrow {aa\cup b}2 2aa∪b 2
    (6)把 3 → b 1 → b 3 3\xrightarrow{b}1\xrightarrow{b}3 3b 1b 3变为 3 → b b 3 3\xrightarrow{bb}3 3bb 3
    3.将状态2去消除中心点 。
    (1)将 s → a 2 → ε a s\xrightarrow{a}2\xrightarrow{\varepsilon}a sa 2ε a与 2 → a a ∪ b 2 2\xrightarrow{aa\cup b}2 2aa∪b 2变为 s → a ( a a ∪ b ) ∗ a s\xrightarrow{a(aa\cup b)^*}a sa(aa∪b)∗ a
    (2)将 s → b 3 s\xrightarrow{b}3 sb 3与 s → a 2 → a a ∪ b 2 → a b 3 s\xrightarrow{a}2\xrightarrow{aa\cup b}2\xrightarrow{ab}3 sa 2aa∪b 2ab 3变为 s → a ( a a ∪ b ) ∗ a b ∪ b 3 s\xrightarrow{a(aa\cup b)^*ab\cup b}3 sa(aa∪b)∗ab∪b 3
    (因为 3 → ε a 3\xrightarrow{\varepsilon}a 3ε a,所以状态3也是终结状态)
    (3)将 3 → b b 3 3\xrightarrow{bb}3 3bb 3与 3 → b a ∪ a 2 → a a ∪ b 2 → a b 3 3\xrightarrow{ba\cup a}2\xrightarrow{aa\cup b}2\xrightarrow{ab}3 3ba∪a 2aa∪b 2ab 3变为 3 → ( b a ∪ a ) ( a a ∪ b ) ∗ a b ∪ b b 3 3\xrightarrow{(ba\cup a)(aa\cup b)^*ab\cup bb}3 3(ba∪a)(aa∪b)∗ab∪bb 3
    (4)将 3 → ε a 3\xrightarrow{\varepsilon}a 3ε a与 3 → b a ∪ a 2 → a a ∪ b 2 → ε a 3\xrightarrow{ba\cup a}2\xrightarrow{aa\cup b}2\xrightarrow{\varepsilon}a 3ba∪a 2aa∪b 2ε a变为 3 → b a ∪ a ( a a ∪ b ) ∗ ∪ ε a 3\xrightarrow{ba\cup a(aa\cup b)^*\cup\varepsilon}a 3ba∪a(aa∪b)∗∪ε a
    4.将状态3去消除中心点 。
    将 s → a ( a a ∪ b ) ∗ a b ∪ b 3 s\xrightarrow{a(aa\cup b)^*ab\cup b}3 sa(aa∪b)∗ab∪b 3、 3 → ( b a ∪ a ) ( a a ∪ b ) ∗ a b ∪ b b 3 3\xrightarrow{(ba\cup a)(aa\cup b)^*ab\cup bb}3 3(ba∪a)(aa∪b)∗ab∪bb 3、 3 → b a ∪ a ( a a ∪ b ) ∗ ∪ ε a 3\xrightarrow{ba\cup a(aa\cup b)^*\cup\varepsilon}a 3ba∪a(aa∪b)∗∪ε a,
    与 s → a ( a a ∪ b ) ∗ a s\xrightarrow{a(aa\cup b)^*}a sa(aa∪b)∗ a变为
    s → ( a ( a a ∪ b ) ∗ a b ∪ b ) ( ( b a ∪ a ) ( a a ∪ b ) ∗ a b ∪ b b ) ∗ ( b a ∪ a ( a a ∪ b ) ∗ ∪ ε ) ∪ ( a ( a a ∪ b ) ∗ ) a s\xrightarrow{(a(aa\cup b)^*ab\cup b)((ba\cup a)(aa\cup b)^*ab\cup bb)^*(ba\cup a(aa\cup b)^*\cup\varepsilon)\cup(a(aa\cup b)^*)}a s(a(aa∪b)∗ab∪b)((ba∪a)(aa∪b)∗ab∪bb)∗(ba∪a(aa∪b)∗∪ε)∪(a(aa∪b)∗) a

泵引理(一个正则语言一定存在泵长度)

若 A A A是正则语言,则存在常数 p p p( p p p为泵长度 ,类似最大循环节长度 ),若 s ∈ A s\in A s∈A, ∣ s ∣ ≥ p |s|\geq p ∣s∣≥p,

则 s = x y z s=xyz s=xyz,并且满足:

(1) ∀ i ≥ 0 , x y i z ∈ A \forall i\geq0,xy^iz\in A ∀i≥0,xyiz∈A。

(2) ∣ y ∣ > 0 |y|>0 ∣y∣>0

(3) ∣ x y ∣ ≤ p |xy|\leq p ∣xy∣≤p

如果要证明一个语言不是正则的 ,则用反证法 。找一个反例 即可。

二、上下文无关文法(CFG)

G = ( V , Σ , R , S ) G=(V,\Sigma,R,S) G=(V,Σ,R,S)
V V V:有穷变元集
Σ \Sigma Σ:有穷终结符集
R R R:有穷规则集(形如 A → w , w ∈ ( V ∪ Σ ) ∗ A\rightarrow w,w\in(V\cup\Sigma)^* A→w,w∈(V∪Σ)∗)
S ∈ V S\in V S∈V:初始变元
一个上下文无关语言(CFL)与上下文无关文法等价!

CFG生成

合并

对于原本的初始变元 S 1 , S 2 , . . . S k S_1,S_2,...S_k S1,S2,...Sk,新增规则 S → S 1 ∣ S 2 ∣ . . . S k S\rightarrow S_1|S_2|...S_k S→S1∣S2∣...Sk

正则语言生成

用DFA转化为等价的CFG(正则语言都是上下文无关语言!)

对于原DFA中 δ ( q i , a ) = q j \delta(q_i,a)=q_j δ(qi,a)=qj(即 q i → a q j q_i\xrightarrow{a}q_j qia qj),则令 R i → a R j R_i\rightarrow aR_j Ri→aRj

对于原DFA中 q i ∈ F q_i\in F qi∈F(即 q i q_i qi为终止状态),则令 R i → ε R_i\rightarrow \varepsilon Ri→ε

语法分析树


文法歧义性

最左派生:每一步都优先替换最左边的变元

eg1: < E X P R > <EXPR> <EXPR>
⇒ < E X P R > + < E X P R > \Rightarrow <EXPR>+<EXPR> ⇒<EXPR>+<EXPR>
⇒ a + < E X P R > \Rightarrow a+<EXPR> ⇒a+<EXPR>
⇒ a + < E X P R > × < E X P R > \Rightarrow a+<EXPR>\times<EXPR> ⇒a+<EXPR>×<EXPR>
⇒ a + a × < E X P R > \Rightarrow a+a\times<EXPR> ⇒a+a×<EXPR>
⇒ a + a × a \Rightarrow a+a\times a ⇒a+a×a

eg2: < E X P R > <EXPR> <EXPR>
⇒ < E X P R > × < E X P R > \Rightarrow <EXPR>\times<EXPR> ⇒<EXPR>×<EXPR>
⇒ < E X P R > + < E X P R > × < E X P R > \Rightarrow <EXPR>+<EXPR>\times<EXPR> ⇒<EXPR>+<EXPR>×<EXPR>
⇒ a + < E X P R > × < E X P R > \Rightarrow a+<EXPR>\times<EXPR> ⇒a+<EXPR>×<EXPR>
⇒ a + a × < E X P R > \Rightarrow a+a\times<EXPR> ⇒a+a×<EXPR>
⇒ a + a × a \Rightarrow a+a\times a ⇒a+a×a

注意到最左派生产生歧义性,因此这是歧义文法。

乔姆斯基范式(CNF)

初始变元不能在式子右方出现

只允许如下形式规则:
S → ε S\rightarrow \varepsilon S→ε
A → B C A\rightarrow BC A→BC
A → a A\rightarrow a A→a(任意终结符)

生成CNF

任何的CFG都有等价的CNF!

  1. 添加新初始变元 S 0 S_0 S0与新规则 S 0 → S S_0\rightarrow S S0→S(旧初始变元)
  2. 处理所有的 ε \varepsilon ε规则:
    若有非初始变元 A → ε A\rightarrow\varepsilon A→ε,则删除之 ,并修改所有等式右边与 A A A相关的内容。
    B → u A v B\rightarrow uAv B→uAv变为 B → u v B\rightarrow uv B→uv。
    B → u A v A w B\rightarrow uAvAw B→uAvAw变为 B → u v A w ∣ u A v w ∣ u v w B\rightarrow uvAw|uAvw|uvw B→uvAw∣uAvw∣uvw(三种不同的可能情况)
    B → A B\rightarrow A B→A变为 B → ε B\rightarrow\varepsilon B→ε。
    重复以上,知道删除所有 ε \varepsilon ε相关规则为止( S 0 → ε S_0\rightarrow\varepsilon S0→ε除外)
  3. 处理所有的单一规则:(左边单个对应右边单个)
    删除 A → B A\rightarrow B A→B,并修改所有相关的内容。
    若有 B → u B\rightarrow u B→u,则添加 A → u A\rightarrow u A→u。
    重复以上,直到删除所有单一规则为止。
  4. 处理 A → u 1 u 2 . . . u k A\rightarrow u_1u_2...u_k A→u1u2...uk长规则:
    将其换成 A → u 1 A 1 , A 1 → u 2 A 2 , . . . . . . , A k = u k − 1 u k A\rightarrow u_1A_1,A_1\rightarrow u_2A_2,......,A_{k}=u_{k-1}u_k A→u1A1,A1→u2A2,......,Ak=uk−1uk。
  5. 处理终结符:
    引入新变元 U i U_i Ui与新规则 U i → a i U_i\rightarrow a_i Ui→ai。
    A → a i a j A\rightarrow a_ia_j A→aiaj换成 A → U i U j A\rightarrow U_iU_j A→UiUj
    A → a i B A\rightarrow a_iB A→aiB换成 A → U i B A\rightarrow U_iB A→UiB
    A → B a i A\rightarrow Ba_i A→Bai换成 A → B u i A\rightarrow Bu_i A→Bui

G : S → A S A ∣ a B G:S\rightarrow ASA|aB G:S→ASA∣aB
A → B ∣ S A\rightarrow B|S A→B∣S
B → b ∣ ε B\rightarrow b|\varepsilon B→b∣ε

求等价CNF。

(1)添加新初始变元 S 0 S_0 S0
S 0 → S S_0\rightarrow S S0→S
S → A S A ∣ a B S\rightarrow ASA|aB S→ASA∣aB
A → B ∣ S A\rightarrow B|S A→B∣S
B → b ∣ ε B\rightarrow b|\varepsilon B→b∣ε

(2)处理B的 ε \varepsilon ε规则
S 0 → S S_0\rightarrow S S0→S
S → A S A ∣ a B ∣ a S\rightarrow ASA|aB|a S→ASA∣aB∣a
A → B ∣ S ∣ ε A\rightarrow B|S|\varepsilon A→B∣S∣ε
B → b B\rightarrow b B→b

(3)处理A的 ε \varepsilon ε规则
S 0 → S S_0\rightarrow S S0→S
S → A S A ∣ a B ∣ a ∣ S A ∣ A S S\rightarrow ASA|aB|a|SA|AS S→ASA∣aB∣a∣SA∣AS( S → S S\rightarrow S S→S没有用,可以删去)
A → B ∣ S A\rightarrow B|S A→B∣S
B → b B\rightarrow b B→b

(4)处理单一规则 S 0 → S S_0\rightarrow S S0→S
S 0 → A S A ∣ a B ∣ a ∣ S A ∣ A S S_0\rightarrow ASA|aB|a|SA|AS S0→ASA∣aB∣a∣SA∣AS
S → A S A ∣ a B ∣ a ∣ S A ∣ A S S\rightarrow ASA|aB|a|SA|AS S→ASA∣aB∣a∣SA∣AS
A → B ∣ S A\rightarrow B|S A→B∣S
B → b B\rightarrow b B→b

(5)处理单一规则 A → B A\rightarrow B A→B
S 0 → A S A ∣ a B ∣ a ∣ S A ∣ A S S_0\rightarrow ASA|aB|a|SA|AS S0→ASA∣aB∣a∣SA∣AS
S → A S A ∣ a B ∣ a ∣ S A ∣ A S S\rightarrow ASA|aB|a|SA|AS S→ASA∣aB∣a∣SA∣AS
A → S ∣ b A\rightarrow S|b A→S∣b
B → b B\rightarrow b B→b

(6)处理单一规则 A → S A\rightarrow S A→S
S 0 → A S A ∣ a B ∣ a ∣ S A ∣ A S S_0\rightarrow ASA|aB|a|SA|AS S0→ASA∣aB∣a∣SA∣AS
S → A S A ∣ a B ∣ a ∣ S A ∣ A S S\rightarrow ASA|aB|a|SA|AS S→ASA∣aB∣a∣SA∣AS
A → A S A ∣ a B ∣ S A ∣ A S ∣ a ∣ b A\rightarrow ASA|aB|SA|AS|a|b A→ASA∣aB∣SA∣AS∣a∣b
B → b B\rightarrow b B→b

(7)处理长规则 A S A ASA ASA
S 0 → A A 1 ∣ a B ∣ a ∣ S A ∣ A S S_0\rightarrow AA_1|aB|a|SA|AS S0→AA1∣aB∣a∣SA∣AS
S → A A 1 ∣ a B ∣ a ∣ S A ∣ A S S\rightarrow AA_1|aB|a|SA|AS S→AA1∣aB∣a∣SA∣AS
A → A A 1 ∣ a B ∣ S A ∣ A S ∣ a ∣ b A\rightarrow AA_1|aB|SA|AS|a|b A→AA1∣aB∣SA∣AS∣a∣b
B → b B\rightarrow b B→b
A 1 → S A A_1\rightarrow SA A1→SA

(8)处理终结符 a a a
S 0 → A A 1 ∣ U B ∣ U ∣ S A ∣ A S S_0\rightarrow AA_1|UB|U|SA|AS S0→AA1∣UB∣U∣SA∣AS
S → A A 1 ∣ U B ∣ U ∣ S A ∣ A S S\rightarrow AA_1|UB|U|SA|AS S→AA1∣UB∣U∣SA∣AS
A → A A 1 ∣ U B ∣ S A ∣ A S ∣ U ∣ B A\rightarrow AA_1|UB|SA|AS|U|B A→AA1∣UB∣SA∣AS∣U∣B
A 1 → S A A_1\rightarrow SA A1→SA
B → b B\rightarrow b B→b
U → a U\rightarrow a U→a

于是得到 G G G对应的乔姆斯基范式。

下推自动机(PDA,通常指的是非确定性下推自动机)

由栈 组成,每次读入字符后选择与栈顶字符匹配或压入栈。
M = ( Q , Σ , Γ , δ , q 0 , F ) M=(Q,\Sigma,\Gamma,\delta,q_0,F) M=(Q,Σ,Γ,δ,q0,F)
Q Q Q:有穷状态集
Σ \Sigma Σ:输入字母表( Σ ε = Σ ∪ { ε } \Sigma_\varepsilon=\Sigma\cup\{\varepsilon\} Σε=Σ∪{ε})
Γ \Gamma Γ:栈字母表( Γ ε = Γ ∪ { ε } \Gamma_\varepsilon=\Gamma\cup\{\varepsilon\} Γε=Γ∪{ε})
δ : Q × Σ ε × Γ ε → P ( Q × Γ ε ) \delta:Q\times\Sigma_{\varepsilon}\times\Gamma_{\varepsilon}\rightarrow P(Q\times\Gamma_{\varepsilon}) δ:Q×Σε×Γε→P(Q×Γε)(转移函数)
q 0 q_0 q0:初始状态( q 0 ∈ Q q_0 \in Q q0∈Q)
F F F:终结状态集( F ⊆ Q F\subseteq Q F⊆Q)

以此图为例,可以绘制出此自动机。

在栈的初始插入一个 $符号 ,用于判断是否为空栈。

上下文无关语言CFL

如果一个语言是上下文无关语言 (CFL) ⟺ \Longleftrightarrow ⟺有下推自动机 (PDA)识别这个语言。
CFL对正则运算封闭!
CFL对交 ∩ \cap ∩不封闭! (语言 A , B A,B A,B是CFL, A ∩ B A\cap B A∩B不一定是CFL)
CFL对补运算不封闭! (语言 A A A是CFL, A c A^c Ac不一定是CFL)

CFL的泵引理(一个CFL必定有泵)

假设 A A A为上下文无关语言,则存在常数 p p p(泵长度 ,类似循环节最大长度 ),若 s ∈ A s\in A s∈A,且 ∣ s ∣ ≥ p |s|\geq p ∣s∣≥p,

则 s = u v x y z s=uvxyz s=uvxyz,其中

(1) ∀ i ≥ 0 , u v i x y i z ∈ A \forall i\geq 0,uv^ixy^iz\in A ∀i≥0,uvixyiz∈A

(2) ∣ v y ∣ > 0 |vy|>0 ∣vy∣>0

(3) ∣ v x y ∣ ≤ p |vxy|\leq p ∣vxy∣≤p

同正则文法一样,找出一个反例证明不是CFL即可!

eg1:证明 C = { a i b j c k ∣ 0 ≤ i ≤ j ≤ k } C=\{a^ib^jc^k|0\leq i\leq j\leq k\} C={aibjck∣0≤i≤j≤k}不是CFL。
prove :假设 C C C为上下文无关语言,设 p p p为泵长度,不妨令 s = a p b p c p s=a^pb^pc^p s=apbpcp。

则 s = u v x y z s=uvxyz s=uvxyz,其中

(1) ∀ i ≥ 0 , u v i x y i z ∈ C \forall i\geq 0,uv^ixy^iz\in C ∀i≥0,uvixyiz∈C

(2) ∣ v y ∣ > 0 |vy|>0 ∣vy∣>0(即 v v v与 y y y至少含一种符号)

(3) ∣ v x y ∣ ≤ p |vxy|\leq p ∣vxy∣≤p(即 v v v与 y y y至多含两种符号,理由同上)

(1): v v v与 y y y仅含一种符号

①: a a a不在 v v v与 y y y之中,此时只可能是 a . . . a ⏟ p 个 ∣ ∅ ∣ b . . . b ⏟ p 个 ∣ ∅ ∣ c . . . c ⏟ p 个 \underbrace{a...a}{p个}|\emptyset|\underbrace{b...b}{p个}|\emptyset|\underbrace{c...c}_{p个} p个 a...a∣∅∣p个 b...b∣∅∣p个 c...c,违背了 ∣ v y ∣ > 0 |vy|>0 ∣vy∣>0,矛盾。

②: b b b不在 v v v与 y y y之中,此时只可能是 a . . . a ⏟ p − i 个 ∣ a . . . a ⏟ i 个 ∣ b . . . b ⏟ p 个 ∣ c . . . c ⏟ i 个 ∣ c . . . c ⏟ p − i 个 \underbrace{a...a}{p-i个}|\underbrace{a...a}{i个}|\underbrace{b...b}{p个}|\underbrace{c...c}{i个}|\underbrace{c...c}_{p-i个} p−i个 a...a∣i个 a...a∣p个 b...b∣i个 c...c∣p−i个 c...c,违背了 ∣ v x y ∣ ≤ q |vxy|\leq q ∣vxy∣≤q,矛盾。

③: c c c不在 v v v与 y y y之中,同①,矛盾。

(2): v v v与 y y y含两种符号

此时易知当 i > 1 i>1 i>1时,就不具有 a p b p c p a^pb^pc^p apbpcp的形式,即 i = 0 i=0 i=0或 i = 1 i=1 i=1,矛盾。( ∀ i ≥ 0 \forall i\geq 0 ∀i≥0才算成立)

综上, C C C不是CFL,证毕。

eg2:证明 D = { w w ∣ w ∈ { 0 , 1 } ∗ } D=\{ww|w\in\{0,1\}^*\} D={ww∣w∈{0,1}∗}不是CFL。
prove :假设 C C C为上下文无关语言,设 p p p为泵长度,不妨令 s = 0 p 1 p 0 p 1 p s=0^p1^p0^p1^p s=0p1p0p1p。

则 s = u v x y z s=uvxyz s=uvxyz,其中

(1) ∀ i ≥ 0 , u v i x y i z ∈ C \forall i\geq 0,uv^ixy^iz\in C ∀i≥0,uvixyiz∈C

(2) ∣ v y ∣ > 0 |vy|>0 ∣vy∣>0(即 v v v与 y y y至少含一种符号)

(3) ∣ v x y ∣ ≤ p |vxy|\leq p ∣vxy∣≤p(即 v v v与 y y y至多含两种符号)

(注意这里一定要挑一个合适的反例 ,例如 0 p 1 0 p 1 0^p10^p1 0p10p1可以拆分为 0...0 ⏟ p − 1 个 ∣ 0 ∣ 1 ∣ 0 ∣ 0...0 ⏟ p − 1 个 1 \underbrace{0...0}{p-1个}|0|1|0|\underbrace{0...0}{p-1个}1 p−1个 0...0∣0∣1∣0∣p−1个 0...01,是合法的。)

(1) v x y vxy vxy在前半部分里,即 v x y vxy vxy在第一个 0 p 1 p 0^p1^p 0p1p内。此时随着 i i i的变化,后半个 0 p 1 p 0^p1^p 0p1p的数量会与前半个不同,不匹配,矛盾。

(2) v x y vxy vxy在后半部分里,同上,矛盾。

(3) v x y vxy vxy横跨中间,则 v v v与 y y y不可以含两种符号,故 v v v为 1 i 1^i 1i, y y y为 1 i 1^i 1i,同理 i i i的变化会让头尾的两个 0 p 0^p 0p与 1 p 1^p 1p数量与内部的两个不同,不匹配,矛盾。

综上, D D D不是CFL,证毕。

三、图灵机

单带图灵机(TM)

有一个纸带序列与一个可以左右双向移动 的读写头
M = ( Q , Σ , Γ , δ , q 0 , q a c c , q r e j ) M=(Q,\Sigma,\Gamma,\delta,q_0,q_{acc},q_{rej}) M=(Q,Σ,Γ,δ,q0,qacc,qrej)
Q Q Q:有穷状态集
Σ \Sigma Σ:输入字母表(注意空格符 B ∉ Σ B\notin\Sigma B∈/Σ)
Γ \Gamma Γ:带字母表, Σ ∪ { B } ⊆ Γ \Sigma\cup\{B\}\subseteq\Gamma Σ∪{B}⊆Γ
δ \delta δ: Q × Γ → Q × Γ × { L , R } Q\times\Gamma\rightarrow Q\times\Gamma\times\{L,R\} Q×Γ→Q×Γ×{L,R}(转移函数,L/R 表示左移/右移 )
q 0 ∈ Q q_0\in Q q0∈Q:初始状态
q a c c ∈ Q q_{acc}\in Q qacc∈Q:停机接受 状态
q r e q ∈ Q q_{req}\in Q qreq∈Q:停机拒绝 状态, q a c c ≠ q r e j q_{acc}\neq q_{rej} qacc=qrej

单带图灵机的格局 (序列的当前状态): u q a v uqav uqav
q q q:当前状态
u a v uav uav:当前带上的内容
a a a:当前的扫描符号

(即之前的序列 u u u|当前的状态 q q q|当前的扫描符号 a a a|后面的序列 v v v )

eg:对于带 101101111 101101111 101101111,状态 q 7 q_7 q7正在扫描第五个字符 0 0 0,其格局为 1011 q 7 01111 1011q_701111 1011q701111
初始格局 : q 0 w q_0w q0w(w为输入串)
接受格局 : u q a c c a v uq_{acc}av uqaccav
拒绝格局 : u q r e j a v uq_{rej}av uqrejav
停机格局 : u q a c c a v / u q r e j a v uq_{acc}av/uq_{rej}av uqaccav/uqrejav

(图灵机的计算结果只能是停机接受 、停机拒绝 、不停机 )

若 δ ( q i , b ) = ( q j , c , L ) \delta(q_i,b)=(q_j,c,L) δ(qi,b)=(qj,c,L)(L表示左移),则
u a q i b v uaq_ibv uaqibv产生 u q j a c v uq_jacv uqjacv(将 b b b变为 c c c, q i q_i qi变为 q j q_j qj后左移)
q i b v q_ibv qibv产生 q j c v q_jcv qjcv(已经在带最左端,不可再左移)

若 δ ( q i , b ) = ( q j , c , R ) \delta(q_i,b)=(q_j,c,R) δ(qi,b)=(qj,c,R)(R表示右移),则
u a q i b v uaq_ibv uaqibv产生 u a c q j v uacq_jv uacqjv(因为带一定可以继续右移 ,所以不需要分情况)

如何判断当前状态已经在带最左端 :在当前位置写下某个特殊符号 ,让带头向左移动,若仍然检测到该符号则说明在最左端,否则恢复原来的符号。

图灵可识别=递归可枚举=计算可枚举=半可判定=半可计算
图灵可判定=递归=可解=能行=可判定=可计算

图灵可识别 ≠ \neq =图灵可判定!

图灵机的等价变形

多带图灵机(同时多个纸带)


δ : Q × Γ k → Q × Γ k × { L , R } k \delta:Q\times\Gamma^k\rightarrow Q\times\Gamma^k\times\{L,R\}^k δ:Q×Γk→Q×Γk×{L,R}k
δ : ( q i , a 1 , . . . , a k ) = ( q j , b 1 , . . . , b k , L / R , L / R , . . . , L / R ⏟ k 个 ) \delta:(q_i,a_1,...,a_k)=(q_j,b_1,...,b_k,\underbrace{L/R,L/R,...,L/R}_{k个}) δ:(qi,a1,...,ak)=(qj,b1,...,bk,k个 L/R,L/R,...,L/R)
多带图灵机可转换为等价的单带图灵机!
图灵可识别 ⇔ \Leftrightarrow ⇔可用多带图灵机识别!

非确定性图灵机(NTM)

在左移/右移 的基础上增加了"停止 "状态 S S S
d e l t a : Q × Γ → P ( Q × Γ × { L , R , S } ) delta:Q\times\Gamma\rightarrow P(Q\times\Gamma\times\{L,R,S\}) delta:Q×Γ→P(Q×Γ×{L,R,S})

因此计算NTM格局的方式变为了计算树 (拥有多个非确定性分支)

每个非确定性图灵机(NTM)都有等价的确定性图灵机(DTM)!
图灵可识别 ⇔ \Leftrightarrow ⇔可用非确定性图灵机识别!
图灵可判定 ⇔ \Leftrightarrow ⇔可用非确定性图灵机判定!

识别器 :输入 x x x,输出 0 / 1 / ? 0/1/? 0/1/?(停机拒绝/停机接受/不停机 )

判定器:输入 x x x,输出 0 / 1 0/1 0/1(停机拒绝/停机接受,没有不停机 )

转换器:输入 x x x,输出 y y y(输出一个串 而非一位,通常用于计算函数 )

产生器:输入 0 n 0^n 0n,输出 x n x_n xn(生成序列)
枚举器 :输入 ε \varepsilon ε,输出 x 1 , x 2 , x 3 , . . . x_1,x_2,x_3,... x1,x2,x3,...(无输入 ,无遗漏,无多余,无顺序,可重复)

图灵可识别 ⇔ \Leftrightarrow ⇔图灵可枚举!

图灵机算法

对象编码写作< O 1 , O 2 , . . . , O k O_1,O_2,...,O_k O1,O2,...,Ok>,表示对串 O 1 O 2 . . . O k O_1O_2...O_k O1O2...Ok进行一种编码转换。

eg:设定一种对 01 01 01串编码的方式,将所有的字符重复出现1次,多个串拼接时用两个不同的字符作为间隔符拼接。
x = 010 , y = 11 , x=010,y=11, x=010,y=11,< x , y x,y x,y> = 001100101111 =001100101111 =001100101111( 001100 ∣ 10 ∣ 1111 001100|10|1111 001100∣10∣1111)

递归定理

存在可计算函数 q : Σ ∗ → Σ ∗ q:\Sigma^*\rightarrow\Sigma^* q:Σ∗→Σ∗, ∀ w \forall w ∀w, q ( w ) q(w) q(w)是图灵机 P w P_w Pw的描述,单带图灵机 P w P_w Pw打印出 w w w,然后停机。(一个函数如果可计算,则和图灵机等价!)

自我复制机 :自己打印自己的图灵机。 ∀ x , S E L F ( x ) = < S E L F > \forall x,SELF(x)=<SELF> ∀x,SELF(x)=<SELF>(不断地进行自我复制)
递归定理 :假设单带图灵机 T T T有计算函数 t : Σ ∗ × Σ ∗ → Σ ∗ t:\Sigma^*\times\Sigma^*\rightarrow\Sigma^* t:Σ∗×Σ∗→Σ∗,则存在单带自动机 R R R,其计算函数 r : Σ ∗ × Σ ∗ → Σ ∗ r:\Sigma^*\times\Sigma^*\rightarrow\Sigma^* r:Σ∗×Σ∗→Σ∗, ∀ w , r ( w ) = t ( \forall w,r(w)=t( ∀w,r(w)=t(< R R R> , w ) ,w) ,w)

( T T T可以用 R R R来代替,从而实现递归运算,将问题转化)

图灵机接受性问题

定义 A T M = { < M , w > ∣ 图灵机 M 能接受串 w } A_{TM}=\{<M,w>|图灵机M能接受串w\} ATM={<M,w>∣图灵机M能接受串w}
一个图灵机能接受某些给定的串构成的语言, 是图灵可识别的!是不可判定的!

通用机:存在一个固定的图灵机 U U U,对于任意图灵机 M M M与输入 w w w, U ( < M , w > ) = M ( w ) U(<M,w>)=M(w) U(<M,w>)=M(w)

图灵机极小性问题

极小图灵机 :对于图灵机 M M M,其描述的字符< M M M>是最短的。

(因为图灵机有无穷多种,每种都有等价的极小图灵机,因此 M I N T M MIN_{TM} MINTM是无穷语言。)
M I N T M MIN_{TM} MINTM不是图灵可识别!

不动点(x=f(x))

递归定理 的不动点形式:对于 ∀ \forall ∀可计算函数 t : Σ ∗ → Σ ∗ t:\Sigma^*\rightarrow\Sigma^* t:Σ∗→Σ∗,存在一个图灵机 F F F,使得 t ( < F > ) t(<F>) t(<F>)描述一个与 F F F等价的图灵机。

四、可计算问题/不可计算问题

算法可解:存在处处停机 的等价图灵机。

对于正则语言的可判定问题

A D F A = { < B , w > ∣ D F A B 接受串 w } A_{DFA}=\{<B,w>|DFA\ B接受串w\} ADFA={<B,w>∣DFA B接受串w}是可判定语言 。

同理 A N F A A_{NFA} ANFA是可判定语言 。
A R E X = { < R , w > ∣ 正则表达式 R 派生串 w } A_{REX}=\{<R,w>|正则表达式\ R派生串w\} AREX={<R,w>∣正则表达式 R派生串w}是可判定语言 。

(因为DFA、NFA、REX提供给图灵机的都是等价的,图灵机能在这三种之间进行转换)

(DFA空性 ) E D F A = { < A > ∣ A 是 D F A 且 L ( A ) = ∅ } E_{DFA}=\{<A>|A是DFA且L(A)=\empty\} EDFA={<A>∣A是DFA且L(A)=∅}是可判定语言

(DFA等价性 ) E Q D F A = { < A , B > ∣ A 与 B 都是 D F A 且 L ( A ) = L ( B ) } EQ_{DFA}=\{<A,B>|A与B都是DFA且L(A)=L(B)\} EQDFA={<A,B>∣A与B都是DFA且L(A)=L(B)}是可判定语言。

关于上下文无关语言(CFL)的可判定问题

每一个CFL是可判定的!
A C F G = { < G , w > ∣ C F G G 派生串 w } A_{CFG}=\{<G,w>|CFG\ G派生串w\} ACFG={<G,w>∣CFG G派生串w}是可判定语言 。

(CFG空性 ) E C F G = { < G > ∣ C F G G , L ( G ) = ∅ } E_{CFG}=\{<G>|CFG\ G,L(G)=\emptyset\} ECFG={<G>∣CFG G,L(G)=∅}是可判定语言 。

(CFG等价性 ) E Q C F G = { < G , H > ∣ C F G G , H , L ( G ) = L ( H ) } EQ_{CFG}=\{<G,H>|CFG\ G,H,L(G)=L(H)\} EQCFG={<G,H>∣CFG G,H,L(G)=L(H)}是不可判定语言!

不可计算问题

有理数集可数,实数集不可数!

用对角化方法证明不可计算问题

对角化方法:在判定结果图上构造一个非图灵机后观察对角线 上的判定结果。

eg:定义 A T M = { < M , w > ∣ 图灵机 M 能接受串 w } A_{TM}=\{<M,w>|图灵机M能接受串w\} ATM={<M,w>∣图灵机M能接受串w},

证明: A T M A_{TM} ATM不可判定。

证:

那只需用对角化法证明 D T M D_{TM} DTM不可判定。

假设存在图灵机 H H H可判定 A T M A_{TM} ATM,即:
H ( < M > , w ) = { 接受 M 接受 w 拒绝 M 不接受 w H(<M>,w)=\left\{\begin{array}{ll} 接受 & M接受w \\ 拒绝 & M不接受w\end{array}\right. H(<M>,w)={接受拒绝M接受wM不接受w

构造 D D D="对于输入< M M M>, M M M是图灵机"

在输入" M , < M > M,<M> M,<M>"上运行 H H H,如果 H H H接受则拒绝 D D D,反之接受,即:
D ( < M > ) = { 接受 M 不接受 < M > 拒绝 M 接受 < M > D(<M>)=\left\{\begin{array}{ll} 接受 & M不接受<M> \\ 拒绝 & M接受<M>\end{array}\right. D(<M>)={接受拒绝M不接受<M>M接受<M>

(M串是图灵机自己的编码,即所有w中的一部分,即 D T M D_{TM} DTM是 A T M A_{TM} ATM的特例。 )

不妨令 M = D M=D M=D,即:
D ( < D > ) = { 接受 D 不接受 < D > 拒绝 D 接受 < D > D(<D>)=\left\{\begin{array}{ll} 接受 & D不接受<D> \\ 拒绝 & D接受<D>\end{array}\right. D(<D>)={接受拒绝D不接受<D>D接受<D>

显然矛盾,故原命题得证。

如图所示,对于 H ( < M , < M > > ) H(<M,<M>>) H(<M,<M>>), D D D的结果是反过来的,而 D < D > D<D> D<D>上的结果却并不是全部接受。

非图灵可识别语言

对于 A A A和 A A A的补集 A c / A ‾ = Σ ∗ − A A^c/\overline{A}=\Sigma^*-A Ac/A=Σ∗−A,A可判定 ⇔ \Leftrightarrow ⇔A与 A c A^c Ac图灵可识别。 (可判定语言对布尔运算封闭)

归约法

(图灵机的停机问题 ) H A L T T M = { < M , w > ∣ 图灵机 M 在输入 w 上停机 } HALT_{TM}=\{<M,w>|图灵机M在输入w上停机\} HALTTM={<M,w>∣图灵机M在输入w上停机}是不可判定的。

(图灵机空性问题 ) E T M = { < M > ∣ M 是图灵机且 L ( M ) = ∅ } E_{TM}=\{<M>|M是图灵机且L(M)=\emptyset \} ETM={<M>∣M是图灵机且L(M)=∅}是不可判定的 。

(图灵机正则性问题 ) R E G U L A R T M = { < M > ∣ M 为图灵机且 L ( M ) 正则 } REGULAR_{TM}=\{<M>|M为图灵机且L(M)正则\} REGULARTM={<M>∣M为图灵机且L(M)正则}是不可判定的。

(图灵机等价性问题 ) E Q T M = { < M 1 , M 2 > ∣ M 1 和 M 2 是图灵机且 L ( M 1 ) = L ( M 2 ) } EQ_{TM}=\{<M_1,M_2>|M_1和M_2是图灵机且L(M_1)=L(M_2)\} EQTM={<M1,M2>∣M1和M2是图灵机且L(M1)=L(M2)}是不可判定的。

相关推荐
蒸蒸yyyyzwd13 小时前
AI应用相关可能的面试问题
笔记
叼烟扛炮14 小时前
[Git 实战] 学习笔记:从生成 SSH 密钥到解决 TortoiseGit 推送报错全指南
linux·运维·笔记·git·学习
蒸蒸yyyyzwd15 小时前
学习笔记 八股手撕
笔记·学习
揣一尾游鱼yu16 小时前
Spring上(IOC)笔记
java·笔记·spring·ioc
小李不想当小白17 小时前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
瑞码空间19 小时前
JSP与Servlet核心开发与CRUD实战笔记
java·笔记·servlet·jsp
La Pulga20 小时前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
wuyoutrans1 天前
以色列专利OA答复翻译,重点要避开哪些坑?
笔记
宝绿特塑业再生科技1 天前
HDPE再生颗粒户外家具表面粉化机理与改性技术全解析
笔记·户外家具·再生塑料·塑木桌椅
凉、介1 天前
深入理解 ARMv7-A | Generic Timer
笔记·学习·嵌入式·arm