Automata Theory 简明教程
Automata Theory Introduction
Automata – What is it?
术语“自动机”源自希腊语单词“αὐτόματα”,意思是“自作用”。自动机(复数形式为 Automata)是一种抽象的自驱动计算设备,它自动执行预定的操作序列。
具有有限状态数的自动机称为 Finite Automaton (FA) 或 Finite State Machine (FSM)。
Related Terminologies
Alphabet
-
Definition − 一个 alphabet 是任何有限的符号集。
-
Example − ∑ = {a, b, c, d} 是 alphabet set ,其中“a”、“b”、“c”和“d”是 symbols 。
Length of a String
-
Definition −它是一个字符串中存在的符号数。(表示为 |S| )。
-
Examples −如果 S =“cabcad”,则 |S|= 6 如果 |S|= 0,则称为 empty string (表示为 λ 或 ε )。
Kleene Star
-
Definition − 克莱尼星 ∑ * 是符号或字符串集合 ∑ 上的一元运算符,该运算符提供所有可能长度的所有可能字符串的无限集合,包括 ∑ ,包括 λ 。
-
Representation − ∑* = ∑0 ∪ ∑1 ∪ ∑2 ∪……. 其中 ∑p 是所有长度为 p 的可能字符串的集合。
-
Example −如果 ∑ = {a, b},则 ∑* = {λ, a, b, aa, ab, ba, bb,………..}
Deterministic Finite Automaton
有限自动机可分为两类:
-
Deterministic Finite Automaton (DFA)
-
非确定有限自动机(NDFA/NFA)
Deterministic Finite Automaton (DFA)
在 DFA 中,对于每个输入符号,都可以确定机器将移动到的状态。因此,它被称为 Deterministic Automaton 。由于它具有有限数量的状态,因此机器被称为 Deterministic Finite Machine 或 Deterministic Finite Automaton. 。
Non-deterministic Finite Automaton
在 NDFA 中,对于特定的输入符号,机器可以移动到机器中的任何状态组合。换句话说,无法确定机器移动到的确切状态。因此,它称为 Non-deterministic Automaton 。由于它有有限数量的状态,因此机器称为 Non-deterministic Finite Machine 或 Non-deterministic Finite Automaton 。
Formal Definition of an NDFA
NDFA 可以用 5 元组 (Q, ∑, δ, q0, F) 表示,其中−
-
Q 是一个有限的状态集。
-
∑ 是称为字母的符号的有限集合。
-
δ 是过渡函数,其中 δ: Q × ∑ → 2Q(这里取 Q 的幂集 (2Q),因为在 NDFA 的情况下,从一个状态到另一个状态,可以转换为 Q 状态的任何组合)
-
q0 是处理任何输入的初始状态 (q0 ∈ Q)。
-
F 是 Q 的一组终态/状态 (F ⊆ Q)。
Graphical Representation of an NDFA: (same as DFA)
NDFA 由称为状态图的有向图表示。
-
顶点表示状态。
-
带有输入字母标签的弧线表示转换。
-
初始状态由一条空传入弧线表示。
-
终态由双圆圈表示。
Example
令非确定性有限自动机为→
-
Q = {a, b, c}
-
∑ = {0, 1}
-
q0 = {a}
-
F = {c}
过渡函数 δ 如下所示−
Present State |
输入 0 时的下一状态 |
输入 1 时的下一状态 |
a |
a, |
b |
b |
c |
a, c |
c |
b, |
c |
它的图形表示如下−
DFA vs NDFA
下表列出了 DFA 和 NDFA 之间的差异。
DFA |
NDFA |
一个状态的转换对于每个输入符号来说都是到一个单一的特定下一个状态。因此,它称为确定性的。 |
一个状态的转换对于每个输入符号来说都可以到多个下一个状态。因此,它称为非确定性的。 |
空字符串转换在 DFA 中看不到。 |
NDFA 允许空字符串转换。 |
可以在 DFA 中进行回溯。 |
在 NDFA 中,并不总是可以进行回溯。 |
Requires more space. |
Requires less space. |
如果一个字符串转换到一个最终状态,它就会被 DFA 接受。 |
如果所有可能的转换中至少有一个结束于最终状态,一个字符串就会被 NDFA 接受。 |
Acceptability by DFA and NDFA
当 DFA/NDFA 从初始状态开始在完整读取字符串后结束于接受状态(任何最终状态)时,一个字符串才会被 DFA/NDFA 接受。
字符串 S 被 DFA/NDFA (Q, ∑, δ, q0, F) 接受,当且仅当
δ (q0, S) ∈ F*
DFA/NDFA 接受的语言 L 是
{S | S ∈ ∑ 并且 δ*(q0, S) ∈ F}*
如果一个字符串 S′ 不被 DFA/NDFA (Q, ∑, δ, q0, F) 所接受,则
δ (q0, S′) ∉ F*
DFA/NDFA 所不接受的语言 L′(所接受语言 L 的补集)为
{S | S ∈ ∑ and δ*(q0, S) ∉ F}*
Example
我们考虑图 1.3 中所示的 DFA。可以从 DFA 推导出可接受的字符串。
上述 DFA 所接受的字符串:{0, 00, 11, 010, 101, ………..}
上述 DFA 所不接受的字符串:{1, 011, 111, ……..}
NDFA to DFA Conversion
Problem Statement
设 X = (Qx, ∑, δx, q0, Fx) 是接受语言 L(X) 的 NDFA。我们必须设计一个等效 DFA Y = (Qy, ∑, δy, q0, Fy) ,使得 L(Y) = L(X) 。以下过程将 NDFA 转换为其等效 DFA −
DFA Minimization
DFA Minimization using Myhill-Nerode Theorem
Algorithm
Input - DFA
Output - 最小化DFA
Step 1 - 为所有状态对(Qi,Qj)绘制一个表格,不一定直接连接 [所有状态最初都未标记]
Step 2 - 考虑DFA中每个状态对(Qi,Qj),其中Qi ∈ F且Qj ∉ F或反之亦然,并标记它们。[此处的F是结束状态集合]
Step 3 - 重复此步骤,直至无法标记更多状态 -
如果有未标记对(Qi,Qj),如果标记了对于某些输入字母的{δ(Qi,A),δ(Qi,A)},则标记该对。
Step 4 - 组合所有未标记对(Qi,Qj),并使其成为缩小版DFA中的单个状态。
Example
让我们使用算法2来最小化下面显示的DFA。
Step 1 - 为所有状态对绘制一张表格。
a |
b |
c |
d |
e |
f |
|
a |
||||||
b |
||||||
c |
||||||
d |
||||||
e |
||||||
f |
Step 2 - 我们标记状态对。
a |
b |
c |
d |
e |
f |
|
a |
||||||
b |
||||||
c |
✔ |
✔ |
||||
d |
✔ |
✔ |
||||
e |
✔ |
✔ |
||||
f |
✔ |
✔ |
✔ |
Step 3 - 我们将尝试使用绿色勾号标记状态对。如果我们将1输入到状态“a”和“f”,它将分别进入状态“c”和“f”。(c,f)已经标记,因此我们标记对(a,f)。现在,我们将1输入到状态“b”和“f”;它将分别转到状态“d”和“f”。(d,f)已经标记,因此我们标记对(b,f)。
a |
b |
c |
d |
e |
f |
|
a |
||||||
b |
||||||
c |
✔ |
✔ |
||||
d |
✔ |
✔ |
||||
e |
✔ |
✔ |
||||
f |
✔ |
✔ |
✔ |
✔ |
✔ |
在步骤3之后,我们得到了未标记的属性组合{a,b} {c,d} {c,e} {d,e}。
我们可以将{c,d} {c,e} {d,e}重新组合到{c,d,e}中
因此,我们得到了两个组合状态为 - {a,b}和{c,d,e}
因此,最终的最小化DFA将包含三个状态{f}、{a,b}和{c,d,e}
DFA Minimization using Equivalence Theorem
如果X和Y是DFA中的两个状态,如果它们不可区分,我们可以将这两个状态组合成{X,Y}。如果存在至少一个字符串S,则两个状态是可以区分的,即δ(X,S)和δ(Y,S)中的一个被接受,另一个不被接受。因此,当且仅当所有状态都可区分时,DFA才是最小的。
Algorithm 3
Step 1 - 所有状态 Q 被分为两个分区- final states 和 non-final states ,并由 P0 表示。分区中的所有状态都是0等价。获取计数器 k 并将其初始化为0。
Step 2 - 将k增加1。对于Pk中的每个分区,如果状态在Pk中是k可区分的,则将状态划分为两个分区。此分区X和Y中的两个状态在k-可区分,前提是有一个输入 S ,使得 δ(X, S) 和 δ(Y, S) 在(k-1)-可区分。
Step 3 - 如果Pk ≠ Pk-1,则重复步骤2,否则转到步骤4。
Step 4 − 将第 k 个等价集合组合起来,并将它们设定为化简 DFA 的新状态。
Moore and Mealy Machines
有限自动机可以有对应于每个转换的输出。有两种类型的产生输出的有限状态机 -
-
Mealy Machine
-
Moore machine
Mealy Machine
Mealy 机是一种 FSM,其输出取决于当前状态以及当前输入。
它可以用 6 元组 (Q,∑,O,δ,X,q0) 来描述,其中 -
-
Q 是一个有限的状态集。
-
∑ 是一个称为输入字母表的有限的符号集。
-
O 是一个称为输出字母表的有限的符号集。
-
δ 是输入转换函数,其中 δ:Q × ∑ → Q
-
X 是输出转换函数,其中 X:Q × ∑ → O
-
q0 是处理任何输入的初始状态 (q0 ∈ Q)。
Mealy 机的状态表如下所示 -
Present state |
Next state |
input = 0 |
input = 1 |
State |
Output |
State |
Output |
→ |
b |
x1 |
c |
x1 |
b |
b |
x2 |
d |
x3 |
c |
d |
x3 |
c |
x1 |
d |
d |
x3 |
d |
x2 |
上述 Mealy 机的状态图如下 -
Moore Machine
Moore 机是一种 FSM,其输出仅取决于当前状态。
摩尔机可以用 6 元组 (Q, ∑, O, δ, X, q0) 来描述,其中 -
-
Q 是一个有限的状态集。
-
∑ 是一个称为输入字母表的有限的符号集。
-
O 是一个称为输出字母表的有限的符号集。
-
δ 是输入转换函数,其中 δ:Q × ∑ → Q
-
X 是输出转换函数,其中 X: Q → O
-
q0 是处理任何输入的初始状态 (q0 ∈ Q)。
摩尔机的状态表如下所示 -
Present state |
Next State |
Output |
Input = 0 |
Input = 1 |
→ |
b |
c |
x2 |
b |
b |
d |
x1 |
c |
c |
d |
x2 |
d |
d |
d |
x3 |
上述 Moore 机的状态图是 −
Mealy Machine vs. Moore Machine
下表重点介绍了 Mealy 机与 Moore 机之间的不同点。
Mealy Machine |
Moore Machine |
输出既取决于当前状态,又取决于当前输入 |
输出仅取决于当前状态。 |
通常,它比 Moore 机状态更少。 |
通常,它比 Mealy 机状态更多。 |
输出函数的值是转化的函数,以及当对当前状态进行输入逻辑时变化。 |
输出函数的值是电流状态与时钟沿变化的函数,每当发生状态变化时。 |
Mealy 机对输入反应较快。它们通常在同一个时钟周期里做出反应。 |
在 Moore 机中,需要更多的逻辑来对输出进行解码,这会导致更多的电路延迟。它们通常在下一个时钟周期才做出反应。 |
Moore Machine to Mealy Machine
Algorithm 4
Input − Moore 机
Output − Mealy 机
Step 1 − 采用一个空白的 Mealy 机转移状态表格式。
Step 2 − 将所有 Moore 机转移状态复制到此表格式中。
Step 3 − 检查 Moore 机状态表中的当前状态及其相应的输出;如果某个状态 Q 的输出为 m,将其复制到 Mealy 机状态表输出栏,Qi 出现于下一个状态的任何地方。
Example
让我们考虑以下 Moore 机 −
Present State |
Next State |
Output |
a = 0 |
a = 1 |
→ |
d |
b |
1 |
b |
a |
d |
0 |
c |
c |
c |
0 |
d |
b |
a |
1 |
现在我们将算法 4 应用于将其转换到 Mealy 机。
Step 1 & 2 −
Present State |
Next State |
a = 0 |
a = 1 |
State |
Output |
State |
Output |
→ |
d |
b |
|
b |
|
a |
|
d |
|
c |
c |
c |
|
d |
|
b |
|
a |
Step 3 -
Present State |
Next State |
a = 0 |
a = 1 |
State |
Output |
State |
Output |
⇒ |
d |
1 |
b |
0 |
b |
a |
1 |
d |
1 |
c |
c |
0 |
c |
0 |
d |
b |
0 |
a |
1 |
Mealy Machine to Moore Machine
Algorithm 5
Input − Mealy 机
Output − 穆尔机
Step 1 − 计算 Mealy 机状态表中每个状态 (Qi) 可用不同输出数。
Step 2 − 如果 Qi 的所有输出相同,复制状态 Qi。如果它有 n 个不同的输出,将 Qi 分解为 n 个状态,其中 Qin n = 0, 1, 2……。
Step 3 − 如果初始状态的输出为 1,在开头插入一个新的初始状态,其输出为 0。
Example
让我们考虑一下以下 Mealy 机 −
Present State |
Next State |
a = 0 |
a = 1 |
Next State |
Output |
Next State |
Output |
→ |
d |
0 |
b |
1 |
b |
a |
1 |
d |
0 |
c |
c |
1 |
c |
0 |
d |
b |
0 |
a |
1 |
此处,状态“a”和“d”分别仅提供输出 1 和 0,因此我们保留状态“a”和“d”。但状态“b”和“c”产生不同的输出(1 和 0)。因此,我们将 b 划分为 b0, b1 和 c 划分为 c0, c1 。
Present State |
Next State |
Output |
a = 0 |
a = 1 |
→ |
d |
b1 |
1 |
b0 |
a |
d |
0 |
b1 |
a |
d |
1 |
c0 |
c1 |
C0 |
0 |
c1 |
c1 |
C0 |
1 |
d |
b0 |
Introduction to Grammars
在术语的文学意义上,语法指示自然语言会话的语法规则。自英语、梵语、汉语等自然语言诞生以来,语言学就尝试定义语法。
形式语言理论在大幅度上发现计算机科学领域中的适用性。 Noam Chomsky 在 1956 年给出了语法的数学模型,该模型可有效书写计算机语言。
Grammar
语法 G 可以形式化为一个 4 元组 (N、T、S、P),其中 −
-
N 或 VN 是变量或非终结符号的集合。
-
T 或 ∑ 是终结符号的集合。
-
S 是一个称为开始符号的特殊变量,S ∈ N
-
P 是针对终结符号和非终结符号的生成规则。生成规则的格式为 α → β,其中的 α 和 β 是 VN ∪ ∑ 上的字符串,且 α 的至少一个符号属于 VN。
Language Generated by a Grammar
{am bn | m ≥ 1 and n ≥ 1}
Construction of a Grammar Generating a Language
我们将考虑一些语言,并将其转换为生成那些语言的语法 G。
Example
Problem − 假设,L (G) = {am bn | m ≥ 0 且 n > 0}。我们必须找出生成 L(G) 的语法 G 。
Solution
由于 L(G) = {am bn | m ≥ 0 且 n > 0}
可以将可接受字符串集重写为 −
L(G) = {b、ab、bb、aab、abb、…….}
这里,起始符号必须至少带有一个“b”,前面可以有任意数量的“a”,包括空串。
为了接受字符串集 {b、ab、bb、aab、abb、……},我们采用了以下产生式 −
S → aS,S → B,B → b 且 B → bB
S → B → b(已接受)
S → B → bB → bb(已接受)
S → aS → aB → ab(已接受)
S → aS → aaS → aaB → aab(已接受)
S → aS → aB → abB → abb(已接受)
因此,我们可以证明 L(G) 中的每个字符串都由生成集合所生成的语义接受。
因此语法 −
G: ({S, A, B}, {a, b}, S, {S → aS | B , B → b | bB })
Example
Problem − 假设,L (G) = {am bn | m > 0 和 n ≥ 0}。我们必须找出生成 L(G) 的语法 G。
Solution −
因为 L(G) = {am bn | m > 0 和 n ≥ 0},可接受的字符串集可重新写为 −
L(G) = {a, aa, ab, aaa, aab ,abb, …….}
此处,起始符号必须至少取一个“a”,后跟任意数量的“b”,包括零。
为接受字符串集 {a, aa, ab, aaa, aab, abb, …….}, 我们取了下面这些生成 −
S → aA, A → aA , A → B, B → bB ,B → λ
S → aA → aB → aλ → a (接受)
S → aA → aaA → aaB → aaλ → aa (接受)
S → aA → aB → abB → abλ → ab (接受)
S → aA → aaA → aaaA → aaaB → aaaλ → aaa (接受)
S → aA → aaA → aaB → aabB → aabλ → aab (接受)
S → aA → aB → abB → abbB → abbλ → abb (接受)
因此,我们可以证明 L(G) 中的每个字符串都由生成集合所生成的语义接受。
因此语法 −
G: ({S, A, B}, {a, b}, S, {S → aA, A → aA | B, B → λ | bB })
Chomsky Classification of Grammars
根据诺姆·乔姆斯基,语法有四种类型——第 0 类、第 1 类、第 2 类和第 3 类。下表显示了它们彼此之间的差异 -
Grammar Type |
Grammar Accepted |
Language Accepted |
Automaton |
Type 0 |
Unrestricted grammar |
Recursively enumerable language |
Turing Machine |
Type 1 |
Context-sensitive grammar |
Context-sensitive language |
Linear-bounded automaton |
Type 2 |
Context-free grammar |
Context-free language |
Pushdown automaton |
Type 3 |
Regular grammar |
Regular language |
Finite state automaton |
看看以下插图。它显示了每种语法类型的范围 -
Type - 3 Grammar
q4 生成正则语言。Type-3 语法必须在左侧有一个非终结符,在右侧有一个终结符或一个终结符后跟一个非终结符。
产生式必须采用以下形式 Type-3 grammars
其中 X → a or X → aY (非终结符)
和 X, Y ∈ N (终结符)
规则 a ∈ T 被允许,如果 S → ε 不出现在任何规则的右侧。
Type - 2 Grammar
Type-2 grammars 生成上下文无关语言。
产生式应为 A → γ 形式
其中*A ∈ N*(非终结符)
和 γ ∈ (T ∪ N) *(终结符和非终结符串)。
由这些语法生成的这些语言可被非确定性下推自动机识别。
Regular Expressions
A Regular Expression 可按照以下方式递归定义 −
-
ε 是表示包含空字符串的语义的正则表达式。 (L (ε) = {ε})
-
φ 是表示空语义的正则表达式。 (L (φ) = { })
-
x 是正则表达式,其中 L = {x}
-
如果 X 是表示语言 L(X) 的正则表达式,而 Y 是表示语言 L(Y) 的正则表达式,则 X + Y 是对应于语言 L(X) ∪ L(Y) 的正则表达式,其中 L(X+Y) = L(X) ∪ L(Y) 。 X . Y 是对应于语言 L(X) . L(Y) 的正则表达式,其中 L(X.Y) = L(X) . L(Y) R 是对应于语言 L(R 的正则表达式) where *L(R ) = (L®)*
-
如果从 1 到 5 多次应用任何规则,它们就是正则表达式。
Some RE Examples
Regular Expressions |
Regular Set |
(0 + 10*) |
L = {0, 1, 10, 100, 1000, 10000, …} |
(0*10*) |
L = {1, 01, 10, 010, 0010, …} |
(0 + ε)(1 + ε) |
L = {ε, 0, 1, 01} |
(a+b)* |
包括空串在内的任意长度的 a 和 b 的字符串集合。所以 L = {ε, a, b, aa , ab , bb , ba, aaa…….} |
(a+b)*abb |
以字符串 abb 结尾的 a 和 b 的字符串集合。所以 L = {abb, aabb, babb, aaabb, ababb, …………..} |
(11)* |
包括空串在内的偶数个 1 的集合,所以 L= {ε, 11, 1111, 111111, ……….} |
(aa)*(bb)*b |
由偶数个 a 后跟奇数个 b 组成的字符串集合,所以 L = {b, aab, aabbb, aabbbbb, aaaab, aaaabbb, …………..} |
(aa + ab + ba + bb)* |
偶数长度的 a 和 b 的字符串可以通过连接包括空串在内的 aa、ab、ba 和 bb 的任意组合获得,所以 L = {aa, ab, ba, bb, aaab, aaba, …………..} |
Regular Sets
任何表示正则表达式值的集合都被称为 Regular Set.
Properties of Regular Sets
Property 1 . 两个正则集的并集是正则。
Proof −
让我们取两个正则表达式
RE1 = a(aa),RE2 = (aa)
所以,L1 = {a, aaa, aaaaa,…..}(不包括 Null 的奇数长度字符串)
且 L2 ={ ε, aa, aaaa, aaaaaa,…….} (包括 Null 的偶数长度字符串)
L1 ∪ L2 = { ε, a, aa, aaa, aaaa, aaaaa, aaaaaa,…….}
(包括 Null 的所有可能长度的字符串)
RE (L1 ∪ L2) = a* (本身就是一个正则表达式)
Hence, proved.
Property 2. 两个正则集的交集是正则。
Proof −
让我们取两个正则表达式
RE1 = a(a*),RE2 = (aa)*
所以,L1 = { a,aa, aaa, aaaa, ….} (不包括 Null 的所有可能长度字符串)
L2 = { ε, aa, aaaa, aaaaaa,…}(包含空字符串的偶数长度字符串)
L1 ∩ L2 = { aa, aaaa, aaaaaa,…}(不包含空字符串的偶数长度字符串)
RE (L1 ∩ L2) = aa(aa)*,本身是一个正则表达式。
Hence, proved.
Property 3. 一个正则集合的补集是正则的。
Proof −
我们取正则表达式−
RE = (aa)*
所以,L = {ε, aa, aaaa, aaaaaa, …}(包含空字符串的偶数长度字符串)
L 的补集是不在 L 中的所有字符串。
所以,L’ = {a, aaa, aaaaa, …}(不包含空字符串的奇数长度字符串)
RE (L’) = a(aa)*,本身是一个正则表达式。
Hence, proved.
Property 4. 两个正则集合的差是正则的。
Proof −
我们取两个正则表达式−
RE1 = a (a*) 和 RE2 = (aa)*
所以,L1 = {a, aa, aaa, aaaa, …}(包含所有可能的长度且不包含空字符串的字符串)
L2 = { ε, aa, aaaa, aaaaaa,…}(包含空字符串的偶数长度字符串)
L1 – L2 = {a, aaa, aaaaa, aaaaaaa, …}
(不包含空字符串的所有奇数长度字符串)
RE (L1 – L2) = a (aa)*,是一个正则表达式。
Hence, proved.
Property 5. 一个正则集合的反转是正则的。
Proof −
我们要证明 LR 也是正则的,如果 L 是一个正则集合。
令 L = {01,10,11,10}
RE (L) = 01 + 10 + 11 + 10
LR = {10,01,11,01}
RE (LR) = 01 + 10 + 11 + 10 为正则语言
Hence, proved.
Property 6. 正则集合的闭包为正则语言。
Proof −
如果 L = {a, aaa, aaaaa, …….} (长度为奇数且不含空集合的字符串),
即 RE (L) = a (aa)*
L* = {a, aa, aaa, aaaa , aaaaa,……………} (长度可为任意正整数且不含空集合的字符串)
RE (L*) = a (a)*
Hence, proved.
Property 7. 两个正则集合的连接为正则语言。
Proof −
令 RE1 = (0+1) 0 and RE2 = 01(0+1)
此处,L1 = {0, 00, 10, 000, 010, ……} (以 0 结尾的字符串集合)
且 L2 = {01, 010,011,…..} (以 01 开头的字符串集合)
则 L1 L2 = {001,0010,0011,0001,00010,00011,1001,10010,………….}
包含 001 作为子串的字符串集合,可以用正则表达式表示为 − (0 + 1) 001(0 + 1)
因此得证。
Identities Related to Regular Expressions
给出正则表达式 R, P, L, Q,则有如下恒等式:
-
∅* = ε
-
ε* = ε
-
RR* = R*R
-
R*R* = R*
-
(R*)* = R*
-
RR* = R*R
-
(PQ)P =P(QP)
-
(a+b)* = (a*b*)* = (a*+b*)* = (a+b*)* = a*(ba*)*
-
R + ∅ = ∅ + R = R (并集的恒等式)
-
R ε = ε R = R(连接的同一性)
-
∅ L = L ∅ = ∅(连接的零化器)
-
R + R = R(幂等律)
-
L(M + N)= LM + LN(左分配率)
-
(M + N)L = ML + NL(右分配率)
-
ε + RR* = ε + R*R = R*
Arden’s Theorem
为了找出有限自动机的正则表达式,我们使用 Arden 定理以及正则表达式的性质。
Statement -
设 P 和 Q 是两个正则表达式。
如果 P 不包含 null 字符串,则 R = Q + RP 具有唯一解 R = QP *
Proof −
R = Q + (Q + RP)P [在代入了 R = Q + RP 之后]
Q + QP + RPP
当我们不断递归地代入 R 的值时,我们得到以下方程 -
R = Q + QP + QP2 + QP3…..
R = Q (ε + P + P2 + P3 + …. )
R = QP* [因为 P* 表示 (ε + P + P2 + P3 + ….) ]
因此得证。
Assumptions for Applying Arden’s Theorem
-
转换图不得包含 NULL 转换
-
它只能有一个初始状态
Method
Step 1 - 对于所有具有 n 个状态的 DFA 状态(初始状态为 q1),创建以下形式的方程。
q1 = q1R11 + q2R21 + … + qnRn1 + ε
q2 = q1R12 + q2R22 + … + qnRn2
…………………………
…………………………
…………………………
…………………………
qn = q1R1n + q2R2n + … + qnRnn
Rij 表示从 qi 到 qj 的边的标签集合,如果不存在这样的边,则 Rij = ∅
Step 2 — 求解这些方程式,以 Rij 的形式获得最终状态方程式
Problem
构造与以下给定自动机相对应的正则表达式 −
Solution −
此处初始状态和最终状态为 q1 。
三个状态 q1、q2 和 q3 的方程式如下 −
q1 = q1a + q3a + ε(ε 移动是因为 q1 是初始状态 0
q2 = q1b + q2b + q3b
q3 = q2a
现在,我们将求解这三个方程式 −
q2 = q1b + q2b + q3b
q1b + q2b + (q2a)b (Substituting value of q3)
q1b + q2(b + ab)
q1b (b + ab)* (Applying Arden’s Theorem)
q1 = q1a + q3a + ε
q1a + q2aa + ε (Substituting value of q3)
q1a + q1b(b + ab*)aa + ε (Substituting value of q2)
q1(a + b(b + ab)*aa) + ε
ε (a+ b(b + ab)aa)
(a + b(b + ab)aa)
因此,正则表达式为 (a + b(b + ab) aa) 。
Problem
构造与以下给定自动机相对应的正则表达式 −
Solution −
此处初始状态为 q1,最终状态为 q2
现在我们写下方程式 −
q1 = q10 + ε
q2 = q11 + q20
q3 = q21 + q30 + q31
现在,我们将求解这三个方程式 −
q1 = ε0* [,εR = R]
所以,q1 = 0*
q2 = 0*1 + q20
所以,q2 = 0*1(0)* [由艾登定理]
因此,正则表达式为 0*10*。
Construction of an FA from an RE
我们可以使用汤普森构建法发现一个由正则表达式构造的有穷自动机。我们将正则表达式简化为最小的正则表达式,然后将这些表达式转换为 NFA,最后转换为 DFA。
一些基本的 RA 表达式为:
Case 1 -对于正则表达式“a”,我们可以构造以下 FA -
Case 2 − 对于正则表达式“ab”,我们可以构建以下 FA −
Case 3 − 对于正则表达式 (a+b),我们可以构建以下 FA −
Case 4 − 对于正则表达式 (a+b)*,我们可以构建以下 FA −
Method
Step 1 根据给定的正则表达式构建一个带有空动作的 NFA。
Step 2 从 NFA 中删除空转换,并将其转换成等效的 DFA。
Problem
将以下 RA 转换成等效的 DFA − 1 (0 + 1)* 0
Solution
我们将三个表达式“1”、“(0 + 1)*”和“0”连接在一起
现在我们将删除 ε 转换。从 NDFA 中删除 ε 转换后,我们得到以下结果 −
它是与 RE − 1 (0 + 1)* 0 相对应的 NDFA。如果你想将其转换成 DFA,只需应用第 1 章中讨论的 NDFA 到 DFA 的转换方法。
Finite Automata with Null Moves (NFA-ε)
带有空动作的有限自动机 (FA-ε) 不仅在从字母集合提供输入后进行转换,还可以在没有输入符号的情况下进行转换。这种没有输入的转换称为 null move 。
NFA-ε 由一个 5 元组(Q、∑、δ、q0、F)正式表示,其中包括
-
Q − 一组有限的状态
-
∑ − 一组有限的输入符号
-
δ − 一个转换函数 δ:Q ×(∑ ∪ {ε})→ 2Q
-
q0 − 一个初始状态 q0 ∈ Q
-
F − Q 的一组最终状态/状态(F⊆Q)。
上述 (FA-ε) 接受一个字符串集合 − {0, 1, 01}
Removal of Null Moves from Finite Automata
如果在 NDFA 中,存在从顶点 X 到顶点 Y 的 ϵ 动作,我们可以使用以下步骤将其删除 −
-
查找从 Y 出发所有出边。
-
从 X 开始复制所有这些边,而不会更改边标签。
-
如果 X 是初始状态,则使 Y 也为初始状态。
-
如果 Y 是终止状态,那么也使 X 成为终止状态。
Problem
将以下 NFA-ε 转换为没有空移动的 NFA。
Solution
Step 1 -
这里 ε 转换在 q1 和 q2 之间,所以让 q1 等于 X ,而 qf 等于 Y 。
这里从 qf 出发到 qf 的输出边针对输入 0 和 1。
Step 2 -
现在,我们将从 q1 复制所有这些边,而不会更改从 qf 分出的边,并获得以下 FA −
Step 3 -
这里 q1 是一个初始状态,所以我们也将 qf 设置为初始状态。
因此 FA 变成 −
Step 4 -
这里 qf 是一个终止状态,因此我们也将 q1 设置为终止状态。
因此 FA 变成 −
Pumping Lemma For Regular Grammars
Theorem
设 L 是正则语言。那么存在常量 ‘c’ 使得对于 L 中的每个字符串 w −
|w| ≥ c
我们可以把 w 分成三个字符串 w = xyz ,使得 −
-
|y| > 0
-
|xy| ≤ c
-
对于所有的 k ≥ 0,字符串 xykz 也在 L 中。
Applications of Pumping Lemma
抽取引理用于证明某些语言不是正则的。它不应该被用来证明语言是正则的。
-
如果 L 是正则的,则它满足抽取引理。
-
如果 L 不满足抽空定理,它是非正则的。
Method to prove that a language L is not regular
-
首先,我们必须假设 L 是正则的。
-
因此,抽空定理应在 L 中成立。
-
使用抽空定理得到一个矛盾 − 选择 w 使得 |w| ≥ c 选择 y 使得 |y| ≥ 1 选择 x 使得 |xy| ≤ c 将剩余字符串分配给 z. 选择 k 使得结果字符串不在 L. 中
Hence L is not regular.
Problem
证明 L = {aibi | i ≥ 0} 不是正则的。
Solution −
-
首先,我们假设 L 是正则的,并且 n 是状态数。
-
令 w = anbn。因此 |w| = 2n ≥ n。
-
根据抽空定理,令 w = xyz,其中 |xy| ≤ n。
-
令 x = ap,y = aq 和 z = arbn,其中 p + q + r = n,p ≠ 0,q ≠ 0,r ≠ 0。因此 |y| ≠ 0。
-
令 k = 2。则 xy2z = apa2qarbn。
-
as 的数量 = (p + 2q + r) = (p + q + r) + q = n + q
-
因此,xy2z = an+q bn。由于 q ≠ 0,xy2z 不是 anbn 的形式。
-
因此,xy2z 不在 L 中。因此 L 不是正则的。
DFA Complement
如果 (Q, ∑, δ, q0, F) 是接受语言 L 的 DFA,则可以通过将接受状态与非接受状态以及反之互换来获得 DFA 的补集。
我们将举例并在下面详细说明 −
此 DFA 接受语言
L = {a, aa, aaa , …………. }
在字母表上
∑ = {a, b}
所以,RE = a+。
现在,我们将它的接受状态与其不接受状态互换,反之亦然,并且将获得以下状态:
此 DFA 接受语言
Ľ = {ε, b, ab、bb、ba、…………… }
在字母表上
∑ = {a, b}
Note - 如果我们希望对 NFA 求补,我们必须首先将其转换为 DFA,然后像在前面的方法中一样交换状态。
Context-Free Grammar Introduction
Definition - 上下文无关文法 (CFG) 由一组有限的文法规则组成,是四元组 (N, T, P, S) ,其中
-
N 是非终结符符号的集合。
-
T 是终结符的集合,其中 N ∩ T = NULL.
-
P 是规则的集合, P: N → (N ∪ T) ,即产生规则 P 的左手边没有任何右上下文或左上下文。
-
S 是起始符号。
Example
-
文法 ({A}, {a, b, c}, P, A),P:A → aA,A → abc。
-
文法 ({S, a, b}, {a, b}, P, S),P:S → aSa,S → bSb,S → ε
-
文法 ({S, F}, {0, 1}, P, S),P:S → 00S | 11F,F → 00F | ε
Generation of Derivation Tree
导出树或解析树是有序的根树,可以直观地表示从上下文无关文法导出的字符串的语义信息。
Representation Technique
-
Root vertex - 必须由起始符号标记。
-
Vertex - 由非终结符符号标记。
-
Leaves - 由终结符符号或 ε 标记。
如果 S → x1x2 …… xn 是 CFG 中的一条产生规则,则解析树/导出树如下:
绘制导出树有两种不同的方法:
Top-down Approach −
-
从开始符号 S 开始
-
通过产生使用生产来降低到树叶
Bottom-up Approach −
-
Starts from tree leaves
-
向上转换到根,这是开始符号 S
Derivation or Yield of a Tree
解析树的导出或产生的最终字符串通过从左到右串联树的叶子的标签获得,而忽略空值。然而,如果所有叶子都是空值,那么派生就是空值。
Example
令 CFG 为 {N,T,P,S}
N = {S}, T = {a, b}, 开始符号 = S, P = S → SS | aSb | ε
上述 CFG 的一个派生是“abaabb”
S → SS → aSbS → abS → abaSb → abaaSbb → abaabb
Sentential Form and Partial Derivation Tree
部分派生树是派生树/解析树的一个子树,使得它的所有子组件都在子树中,或者它们都不在子树中。
Example
在任何 CFG 中,如果生成是 -
S → AB, A → aaA | ε, B → Bb| ε
部分派生树可以是以下 -
如果部分派生树包含根 S,则称为 sentential form 。上述子树也是以句子形式出现的。
Leftmost and Rightmost Derivation of a String
-
Leftmost derivation - 通过在每一步中将生成应用到最左边的变量来获得最左边的派生。
-
Rightmost derivation - 通过在每一步中将生成应用到最右边的变量来获得最右边的派生。
Example
设 CFG 中的任何一组生成规则
X → X+X | X*X |X| a
在一个字母表 {a} 中。
字符串 "a+a*a" 最左侧推导可能如下 −
X → X+X → a+X → a + X*X → a+a*X → a+a*a
以上字符串逐步推导如下 −
字符串 "a+a*a" 最右侧推导可能如下 −
X → X*X → X*a → X+X*a → X+a*a → a+a*a
以上字符串逐步推导如下 −
Left and Right Recursive Grammars
在一个上下文无关文法中 G ,如果有一个形式为 X → Xa 的产生式,其中 X 是一个非终结符, ‘a’ 是一个终结符字符串,它被称为 left recursive production 。具有左递归产生式的文法称为 left recursive grammar 。
而如果在一个上下文无关文法中 G ,如果有一个形式为 X → aX 的产生式,其中 X 是一个非终结符, ‘a’ 是一个终结符字符串,它被称为 right recursive production 。具有右递归产生式的文法称为 right recursive grammar 。
Ambiguity in Context-Free Grammars
如果某个无上下文文法 G 对于某个字符串 w ∈ L(G) 有多个派生树,则称其为 ambiguous grammar 。从该文法生成的某个字符串存在多个最右或最左派生。
CFL Closure Property
无上下文语言在 − 下为 closed
-
Union
-
Concatenation
-
Kleene Star operation
Kleene Star
若 L 是上下文无关语言,那么 L* 也是上下文无关语言。
Example
设 L = { anbn ,n ≥ 0}。对应的文法 G 将具有 P: S → aAb| ε
Kleene 星号 L1 = { anbn }*
对应的文法 G1 将具有附加产生式 S1 → SS1 | ε
上下文无关语言在 − 下属于 not closed
-
Intersection − 如果 L1 和 L2 是上下文无关语言,那么 L1 ∩ L2 不一定是上下文无关语言。
-
Intersection with Regular Language − 如果 L1 是正则语言,L2 是上下文无关语言,那么 L1 ∩ L2 是上下文无关语言。
-
Complement − 如果 L1 是上下文无关语言,那么 L1' 可能不是上下文无关语言。
CFG Simplification
在一个 CFG 中,所有产生式和符号可能不一定都用于推导字符串。此外,可能存在一些空产生式和单位产生式。消除这些产生式和符号被称为 simplification of CFGs 。简化主要包括以下步骤 −
-
Reduction of CFG
-
Removal of Unit Productions
-
Removal of Null Productions
Reduction of CFG
CFG 分为两个阶段来简化 −
Phase 1 − 从 CFG G 推导出一个等价文法 G’ ,使得每个变量都推导出某个终结符字符串。
Derivation Procedure −
步骤 1 − 包含所有推导出某个终结符的符号 W1 ,并初始化 i=1 。
步骤 2 − 包含所有推导出 Wi 的符号 Wi+1 。
步骤 3 − 增加 i 并重复步骤 2,直到 Wi+1 = Wi 。
步骤 4 − 包含所有包含 Wi 的产生式。
Phase 2 − 从 CFG G’ 推导出一个等价文法 G” ,使得每个符号都出现在句式中。
Derivation Procedure −
步骤 1 − 将起始符号包含在 Y1 中,并初始化 i = 1 。
步骤 2 − 包含所有可以从 Yi 推导出的符号 Yi+1 ,并包含所有已经应用的产生式。
步骤 3 − 增加 i 并重复步骤 2,直到 Yi+1 = Yi 。
Solution
Phase 1 −
T = {a, c, e}
根据产生式 A → a, C → c 和 E →aAa,W1 = {A, C, E}
根据产生式 S → AC,W2 = { A, C, E } U { S }
W3 = {A, C, E, S} U ∅
由于 W2 = W3,我们可以推导出 G' 为:
G' = {{A, C, E, S}, {a, c, e}, P, {S}}
其中 P:S → AC,A → a,C → c,E → aA | e
Phase 2 −
根据产生式 S → AC,Y1 = {S}
Y2 = {S, A, C}
根据产生式 A → a 和 C → c,Y3 = {S, A, C, a, c}
Y4 = {S, A, C, a, c}
由于 Y3 = Y4,我们可以推导出 G'' 为:
G'' = {{A, C, S}, {a, c}, P, {S}}
其中 P:S → AC,A → a,C → c
Removal of Unit Productions
任何形式为 A → B 的产生式,其中 A, B ∈ 非终结符被称作 unit production. 。
Removal Procedure −
Step 1 − 要消除 A → B ,只要在语法中出现 B → x 时,就添加到语法规则中产生式 A → x 。[x ∈ 终结符,x 可以为空]
Step 2 ——从语法中删除 A → B 。
Step 3 ——从步骤 1 开始重复,直到删除所有单位产生式。
Problem
从以下内容中删除单位产生式 -.
S → XY、X → a、Y → Z | b、Z → M、M → N、N → a
Solution −
语法中有 3 个单位产生式-
Y → Z、Z → M和 M → N
At first, we will remove M → N.
由于 N → a,我们添加 M → a,并删除 M → N。
产生式集变为
S → XY、X → a、Y → Z | b、Z → M、M → a、N → a
Now we will remove Z → M.
由于 M → a,我们添加 Z→ a,并删除 Z → M。
产生式集变为
S → XY、X → a、Y → Z | b、Z → a、M → a、N → a
Now we will remove Y → Z.
由于 Z → a,我们添加 Y→ a,并删除 Y → Z。
产生式集变为
S → XY、X → a、Y → a | b、Z → a、M → a、N → a
现在 Z、M和 N 不可达,因此我们可以删除它们。
最终的 CFG 没有单位产生式 -.
S → XY、X → a、Y → a | b
Removal of Null Productions
在 CFG 中,非终结符 ‘A’ 是一个空值变量,如果存在产生式 A → ε 或存在从 A 开始最终以
ε: A → …….… → ε
Removal Procedure
Step 1 结束的推导 - 找出导出 ε 的空值非终结符变量。
Step 2 - 对于每个产生式 A → a ,构建所有产生式 A → x ,其中 x 是通过从步骤 1 中移除一个或多个非终结符从 ‘a’ 获得的。
Step 3 - 将原始产生式与步骤 2 的结果合并,并移除 ε - productions 。
Problem
从以下内容中移除空值产生式 -
S → ASA | aB | b, A → B, B → b | ∈
Solution −
有两个空值变量 - A 和 B
At first, we will remove B → ε.
移除 B → ε 后,产生式集变为 -
S→ASA | aB | b | a,A ε B| b | &epsilon,B → b
Now we will remove A → ε.
去掉 A → ε 后,产生式集变为−
S→ASA | aB | b | a | SA | AS | S,A → B| b,B → b
这是去除空串转换的最终产生式集。
Chomsky Normal Form
如果产生式满足以下形式,则一个 CFG 处于乔姆斯基范式−
-
A → a
-
A → BC
-
S → ε
其中 A、B 和 C 是非终结符,而 a 是终结符。
Algorithm to Convert into Chomsky Normal Form −
Step 1 − 如果起始符号 S 出现在某个右侧,创建一个新的起始符号 S’ 和一个新的产生式 S’→ S 。
Step 2 − 删除空产生式。(使用前面讨论的空产生式消除算法)
Step 3 − 删除单位产生式。(使用前面讨论的单位产生式消除算法)
Step 4 − 替换每个将 n > 2 替换成 A → B1C 产生的 A → B1…Bn ,将 C → B2 …Bn 替换成 A → B1C 。对右侧有两个或更多符号的每个产生式重复此步骤。
Step 5 − 如果任何产生式的右侧形式为 A → aB ,其中 a 是一个终结符且 A, B 是非终结符,那么该产生式被替换为 A → XB 和 X → a 。对形式为 A → aB 的每个产生式重复此步骤。
Solution
(1) 因为 S 出现在 R.H.S 中,我们添加一个新状态 S0 , S0→S 被添加到产生式集中并变为 −
S0→S, S→ ASA | aB, A → B | S, B → b | ∈
(2) 现在我们将删除空发生式 −
B → ∈和 A → ∈
在删除了 B → ε 后,产生式集变为 −
S0→S, S→ ASA | aB | a, A → B | S | ∈, B → b
在删除了 A → ∈ 后,产生式集变为 −
S0→S, S→ ASA | aB | a | AS | SA | S, A → B | S, B → b
(3) 现在我们将删除单元产生式。
在删除了 S → S 后,产生式集变为 −
S0→S, S→ ASA | aB | a | AS | SA, A → B | S, B → b
在删除了 S0→ S 后,产生式集变为 −
S0→ ASA | aB | a | AS | SA, S→ ASA | aB | a | AS | SA
A → B | S, B → b
在删除了 A→ B 后,产生式集变为 −
S0 → ASA | aB | a | AS | SA, S→ ASA | aB | a | AS | SA
A → S | b
B→b
移除 A→S 后,产生式集合变为 −
S0 → ASA | aB | a | AS | SA, S→ ASA | aB | a | AS | SA
A→b |ASA | aB | a | AS | SA,B→b
(4) 现在我们将寻找 R.H.S 中有多个变量的项
此处,S0→ASA、S→ASA、A→ASA 违反了 R.H.S 中的两个非终结符。
因此,我们将应用步骤 4 和步骤 5 来获得以下在 CNF 中的最终产生式集合 −
S0→AX | aB | a | AS | SA
S→AX | aB | a | AS | SA
A→b |AX | aB | a | AS | SA
B→b
X→SA
(5) 我们必须更改产生式 S0→aB、S→aB、A→aB
最终产生式集合变为 −
S0→AX | YB | a | AS | SA
S→AX | YB | a | AS | SA
A→b A→b |AX | YB | a | AS | SA
B→b
X→SA
Y→a
Greibach Normal Form
如果产生式具有以下形式,则 CFG 处于 Greibach 范式中 −
A → b
A → bD1…Dn
S → ε
其中 A、D1、…、Dn 是非终结符,b 是终结符。
Algorithm to Convert a CFG into Greibach Normal Form
Step 1 − 如果起始符号 S 出现于某个右侧,创建一个新起始符号 S’ 和一个新产生式 S’ → S 。
Step 2 − 删除空产生式。(使用前面讨论的空产生式消除算法)
Step 3 − 删除单位产生式。(使用前面讨论的单位产生式消除算法)
Step 4 − 删除所有直接和间接左递归。
Step 5 − 适当替换产生式以将其转换为 GNF 的正确形式。
Solution
在此, S 未出现在任何产生式的右侧,且产生式规则集中不存在单元或空产生式。因此,我们可以跳过步骤 1 到步骤 3。
Step 4
现在,替换以下内容:
S → XY | Xo | p
带有
mX | m
我们得到:
S → mXY | mY | mXo | mo | p。
然后替换以下内容:
Y → Xn | o
为
X → mX | m
我们得到:
Y → mXn | mn | o。
两个新的产生式 O → o 和 P → p 被添加到产生式集中,然后我们得出最终的 GNF,如下所示:
S → mXY | mY | mXC | mC | p
X → mX | m
Y → mXD | mD | o
O → o
P → p
Pumping Lemma for CFG
Pushdown Automata Introduction
Basic Structure of PDA
下推自动机是一种以与我们为正规语法设计DFA类似的方式实现无上下文语法的途径。一个DFA可以记忆有限量的信息,而一个PDA可以记忆无限量的信息。
基本上,下推自动机为 −
"Finite state machine" + "a stack"
一个下推自动机有三个组件 −
-
an input tape,
-
a control unit, and
-
具有无限大小的栈。
栈头扫描栈的顶端符号。
栈执行两种操作 −
-
Push − 在顶部添加一个新的符号。
-
Pop − 读取并移除顶端符号。
一个PDA可以读取或不读取一个输入符号,但它必须在每个转换中读取栈的顶部。
PDA 可以形式化描述为一个 7 元组 (Q, ∑, S, δ, q0, I, F)
-
Q 是有限状态数
-
∑ is input alphabet
-
S is stack symbols
-
δ 是转换函数:Q × (∑ ∪ {ε}) × S × Q × S*
-
q0 是初始状态(q0 ∈ Q)
-
I 是初始栈顶符号(I ∈ S)
-
F 是接受状态的集合(F ∈ Q)
下图展示了一个 PDA 从一个状态 q1 到状态 q2 的转换,标记为 a,b → c
这意味着在状态 q1 ,如果我们遇到一个输入字符串 ‘a’ 且栈顶符号是 ‘b’ ,则我们弹出 ‘b’ ,入栈 ‘c’ 至栈顶,并移至状态 q2 。
Pushdown Automata Acceptance
可以用两种不同的方式定义 PDA 可接受性。
Final State Acceptability
在最终状态可接受性中,当读取完整个字符串后,如果 PDA 处于最终状态,则 PDA 接受一个字符串。从开始状态,我们可以采取最终停留在最终状态的步骤,而无论栈值是什么。只要我们最终处于最终状态,那么栈值就无关紧要。
对于 PDA (Q, ∑, S, δ, q0, I, F),结束状态 F 集合接受的语言为 −
L(PDA) = {w | (q0, w, I) ⊢* (q, ε, x), q ∈ F}
对于任何输入的栈字符串 x 。
Empty Stack Acceptability
此处 PDA 在读取完整个字符串后,如果 PDA 清空了栈,则接受一个字符串。
对于 PDA (Q, ∑, S, δ, q0, I, F),空栈接受的语言为 −
L(PDA) = {w | (q0, w, I) ⊢* (q, ε, ε), q ∈ Q}
PDA & Context-Free Grammar
如果一个语法 G 是无上下文的,我们可以构建一个等效的非确定性 PDA,它接受由无上下文语法 G 生成的语言。可以为语法 G 构建一个解析器。
另外,如果 P 是下推机,则可以构建一个等效的无上下文语法 G,其中
L(G) = L(P)
在接下来的两个主题中,我们将讨论如何从 PDA 转换为 CFG,反之亦然。
Algorithm to find PDA corresponding to a given CFG
Input - 一个 CFG,G = (V, T, P, S)
Output − 等价的 PDA,P = (Q, ∑, S, δ, q0, I, F)
Step 1 − 将 CFG 的产生式转换成 GNF。
Step 2 − PDA 将只有唯一状态 {q}。
Step 3 − CFG 的起始符号将是 PDA 中的起始符号。
Step 4 − CFG的所有非终结符号将是 PDA 的栈符号,且 CFG 的所有终结符号将是 PDA 的输入符号。
Step 5 − 对于形式 A → aX 的每个产生式,其中 a 为终结符, A, X 是终结符和非终结符的组合,创建转换 δ (q, a, A) 。
Algorithm to find CFG corresponding to a given PDA
Input - 一个 CFG,G = (V, T, P, S)
Output − 等价的 PDA,P = (Q, ∑, S, δ, q0, I, F),其中语法 G 的非终结符为 {Xwx | w,x ∈ Q},开始状态为 Aq0,F。
Step 1 − 对于 Q 中的每个 w、x、y、z,S 中的 m 以及 ∑ 中的 a、b,如果 δ (w, a, ε) 包含 (y, m) 且 (z, b, m) 包含 (x, ε) ,则在语法 G 中添加产生式规则 Xwx → a Xyzb。
Step 2 - 对于任意 Q 中的 w、x、y、z,在语法 G 中添加产生式 Xwx → XwyXyx。
Step 3 - 对于 Q 中的 w,在语法 G 中添加产生式 Xww → ε。
Pushdown Automata & Parsing
解析用于根据语法的产生式导出一串字符。它用于检查一串字符的可接受性。编译器用于检查一串字符在语法上是否正确。解析器获取输入并构建一个解析树。
解析器可以分为两种类型 -
-
Top-Down Parser - 自顶向下解析从顶部开始,以起始符号为起始,并使用解析树导出一个字符串。
-
Bottom-Up Parser - 自底向上解析从底部开始,以字符串为起始,并使用解析树得到起始符号。
Design of Top-Down Parser
对于自顶向下解析,PDA 有以下四种类型的转换 -
-
弹出栈顶中产生式左侧的非终结符,并压入其右侧的字符串。
-
如果栈顶符号与正读取的输入符号匹配,则弹出该符号。
-
将起始符号“S”压入栈中。
-
如果输入字符串已完全读取,且栈已清空,则转至最终状态“F”。
Example
设计一个自顶向下的解析器来解析表达式“x+y*z”,针对具有以下产生式的语法 G -
P: S → S+X | X, X → X*Y | Y, Y → (S) | id
Solution
如果 PDA 为 (Q, ∑, S, δ, q0, I, F),则自顶向下的解析如下 -
(x+y*z, I) ⊢(x +y*z, SI) ⊢ (x+y*z, S+XI) ⊢(x+y*z, X+XI)
⊢(x+y*z, Y+X I) ⊢(x+y*z, x+XI) ⊢(+y*z, +XI) ⊢ (y*z, XI)
⊢(y*z, X*YI) ⊢(y*z, y*YI) ⊢(*z,*YI) ⊢(z, YI) ⊢(z, zI) ⊢(ε, I)
Design of a Bottom-Up Parser
对于自底向上解析,PDA 具有以下四种类型的转换 -
-
将当前输入符号压入栈中。
-
将堆栈顶部的某个产生式的右侧用其左侧替换。
-
如果堆栈元素的栈顶与当前输入符号匹配,则弹出该元素。
-
如果输入字符串被完全读入,并且只有开始符号“S”仍然保留在堆栈中,则弹出该开始符号,并转到最终状态“F”。
Example
设计一个自顶向下的解析器来解析表达式“x+y*z”,针对具有以下产生式的语法 G -
P:S → S+X | X,X → X*Y | Y,Y →(S)| id
Solution
如果 PDA 是 (Q,∑,S,δ,q0,I,F),则自底向上解析如下所示 −
(x+y*z, I) ⊢ (+y*z, xI) ⊢ (+y*z, YI) ⊢ (+y*z, XI) ⊢ (+y*z, SI)
⊢(y*z, +SI) ⊢ (*z, y+SI) ⊢ (*z, Y+SI) ⊢ (*z, X+SI) ⊢ (z, *X+SI)
⊢ (ε, z*X+SI) ⊢ (ε, Y*X+SI) ⊢ (ε, X+SI) ⊢ (ε, SI)
Turing Machine Introduction
图灵机是一种接受设备,它接受由类型 0 语法生成的语言(递归可枚举集合)。它是由艾伦·图灵于 1936 年发明的。
Definition
图灵机 ™ 是一种数学模型,它由一条分成小格子的无限长胶带组成,输入内容写在胶带上。它包含一个用来读取输入胶带磁头的。状态寄存器存储图灵机的状态。在读取输入符号之后,它会用其他符号替换该符号,改变其内部状态,并向右或向左移动一个单元格。如果 TM 达到最终状态,则接受输入字符串,否则拒绝。
TM 可以形式上描述为一个 7 元组 (Q,X,∑,δ,q0,B,F),其中 −
-
Q 是有限状态集
-
X 是磁带字母表
-
∑ 是输入字母表
-
δ 是一个转移函数;δ:Q × X → Q × X × {Left_shift,Right_shift}。
-
q0 是初始状态
-
B 是空白符号
-
F 是结束状态的集合
Comparison with the previous automaton
下表展示了图灵机与有限状态机和下推自动机的不同之处。
Machine |
Stack Data Structure |
Deterministic? |
Finite Automaton |
N.A |
Yes |
Pushdown Automaton |
Last In First Out(LIFO) |
No |
Turing Machine |
Infinite tape |
Yes |
Example of Turing machine
图灵机 M = (Q,X,∑,δ,q0,B,F) 带有
-
Q = {q0,q1,q2,qf}
-
X = {a, b}
-
∑ = {1}
-
q0 = {q0}
-
B = blank symbol
-
F = {qf }
δ 由 − 给出
Tape alphabet symbol |
Present State ‘q0’ |
Present State ‘q1’ |
Present State ‘q2’ |
a |
1Rq1 |
1Lq0 |
1Lqf |
b |
1Lq2 |
1Rq1 |
1Rqf |
这里的转移 1Rq1 表示写入符号是 1,胶带向右移动,下一个状态是 q1。同样,转移 1Lq2 表示写入符号是 1,胶带向左移动,下一个状态是 q2。
Accepted Language & Decided Language
如果对任何输入字符串 w 都进入最终状态,那么 TM 会接受一种语言。如果图灵机接受一种语言,则该语言是递归可枚举的(由 0 型语法生成)。
如果 TM 接受一种语言并且对语言中不存在的任何输入进入一个拒绝状态,则该 TM 判定一种语言。如果图灵机判定一种语言,则该语言是递归的。
在某些情况下,TM 可能不会停止。此类 TM 会接受该语言,但不会判定它。
Designing a Turing Machine
下面已借助几个示例说明了设计图灵机的基本准则。
Example 1
设计能够识别由奇数个 α 组成的所有字符串的 TM。
Solution
图灵机 M 可以通过以下动作构建 −
-
令 q1 为初始状态。
-
如果 M 处于 q1 ;在扫描 α 时,它将进入状态 q2 并写入 B (空格)。
-
如果 M 处于 q2 ;在扫描 α 时,它将进入状态 q1 并写入 B (空格)。
-
从上述动作中,我们可以看出当扫描到偶数个 α 时, M 会进入状态 q1 ,当扫描到奇数个 α 时,它会进入状态 q2 。因此, q2 是唯一接受的状态。
因此,
M = {{q1, q2}, {1}, {1, B}, δ, q1, B, {q2}}
其中 δ 表示为 −
Tape alphabet symbol |
Present State ‘q1’ |
Present State ‘q2’ |
α |
BRq2 |
BRq1 |
Example 2
设计读取表示二进制数的字符串并消除字符串中所有前置 0 的图灵机。但是,如果字符串仅包含 0,则它会保留一个 0。
Solution
我们假设输入字符串在字符串的每端都由空格符号 B 终止。
图灵机 M 可以通过以下动作构建 −
-
令 q0 为初始状态。
-
如果 M 在 q0 中,在读取 0 时,它向右移动,进入状态 q1 并擦除 0。在读取 1 时,它进入状态 q2 并向右移动。
-
如果 M 在 q1 中,在读取 0 时,它向右移动并擦除 0,即用 B 替换 0。到达最左端的 1 时,它进入 q2 并向右移动。如果它到达 B,即字符串只包含 0,则它向左移动并进入状态 q3 。
-
如果 M 在 q2 中,在读取 0 或 1 时,它向右移动。到达 B 时,它向左移动并进入状态 q4 。这验证了字符串只包含 0 和 1。
-
如果 M 在 q3 中,它用 0 替换 B,向左移动并到达最终状态 qf 。
-
如果 M 在 q4 中,在读取 0 或 1 时,它向左移动。到达字符串的开头(即读取 B 时),它到达最终状态 qf 。
因此,
M = {{q0, q1, q2, q3, q4, qf}, {0,1, B}, {1, B}, δ, q0, B, {qf}}
其中 δ 表示为 −
Tape alphabet symbol |
Present State ‘q0’ |
Present State ‘q1’ |
Present State ‘q2’ |
Present State ‘q3’ |
Present State ‘q4’ |
0 |
BRq1 |
BRq1 |
ORq2 |
- |
OLq4 |
1 |
1Rq2 |
1Rq2 |
1Rq2 |
- |
1Lq4 |
B |
BRq1 |
BLq3 |
BLq4 |
OLqf |
BRqf |
Multi-tape Turing Machine
多磁带图灵机有多个磁带,每个磁带都通过一个单独的磁头进行访问。每个磁头可以独立于其他磁头移动。最初输入在磁带 1 上,其他磁带为空。一开始,第一磁带被输入占据,其他磁带保持空白。接下来,机器读取其磁头下的连续符号,TM 在每个磁带上打印一个符号并移动其磁头。
多磁带图灵机可正式描述为 6 元组 (Q, X, B, δ, q0, F),其中 -
-
Q 是有限状态集
-
X 是磁带字母表
-
B 是空白符号
-
δ 是状态和符号之间的关系,其中δ: Q × Xk → Q × (X × {左移,右移,不移动})k,其中有 k 个磁带
-
q0 是初始状态
-
F 是结束状态的集合
Note - 每个多磁带图灵机都有一个等效的单磁带图灵机。
Multi-track Turing Machine
多轨图灵机是多磁带图灵机的特定类型,它包含多个磁道,但只有一个磁头可以读取和写入所有磁道。在此,单个磁头可以一步从 n 个磁道中读取 n 个符号。它接受递归可枚举语言,就像普通单轨单带图灵机所接受的一样。
多轨图灵机可以正式描述为一个 6 元组 (Q, X, ∑, δ, q0, F),其中 −
-
Q 是有限状态集
-
X 是磁带字母表
-
∑ 是输入字母表
-
δ 是状态和符号上的一个关系,其中 δ(Qi, [a1, a2, a3,…。)= (Qj, [b1, b2, b3,…。],左移或右移)
-
q0 是初始状态
-
F 是结束状态的集合
Note − 对于每一个单轨图灵机 S ,都有一个等价的多轨图灵机 M ,使得 L(S) = L(M) 。
Non-Deterministic Turing Machine
在非确定图灵机中,对于每个状态和符号,TM 有一组操作。因此,这里的转换不是确定的。非确定图灵机的计算是从开始配置可以到达的一系列配置树。
如果树至少有一个节点是接受配置,则接受输入,否则不接受。如果计算树的所有分支在所有输入上停止,则非确定图灵机被称为 Decider ,如果对于某个输入,所有分支都被拒绝,则输入也被拒绝。
一个非确定图灵机可以形式地定义为一个 6 元组 (Q, X, ∑, δ, q0, B, F),其中 -
-
Q 是有限状态集
-
X 是磁带字母表
-
∑ 是输入字母表
-
δ 是一个转移函数;δ:Q × X → P(Q × X × {左移,右移})。
-
q0 是初始状态
-
B 是空白符号
-
F 是结束状态的集合
Semi-Infinite Tape Turing Machine
具有半无限磁带的图灵机具有左端但没有右端。左端用结束标记限制。
它是一条两轨磁带 -
-
Upper track - 它表示初始磁头位置右侧的单元格。
-
Lower track - 它表示初始磁头位置左侧的单元格(按相反顺序排列)。
无限长度的输入字符串最初写在磁带的连续磁带单元格中。
机器从初始状态 q0 开始,磁头从左端标记“结束”开始扫描。在每个步骤中,它读取磁头下方磁带上的符号。它在该磁带单元格上写一个新符号,然后将磁头向左或向右移动一个磁带单元格。转换函数决定要采取的操作。
它有两个称为 accept state 和 reject state 的特殊状态。如果在任何时间点进入接受状态,则接受输入;如果进入拒绝状态,则 TM 拒绝输入。在某些情况下,它会继续无限运行,而不会被某些特定输入符号接受或拒绝。
Note - 带有半无限磁带的图灵机与标准图灵机等效。
Linear Bounded Automata
线性有界自动机是一个多轨非确定性图灵机,其磁带具有某种有界有限长度。
Length = function (Length of the initial input string, constant c)
在此,
Memory information ≤ c × Input information
计算受限于常量有界区域。输入字母表包含两个特殊符号,用作左端标记和右端标记,这意味着转换既不会移动到左端标记的左边,也不会移动到磁带右端标记的右边。
线性有界自动机可以定义为 8 元组 (Q, X, ∑, q0, ML, MR, δ, F),其中 −
-
Q 是有限状态集
-
X 是磁带字母表
-
∑ 是输入字母表
-
q0 是初始状态
-
ML 是左端标记
-
MR 是右端标记,其中 MR ≠ ML
-
δ 是转换函数,它将每对 (状态、磁带符号) 映射到 (状态、磁带符号、常数‘c’),其中 c 可以是 0 或 +1 或 -1
-
F 是结束状态的集合
确定性线性有界自动机总是 context-sensitive ,而空语言线性有界自动机是 undecidable. 。
Language Decidability
Turing Machine Halting Problem
Input - 图灵机和输入串 w 。
Problem - 图灵机是否在有限步数中完成字符串 w 的计算?答案必须是肯定或否定。
Proof - 首先,我们将假设存在这样的图灵机来解决此问题,然后我们将证明这是自相矛盾的。我们将称此图灵机为 Halting machine ,它在有限时间内生成“是”或“否”。如果求解器在有限时间内完成,则输出结果为“是”,否则为“否”。以下是求解器的框图 −
现在,我们将设计一个 inverted halting machine (HM)’ 为 −
-
如果 H 返回 YES,则无限循环。
-
如果 H 返回 NO,则停止。
以下是“逆求解器”的框图 −
此外,构建了一台将自身作为输入的机器 (HM)2 ,如下所示 −
-
如果 (HM)2 在输入时停止,则无限循环。
-
Else, halt.
在此,我们得到了一个矛盾。因此,求解问题是 undecidable 。
Rice Theorem
Rice 定理指出,由图灵机识别的语言任何非平凡语义属性都是不可判定的。一个属性 P 是满足该属性的所有图灵机的语言。
Description and Properties
-
语言的属性 P 仅仅是一组语言。如果任何语言属于 P (L ∈ P),则称 L 满足属性 P。
-
如果没有任何递归可枚举语言满足它或所有递归可枚举语言都满足它,则一个属性被称为平凡的。
-
某些递归可枚举语言满足非平凡属性而其他语言则不满足。从形式上讲,在非平凡属性中,对于 L ∈ P,满足以下两个属性: Property 1 − 存在识别相同语言的图灵机 M1 和 M2,即 ( <M1>, <M2> ∈ L ) 或 ( <M1>,<M2> ∉ L ) Property 2 − 存在图灵机 M1 和 M2,其中 M1 识别语言而 M2 无法识别,即 <M1> ∈ L 且 <M2> ∉ L
Proof
假设一个属性P为非平凡的且 φ ∈ P。
由于P为非平凡的,所以至少有一门语言满足P,即L(M0) ∈ P,此图灵机为M0。
不妨设w是一个特定时刻的输入,N是一台图灵机,它遵循−
由输入x
-
Run M on w
-
如果M不接受(或不停止),则不接受x(或不停止)
-
如果M接受w,则在x上运行M0。如果M0接受x,则接受x。
一个函数将一个实例ATM = {<M,w>| M接受输入w}映射到一个N,使得
-
如果M接受w且N接受与M0相同语言,则L(M) = L(M0) ∈ p
-
如果M不接受w且N接受φ,则L(N) = φ ∉ p
由于ATM是不可判定性的,并且它可以简化为Lp,因此Lp也是不可判定性的。