Automata Theory 简明教程

Automata Theory - Quick Guide

Automata Theory Introduction

Automata – What is it?

术语“自动机”源自希腊语单词“αὐτόματα”,意思是“自作用”。自动机(复数形式为 Automata)是一种抽象的自驱动计算设备,它自动执行预定的操作序列。

具有有限状态数的自动机称为 Finite Automaton (FA) 或 Finite State Machine (FSM)。

Formal definition of a Finite Automaton

自动机可以用 5 元组 (Q, ∑, δ, q0, F) 表示,其中 −

  1. Q 是一个有限的状态集。

  2. 是一个有限的符号集,称为自动机的 alphabet

  3. δ 是转换函数。

  4. q0 是处理任何输入的初始状态 (q0 ∈ Q)。

  5. F 是 Q 的一组终态/状态 (F ⊆ Q)。

Alphabet

  1. Definition − 一个 alphabet 是任何有限的符号集。

  2. Example − ∑ = {a, b, c, d} 是 alphabet set ,其中“a”、“b”、“c”和“d”是 symbols

String

  1. Definition − A string 是从 ∑ 取出的符号的有限序列。

  2. Example −“cabcad”是字母集合 ∑ = {a, b, c, d} 上的有效字符串。

Length of a String

  1. Definition −它是一个字符串中存在的符号数。(表示为 |S| )。

  2. Examples −如果 S =“cabcad”,则 |S|= 6 如果 |S|= 0,则称为 empty string (表示为 λε )。

Kleene Star

  1. Definition − 克莱尼星 * 是符号或字符串集合 上的一元运算符,该运算符提供所有可能长度的所有可能字符串的无限集合,包括 ,包括 λ

  2. Representation − ∑* = ∑0 ∪ ∑1 ∪ ∑2 ∪……. 其中 ∑p 是所有长度为 p 的可能字符串的集合。

  3. Example −如果 ∑ = {a, b},则 ∑* = {λ, a, b, aa, ab, ba, bb,………..}

Kleene Closure / Plus

  1. Definition −集合 ∑+ 是所有可能长度的所有可能字符串的无限集合,不包括 λ。

  2. Representation − ∑+ = ∑1 ∪ ∑2 ∪ ∑3 ∪…….∑+ = ∑* − { λ }

  3. Example −如果 ∑ = { a, b },则 ∑+ = { a, b, aa, ab, ba, bb,………..}

Language

  1. Definition −语言是某些字母表的 ∑* 的子集。它可以是有限的或无限的。

  2. Example −如果该语言采用 ∑ = {a, b} 上所有可能的长度为 2 的字符串,则 L = { ab, aa, ba, bb }

Deterministic Finite Automaton

有限自动机可分为两类:

  1. Deterministic Finite Automaton (DFA)

  2. 非确定有限自动机(NDFA/NFA)

Deterministic Finite Automaton (DFA)

在 DFA 中,对于每个输入符号,都可以确定机器将移动到的状态。因此,它被称为 Deterministic Automaton 。由于它具有有限数量的状态,因此机器被称为 Deterministic Finite MachineDeterministic Finite Automaton.

Formal Definition of a DFA

DFA 可以表示为 5 元组 (Q, ∑, δ, q0, F),其中 −

  1. Q 是一个有限的状态集。

  2. 是称为字母表的有限符号集。

  3. δ 是转换函数,其中 δ: Q × ∑ → Q

  4. q0 是处理任何输入的初始状态 (q0 ∈ Q)。

  5. F 是 Q 的一组终态/状态 (F ⊆ Q)。

Graphical Representation of a DFA

DFA 由称为 state diagram 的有向图表示。

  1. 顶点表示状态。

  2. 带有输入字母标签的弧线表示转换。

  3. 初始状态由一条空传入弧线表示。

  4. 终态由双圆圈表示。

Example

让确定性有限自动机为→

  1. Q = {a, b, c},

  2. ∑ = {0, 1},

  3. q0 = {a},

  4. F = {c}, and

过渡函数 δ 如下表所示−

Present State

输入 0 时的下一状态

输入 1 时的下一状态

a

a

b

b

c

a

c

b

c

它的图形表示如下−

dfa graphical representation

Non-deterministic Finite Automaton

在 NDFA 中,对于特定的输入符号,机器可以移动到机器中的任何状态组合。换句话说,无法确定机器移动到的确切状态。因此,它称为 Non-deterministic Automaton 。由于它有有限数量的状态,因此机器称为 Non-deterministic Finite MachineNon-deterministic Finite Automaton

Formal Definition of an NDFA

NDFA 可以用 5 元组 (Q, ∑, δ, q0, F) 表示,其中−

  1. Q 是一个有限的状态集。

  2. 是称为字母的符号的有限集合。

  3. δ 是过渡函数,其中 δ: Q × ∑ → 2Q(这里取 Q 的幂集 (2Q),因为在 NDFA 的情况下,从一个状态到另一个状态,可以转换为 Q 状态的任何组合)

  4. q0 是处理任何输入的初始状态 (q0 ∈ Q)。

  5. F 是 Q 的一组终态/状态 (F ⊆ Q)。

Graphical Representation of an NDFA: (same as DFA)

NDFA 由称为状态图的有向图表示。

  1. 顶点表示状态。

  2. 带有输入字母标签的弧线表示转换。

  3. 初始状态由一条空传入弧线表示。

  4. 终态由双圆圈表示。

Example

令非确定性有限自动机为→

  1. Q = {a, b, c}

  2. ∑ = {0, 1}

  3. q0 = {a}

  4. F = {c}

过渡函数 δ 如下所示−

Present State

输入 0 时的下一状态

输入 1 时的下一状态

a

a,

b

b

c

a, c

c

b,

c

它的图形表示如下−

ndfa graphical representation

DFA vs NDFA

下表列出了 DFA 和 NDFA 之间的差异。

DFA

NDFA

一个状态的转换对于每个输入符号来说都是到一个单一的特定下一个状态。因此,它称为确定性的。

一个状态的转换对于每个输入符号来说都可以到多个下一个状态。因此,它称为非确定性的。

空字符串转换在 DFA 中看不到。

NDFA 允许空字符串转换。

可以在 DFA 中进行回溯。

在 NDFA 中,并不总是可以进行回溯。

Requires more space.

Requires less space.

如果一个字符串转换到一个最终状态,它就会被 DFA 接受。

如果所有可能的转换中至少有一个结束于最终状态,一个字符串就会被 NDFA 接受。

Acceptors, Classifiers, and Transducers

Acceptor (Recognizer)

计算布尔函数的自动机称为 acceptor 。接受器的所有状态要么接受要么拒绝给定的输入。

Classifier

一个 classifier 有多于两个最终状态,并且在终止时给出单个输出。

Transducer

基于当前输入和/或先前状态生成输出的自动机称为 transducer 。转换器可以是两种类型:

  1. Mealy Machine - 输出既取决于当前状态又取决于当前输入。

  2. Moore Machine - 输出仅取决于当前状态。

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 推导出可接受的字符串。

acceptability of strings by 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 −

Algorithm

Input − NDFA

Output − 等效 DFA

Step 1 − 根据给定的 NDFA 创建状态表。

Step 2 − 根据等效 DFA 的可能的输入字母创建一个空白状态表。

Step 3 − 标记为 q0 的 DFA 的起始状态(与 NDFA 相同)。

Step 4 − 找出对于每个可能的输入字母的状态 {Q0, Q1,…​ , Qn} 的组合。

Step 5 − 每次在输入字母列中生成一个新的 DFA 状态时,我们都必须重新应用步骤 4,否则转到步骤 6。

Step 6 − 包含 NDFA 的任何最终状态的状态是等效 DFA 的最终状态。

Example

我们考虑下图所示的 NDFA。

ndfa

q

δ(q,0)

δ(q,1)

a

{a,b,c,d,e}

{d,e}

b

{c}

{e}

c

{b}

d

{e}

e

使用上述算法,我们可以找到其等效 DFA。DFA 的状态表如下所示。

q

δ(q,0)

δ(q,1)

[a]

[a,b,c,d,e]

[d,e]

[a,b,c,d,e]

[a,b,c,d,e]

[b,d,e]

[d,e]

[e]

[b,d,e]

[c,e]

[e]

[e]

[c, e]

[b]

[b]

[c]

[e]

[c]

[b]

DFA 的状态图如下所示 −

dfa state diagram

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。

dfa minimizing using myhill nerode theorem

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}

state diagram of reduced dfa

DFA Minimization using Equivalence Theorem

如果X和Y是DFA中的两个状态,如果它们不可区分,我们可以将这两个状态组合成{X,Y}。如果存在至少一个字符串S,则两个状态是可以区分的,即δ(X,S)和δ(Y,S)中的一个被接受,另一个不被接受。因此,当且仅当所有状态都可区分时,DFA才是最小的。

Algorithm 3

Step 1 - 所有状态 Q 被分为两个分区- final statesnon-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 的新状态。

Example

让我们思考下列 DFA −

dfa

q

δ(q,0)

δ(q,1)

a

b

c

b

a

d

c

e

f

d

e

f

e

e

f

f

f

f

让我们对上述 DFA 应用上述算法 −

  1. P0 = {(c,d,e), (a,b,f)}

  2. P1 = {(c,d,e), (a,b),(f)}

  3. P2 = {(c,d,e), (a,b),(f)}

因此,P1 = P2。

在化简后的 DFA 中有三个状态。化简后的 DFA 如下所示 −

reduced dfa

Q

δ(q,0)

δ(q,1)

(a, b)

(a, b)

(c,d,e)

(c,d,e)

(c,d,e)

(f)

(f)

(f)

(f)

Moore and Mealy Machines

有限自动机可以有对应于每个转换的输出。有两种类型的产生输出的有限状态机 -

  1. Mealy Machine

  2. Moore machine

Mealy Machine

Mealy 机是一种 FSM,其输出取决于当前状态以及当前输入。

它可以用 6 元组 (Q,∑,O,δ,X,q0) 来描述,其中 -

  1. Q 是一个有限的状态集。

  2. 是一个称为输入字母表的有限的符号集。

  3. O 是一个称为输出字母表的有限的符号集。

  4. δ 是输入转换函数,其中 δ:Q × ∑ → Q

  5. X 是输出转换函数,其中 X:Q × ∑ → O

  6. 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 机的状态图如下 -

state diagram of mealy machine

Moore Machine

Moore 机是一种 FSM,其输出仅取决于当前状态。

摩尔机可以用 6 元组 (Q, ∑, O, δ, X, q0) 来描述,其中 -

  1. Q 是一个有限的状态集。

  2. 是一个称为输入字母表的有限的符号集。

  3. O 是一个称为输出字母表的有限的符号集。

  4. δ 是输入转换函数,其中 δ:Q × ∑ → Q

  5. X 是输出转换函数,其中 X: Q → O

  6. 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 机的状态图是 −

moore machine state diagram

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, b1c 划分为 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),其中 −

  1. NVN 是变量或非终结符号的集合。

  2. T 是终结符号的集合。

  3. S 是一个称为开始符号的特殊变量,S ∈ N

  4. P 是针对终结符号和非终结符号的生成规则。生成规则的格式为 α → β,其中的 α 和 β 是 VN ∪ ∑ 上的字符串,且 α 的至少一个符号属于 VN。

Example

语法 G1 −

({S, A, B}, {a, b}, S, {S → AB, A → a, B → b})

在此,

  1. S, A,B 是非终结符号;

  2. ab 是终结符号

  3. S 是开始符号,S ∈ N

  4. 生成, P : S → AB, A → a, B → b

Example

语法 G2 −

(({S, A}, {a, b}, S, {S → aAb, aA → aaAb, A → ε } )

在此,

  1. SA 是非终结符号。

  2. ab 是终结符号。

  3. ε 是空字符串。

  4. S 是开始符号,S ∈ N

  5. 产生式 P : S → aAb, aA → aaAb, A → ε

Derivations from a Grammar

字符串可以用语法中的产生式从其他字符串中派生。如果语法 G 有产生式 α → β ,我们可以说 x α yG 中派生出 x β y 。此派生表示为 −

x α y ⇒G x β y

Example

让我们考虑语法 −

G2 = ({S, A}, {a, b}, S, {S → aAb, aA → aaAb, A → ε } )

可以派生的字符串包括 −

S ⇒ aAb 使用产生式 S → aAb

⇒ aaAbb 使用产生式 aA → aAb

⇒ aaaAbbb 使用产生式 aA → aaAb

⇒ aaabbb 使用产生式 A → ε

Language Generated by a Grammar

从语法中可以派生的所有字符串的集合称为从该语法生成的语言。语法 G 生成的语言是形式上由以下子集定义的

L(G)={W|W ∈ ∑ , S ⇒G *W }

如果 L(G1) = L(G2) ,语法 G1 等价于语法 G2

Example

如果存在一个语法

G: N = {S, A, B} T = {a, b} P = {S → AB, A → a, B → b}

此处 S 产生 AB ,我们可以用 a 替换 A ,用 b 替换 B 。这里,唯一可接受的字符串是 ab ,即

L(G) = {ab}

Example

假设我们有以下语法 −

G:N = {S、A、B} T = {a、b} P = {S → AB,A → aA|a,B → bB|b}

此语法生成的语言 −

L(G) = {ab、a2b、ab2、a2b2、………}

{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

看看以下插图。它显示了每种语法类型的范围 -

containment of type3 type2 type1 type0

Type - 3 Grammar

q4 生成正则语言。Type-3 语法必须在左侧有一个非终结符,在右侧有一个终结符或一个终结符后跟一个非终结符。

产生式必须采用以下形式 Type-3 grammars

其中 X → a or X → aY (非终结符)

X, Y ∈ N (终结符)

规则 a ∈ T 被允许,如果 S → ε 不出现在任何规则的右侧。

Example

X → ε
X → a | aY
Y → b

Type - 2 Grammar

Type-2 grammars 生成上下文无关语言。

产生式应为 A → γ 形式

其中*A ∈ N*(非终结符)

γ ∈ (T ∪ N) *(终结符和非终结符串)。

由这些语法生成的这些语言可被非确定性下推自动机识别。

Example

S → X a
X → a
X → aX
X → abc
X → ε

Type - 1 Grammar

Type-1 grammars 生成上下文相关语言。产生式应为

α A β → α γ β

其中 A ∈ N (非终结符)

α, β, γ ∈ (T ∪ N) *(终结符和非终结符串)。

字符串 αβ 可为空,但 γ 必须非空。

如果 S 未出现在任何规则的右侧,则规则 S → ε 是允许的。由这些语法生成的语言被线性有界自动机所识别。

Example

AB → AbBc
A → bcA
B → b

Type - 0 Grammar

Type-0 grammars 递归生成可枚举的语言。产生式没有任何限制。它们是包括所有形式文法的任意相结构语法。

它们生成被图灵机识别的语言。

产生式可以 α → β 的形式出现,其中 α 是至少有一个非终结符的终结符和非终结符字符串,而 α 不能为 null。 β 是终结符和非终结符字符串。

Example

S → ACaB
Bc → acB
CB → DB
aD → Db

Regular Expressions

A Regular Expression 可按照以下方式递归定义 −

  1. ε 是表示包含空字符串的语义的正则表达式。 (L (ε) = {ε})

  2. φ 是表示空语义的正则表达式。 (L (φ) = { })

  3. x 是正则表达式,其中 L = {x}

  4. 如果 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®)*

  5. 如果从 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)

因此得证。

给出正则表达式 R, P, L, Q,则有如下恒等式:

  1. ∅* = ε

  2. ε* = ε

  3. RR* = R*R

  4. R*R* = R*

  5. (R*)* = R*

  6. RR* = R*R

  7. (PQ)P =P(QP)

  8. (a+b)* = (a*b*)* = (a*+b*)* = (a+b*)* = a*(ba*)*

  9. R + ∅ = ∅ + R = R (并集的恒等式)

  10. R ε = ε R = R(连接的同一性)

  11. ∅ L = L ∅ = ∅(连接的零化器)

  12. R + R = R(幂等律)

  13. L(M + N)= LM + LN(左分配率)

  14. (M + N)L = ML + NL(右分配率)

  15. ε + RR* = ε + R*R = R*

Arden’s Theorem

为了找出有限自动机的正则表达式,我们使用 Arden 定理以及正则表达式的性质。

Statement -

PQ 是两个正则表达式。

如果 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

  1. 转换图不得包含 NULL 转换

  2. 它只能有一个初始状态

Method

Step 1 - 对于所有具有 n 个状态的 DFA 状态(初始状态为 q1),创建以下形式的方程。

q1 = q1R11 + q2R21 + … + qnRn1 + ε

q2 = q1R12 + q2R22 + … + qnRn2

…………………………

…………………………

…………………………

…………………………

qn = q1R1n + q2R2n + … + qnRnn

Rij 表示从 qiqj 的边的标签集合,如果不存在这样的边,则 Rij = ∅

Step 2 — 求解这些方程式,以 Rij 的形式获得最终状态方程式

Problem

构造与以下给定自动机相对应的正则表达式 −

finite automata

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

构造与以下给定自动机相对应的正则表达式 −

finite automata1

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 -

finite automata for re

Case 2 − 对于正则表达式“ab”,我们可以构建以下 FA −

finite automata for re1

Case 3 − 对于正则表达式 (a+b),我们可以构建以下 FA −

finite automata for re2

Case 4 − 对于正则表达式 (a+b)*,我们可以构建以下 FA −

finite automata for re3

Method

Step 1 根据给定的正则表达式构建一个带有空动作的 NFA。

Step 2 从 NFA 中删除空转换,并将其转换成等效的 DFA。

Problem

将以下 RA 转换成等效的 DFA − 1 (0 + 1)* 0

Solution

我们将三个表达式“1”、“(0 + 1)*”和“0”连接在一起

ndfa with null transition for ra

现在我们将删除 ε 转换。从 NDFA 中删除 ε 转换后,我们得到以下结果 −

ndfa with null transition for ra1

它是与 RE − 1 (0 + 1)* 0 相对应的 NDFA。如果你想将其转换成 DFA,只需应用第 1 章中讨论的 NDFA 到 DFA 的转换方法。

Finite Automata with Null Moves (NFA-ε)

带有空动作的有限自动机 (FA-ε) 不仅在从字母集合提供输入后进行转换,还可以在没有输入符号的情况下进行转换。这种没有输入的转换称为 null move

NFA-ε 由一个 5 元组(Q、∑、δ、q0、F)正式表示,其中包括

  1. Q − 一组有限的状态

  2. − 一组有限的输入符号

  3. δ − 一个转换函数 δ:Q ×(∑ ∪ {ε})→ 2Q

  4. q0 − 一个初始状态 q0 ∈ Q

  5. F − Q 的一组最终状态/状态(F⊆Q)。

finite automata with null moves

上述 (FA-ε) 接受一个字符串集合 − {0, 1, 01}

Removal of Null Moves from Finite Automata

如果在 NDFA 中,存在从顶点 X 到顶点 Y 的 ϵ 动作,我们可以使用以下步骤将其删除 −

  1. 查找从 Y 出发所有出边。

  2. 从 X 开始复制所有这些边,而不会更改边标签。

  3. 如果 X 是初始状态,则使 Y 也为初始状态。

  4. 如果 Y 是终止状态,那么也使 X 成为终止状态。

Problem

将以下 NFA-ε 转换为没有空移动的 NFA。

finite automata with null moves1

Solution

Step 1 -

这里 ε 转换在 q1q2 之间,所以让 q1 等于 X ,而 qf 等于 Y

这里从 qf 出发到 qf 的输出边针对输入 0 和 1。

Step 2 -

现在,我们将从 q1 复制所有这些边,而不会更改从 qf 分出的边,并获得以下 FA −

ndfa after step2

Step 3 -

这里 q1 是一个初始状态,所以我们也将 qf 设置为初始状态。

因此 FA 变成 −

ndfa after step3

Step 4 -

这里 qf 是一个终止状态,因此我们也将 q1 设置为终止状态。

因此 FA 变成 −

final ndfa without null moves

Pumping Lemma For Regular Grammars

Theorem

设 L 是正则语言。那么存在常量 ‘c’ 使得对于 L 中的每个字符串 w

|w| ≥ c

我们可以把 w 分成三个字符串 w = xyz ,使得 −

  1. |y| > 0

  2. |xy| ≤ c

  3. 对于所有的 k ≥ 0,字符串 xykz 也在 L 中。

Applications of Pumping Lemma

抽取引理用于证明某些语言不是正则的。它不应该被用来证明语言是正则的。

  1. 如果 L 是正则的,则它满足抽取引理。

  2. 如果 L 不满足抽空定理,它是非正则的。

Method to prove that a language L is not regular

  1. 首先,我们必须假设 L 是正则的。

  2. 因此,抽空定理应在 L 中成立。

  3. 使用抽空定理得到一个矛盾 − 选择 w 使得 |w| ≥ c 选择 y 使得 |y| ≥ 1 选择 x 使得 |xy| ≤ c 将剩余字符串分配给 z. 选择 k 使得结果字符串不在 L.

Hence L is not regular.

Problem

证明 L = {aibi | i ≥ 0} 不是正则的。

Solution

  1. 首先,我们假设 L 是正则的,并且 n 是状态数。

  2. 令 w = anbn。因此 |w| = 2n ≥ n。

  3. 根据抽空定理,令 w = xyz,其中 |xy| ≤ n。

  4. 令 x = ap,y = aq 和 z = arbn,其中 p + q + r = n,p ≠ 0,q ≠ 0,r ≠ 0。因此 |y| ≠ 0。

  5. 令 k = 2。则 xy2z = apa2qarbn。

  6. as 的数量 = (p + 2q + r) = (p + q + r) + q = n + q

  7. 因此,xy2z = an+q bn。由于 q ≠ 0,xy2z 不是 anbn 的形式。

  8. 因此,xy2z 不在 L 中。因此 L 不是正则的。

DFA Complement

如果 (Q, ∑, δ, q0, F) 是接受语言 L 的 DFA,则可以通过将接受状态与非接受状态以及反之互换来获得 DFA 的补集。

我们将举例并在下面详细说明 −

dfa accepting language l

此 DFA 接受语言

L = {a, aa, aaa , …​…​…​…​. }

在字母表上

∑ = {a, b}

所以,RE = a+。

现在,我们将它的接受状态与其不接受状态互换,反之亦然,并且将获得以下状态:

dfa accepting complement language l

此 DFA 接受语言

Ľ = {ε, b, ab、bb、ba、…​…​…​…​…​ }

在字母表上

∑ = {a, b}

Note - 如果我们希望对 NFA 求补,我们必须首先将其转换为 DFA,然后像在前面的方法中一样交换状态。

Context-Free Grammar Introduction

Definition - 上下文无关文法 (CFG) 由一组有限的文法规则组成,是四元组 (N, T, P, S) ,其中

  1. N 是非终结符符号的集合。

  2. T 是终结符的集合,其中 N ∩ T = NULL.

  3. P 是规则的集合, P: N → (N ∪ T) ,即产生规则 P 的左手边没有任何右上下文或左上下文。

  4. S 是起始符号。

Example

  1. 文法 ({A}, {a, b, c}, P, A),P:A → aA,A → abc。

  2. 文法 ({S, a, b}, {a, b}, P, S),P:S → aSa,S → bSb,S → ε

  3. 文法 ({S, F}, {0, 1}, P, S),P:S → 00S | 11F,F → 00F | ε

Generation of Derivation Tree

导出树或解析树是有序的根树,可以直观地表示从上下文无关文法导出的字符串的语义信息。

Representation Technique

  1. Root vertex - 必须由起始符号标记。

  2. Vertex - 由非终结符符号标记。

  3. Leaves - 由终结符符号或 ε 标记。

如果 S → x1x2 …… xn 是 CFG 中的一条产生规则,则解析树/导出树如下:

derivation tree

绘制导出树有两种不同的方法:

Top-down Approach −

  1. 从开始符号 S 开始

  2. 通过产生使用生产来降低到树叶

Bottom-up Approach −

  1. Starts from tree leaves

  2. 向上转换到根,这是开始符号 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

yield of a tree

Sentential Form and Partial Derivation Tree

部分派生树是派生树/解析树的一个子树,使得它的所有子组件都在子树中,或者它们都不在子树中。

Example

在任何 CFG 中,如果生成是 -

S → AB, A → aaA | ε, B → Bb| ε

部分派生树可以是以下 -

sentential form and partial derivation tree

如果部分派生树包含根 S,则称为 sentential form 。上述子树也是以句子形式出现的。

Leftmost and Rightmost Derivation of a String

  1. Leftmost derivation - 通过在每一步中将生成应用到最左边的变量来获得最左边的派生。

  2. 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

以上字符串逐步推导如下 −

leftmost

字符串 "a+a*a" 最右侧推导可能如下 −

X → X*X → X*a → X+X*a → X+a*a → a+a*a

以上字符串逐步推导如下 −

rightmost

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 。从该文法生成的某个字符串存在多个最右或最左派生。

Problem

检查产生规则为 −

X → X+X | X*X |X| a

的文法 G 是否模糊。

Solution

让我们找出字符串“a+a*a”的派生树。它有两个最左派生。

Derivation 1 −X → X+X → a X → a X*X → a+a*X → a+a*a

Parse tree 1

parse tree1

Derivation 2 − X → X*X → X+X*X → a+ X*X → a+a*X → a+a*a

Parse tree 2

parse tree2

由于对于单个字符串“a+a*a”有两个解析树,文法 G 是模糊的。

CFL Closure Property

无上下文语言在 − 下为 closed

  1. Union

  2. Concatenation

  3. Kleene Star operation

Union

设 L1 和 L2 为两种无上下文语言。则 L1 ∪ L2 也是无上下文的。

Example

设 L1 = { anbn , n > 0}。相应的语法 G1 具有 P: S1 → aAb|ab

设 L2 = { cmdm , m ≥ 0}。相应的语法 G2 具有 P: S2 → cBb| ε

L1 和 L2 的并集,L = L1 ∪ L2 = { anbn } ∪ { cmdm }

相应的语法 G 将具有附加产生式 S → S1 | S2

Concatenation

如果 L1 和 L2 是无上下文语言,则 L1L2 也是无上下文的。

Example

语言 L1 和 L2 的并集,L = L1L2 = { anbncmdm }

相应的语法 G 将具有附加产生式 S → S1 S2

Kleene Star

若 L 是上下文无关语言,那么 L* 也是上下文无关语言。

Example

设 L = { anbn ,n ≥ 0}。对应的文法 G 将具有 P: S → aAb| ε

Kleene 星号 L1 = { anbn }*

对应的文法 G1 将具有附加产生式 S1 → SS1 | ε

上下文无关语言在 − 下属于 not closed

  1. Intersection − 如果 L1 和 L2 是上下文无关语言,那么 L1 ∩ L2 不一定是上下文无关语言。

  2. Intersection with Regular Language − 如果 L1 是正则语言,L2 是上下文无关语言,那么 L1 ∩ L2 是上下文无关语言。

  3. Complement − 如果 L1 是上下文无关语言,那么 L1' 可能不是上下文无关语言。

CFG Simplification

在一个 CFG 中,所有产生式和符号可能不一定都用于推导字符串。此外,可能存在一些空产生式和单位产生式。消除这些产生式和符号被称为 simplification of CFGs 。简化主要包括以下步骤 −

  1. Reduction of CFG

  2. Removal of Unit Productions

  3. 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

Problem

找到与语法 G 等价的简化语法,其中产生式为 P:S → AC | B,A → a,C → c | BC,E → aA | e

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

有两个空值变量 - AB

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 处于乔姆斯基范式−

  1. A → a

  2. A → BC

  3. 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 → XBX → a 。对形式为 A → aB 的每个产生式重复此步骤。

Problem

将以下 CFG 转换为 CNF

S → ASA | aB, A → B | S, B → b | ε

Solution

(1) 因为 S 出现在 R.H.S 中,我们添加一个新状态 S0S0→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 的正确形式。

Problem

将以下 CFG 转换为 CNF

S → XY | Xn | p

X → mX | m

Y → Xn | o

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

Lemma

如果 L 是上下文无关语言,那么存在一个泵长 p ,使得任何长度为 ≥ p 的字符串 w ∈ L 均可写为 w = uvxyz ,其中 vy ≠ ε|vxy| ≤ p ,且对于所有 i ≥ 0, uvixyiz ∈ L

Applications of Pumping Lemma

泵引理用于检查语法是否上下文无关。让我们举一个例子来说明它是如何检查的。

Problem

找出语言 L = {xnynzn | n ≥ 1} 是否上下文无关。

Solution

L 是无上下文的。然后, L 必须满足抽空引理。

首先,选择抽空引理中的一个数字 n 。然后,将z视为0n1n2n。

z 分解为 uvwxy, ,其中

|vwx| ≤ n and vx ≠ ε.

因此 vwx 不可能同时包含0和2,因为最后一个0和第一个2至少相隔(n+1)个位置。有两种情况 −

Case 1vwx 没有2。然后 vx 只包含0和1。然后 uwy ,它必须在 L 中,有 n 2,但少于 n 0或1。

Case 2vwx 没有0。

这里出现了矛盾。

因此, L 不是无上下文语言。

Pushdown Automata Introduction

Basic Structure of PDA

下推自动机是一种以与我们为正规语法设计DFA类似的方式实现无上下文语法的途径。一个DFA可以记忆有限量的信息,而一个PDA可以记忆无限量的信息。

基本上,下推自动机为 −

"Finite state machine" + "a stack"

一个下推自动机有三个组件 −

  1. an input tape,

  2. a control unit, and

  3. 具有无限大小的栈。

栈头扫描栈的顶端符号。

栈执行两种操作 −

  1. Push − 在顶部添加一个新的符号。

  2. Pop − 读取并移除顶端符号。

一个PDA可以读取或不读取一个输入符号,但它必须在每个转换中读取栈的顶部。

pda

PDA 可以形式化描述为一个 7 元组 (Q, ∑, S, δ, q0, I, F)

  1. Q 是有限状态数

  2. is input alphabet

  3. S is stack symbols

  4. δ 是转换函数:Q × (∑ ∪ {ε}) × S × Q × S*

  5. q0 是初始状态(q0 ∈ Q)

  6. I 是初始栈顶符号(I ∈ S)

  7. F 是接受状态的集合(F ∈ Q)

下图展示了一个 PDA 从一个状态 q1 到状态 q2 的转换,标记为 a,b → c

transition in a pda

这意味着在状态 q1 ,如果我们遇到一个输入字符串 ‘a’ 且栈顶符号是 ‘b’ ,则我们弹出 ‘b’ ,入栈 ‘c’ 至栈顶,并移至状态 q2

Instantaneous Description

PDA 的瞬时描述(ID)由三元组 (q, w, s) 表示,其中

  1. q is the state

  2. w is unconsumed input

  3. s 是栈内容

Turnstile Notation

“turnstile”符号用于连接表示 PDA 的一次或多次移动的 ID 对。转换过程由 turnstile 符号“⊢”表示。

考虑一个 PDA (Q, ∑, S, δ, q0, I, F)。一个转换可以用下面的 turnstile 符号以数学方式表示

(p, aw, Tβ) ⊢ (q, w, αb)

这表示在从状态 p 转换到状态 q 时,消耗了输入符号 ‘a’ ,且栈顶 ‘T’ 被一个新字符串 ‘α’ 替换。

Note - 如果希望 PDA 的移动次数为零或更多,则必须使用符号 (⊢*)。

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}

Example

构造一个接受 L = {0n 1n | n ≥ 0} 的 PDA

Solution

pda for l

本语言接受 L = {ε, 01, 0011, 000111, …​…​…​…​…​…​…​…​…​.. }

在此示例中, ‘a’‘b’ 的数量必须相同。

  1. 最初我们将一个特殊符号 ‘$’ 放入空栈中。

  2. 然后在状态 q2 ,如果我们遇到输入 0 并且顶部为 Null,则将 0 推入栈中。可以重复此操作。如果我们遇到输入 1 并且顶部为 0,则弹出此 0。

  3. 然后在状态 q3 ,如果我们遇到输入 1 并且顶部为 0,则弹出此 0。同样可以重复此操作。如果我们遇到输入 1 并且顶部为 0,则弹出顶部元素。

  4. 如果在栈顶遇到特殊符号 '$',则将其弹出并最终进入可接受状态 q4。

Example

构造一个 PDA 接受 L = { wwR | w = (a+b)* }

Solution

pda for l1

最初我们在空栈中添加一个特殊符号“$”。在状态 q2 中,正在读取 w 。在状态 w 中,每个 0 或 1 在与输入匹配时弹出。如果给出了任何其他输入,则 PDA 将进入死状态。当我们到达该特殊符号“$”时,我们进入接受状态 q3

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)

Problem

根据以下 CFG 构建一个 PDA。

G = ({S, X}, {a, b}, P, S)

其产生式为−

S → XS | ε , A → aXb | Ab | ab

Solution

让等价 PDA 为,

P = ({q}, {a, b}, {a, b, X, S}, δ, q, S)

其中 δ −

δ(q, ε , S) = {(q, XS), (q, ε )}

δ(q, ε , X) = {(q, aXb), (q, Xb), (q, ab)}

δ(q, a, a) = {(q, ε )}

δ(q, 1, 1) = {(q, ε )}

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

解析用于根据语法的产生式导出一串字符。它用于检查一串字符的可接受性。编译器用于检查一串字符在语法上是否正确。解析器获取输入并构建一个解析树。

解析器可以分为两种类型 -

  1. Top-Down Parser - 自顶向下解析从顶部开始,以起始符号为起始,并使用解析树导出一个字符串。

  2. Bottom-Up Parser - 自底向上解析从底部开始,以字符串为起始,并使用解析树得到起始符号。

Design of Top-Down Parser

对于自顶向下解析,PDA 有以下四种类型的转换 -

  1. 弹出栈顶中产生式左侧的非终结符,并压入其右侧的字符串。

  2. 如果栈顶符号与正读取的输入符号匹配,则弹出该符号。

  3. 将起始符号“S”压入栈中。

  4. 如果输入字符串已完全读取,且栈已清空,则转至最终状态“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 具有以下四种类型的转换 -

  1. 将当前输入符号压入栈中。

  2. 将堆栈顶部的某个产生式的右侧用其左侧替换。

  3. 如果堆栈元素的栈顶与当前输入符号匹配,则弹出该元素。

  4. 如果输入字符串被完全读入,并且只有开始符号“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),其中 −

  1. Q 是有限状态集

  2. X 是磁带字母表

  3. 是输入字母表

  4. δ 是一个转移函数;δ:Q × X → Q × X × {Left_shift,Right_shift}。

  5. q0 是初始状态

  6. B 是空白符号

  7. 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) 带有

  1. Q = {q0,q1,q2,qf}

  2. X = {a, b}

  3. ∑ = {1}

  4. q0 = {q0}

  5. B = blank symbol

  6. 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。

Time and Space Complexity of a Turing Machine

对于图灵机,时间复杂度指代机器针对某些输入符号初始化时,磁带移动次数的度量,空间复杂度是指磁带上书写单元格的数量。

时间复杂度所有合理函数 −

T(n) = O(n log n)

TM 的空间复杂性 −

S(n) = O(n)

Accepted Language & Decided Language

如果对任何输入字符串 w 都进入最终状态,那么 TM 会接受一种语言。如果图灵机接受一种语言,则该语言是递归可枚举的(由 0 型语法生成)。

如果 TM 接受一种语言并且对语言中不存在的任何输入进入一个拒绝状态,则该 TM 判定一种语言。如果图灵机判定一种语言,则该语言是递归的。

在某些情况下,TM 可能不会停止。此类 TM 会接受该语言,但不会判定它。

Designing a Turing Machine

下面已借助几个示例说明了设计图灵机的基本准则。

Example 1

设计能够识别由奇数个 α 组成的所有字符串的 TM。

Solution

图灵机 M 可以通过以下动作构建 −

  1. q1 为初始状态。

  2. 如果 M 处于 q1 ;在扫描 α 时,它将进入状态 q2 并写入 B (空格)。

  3. 如果 M 处于 q2 ;在扫描 α 时,它将进入状态 q1 并写入 B (空格)。

  4. 从上述动作中,我们可以看出当扫描到偶数个 α 时, 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 可以通过以下动作构建 −

  1. q0 为初始状态。

  2. 如果 Mq0 中,在读取 0 时,它向右移动,进入状态 q1 并擦除 0。在读取 1 时,它进入状态 q2 并向右移动。

  3. 如果 Mq1 中,在读取 0 时,它向右移动并擦除 0,即用 B 替换 0。到达最左端的 1 时,它进入 q2 并向右移动。如果它到达 B,即字符串只包含 0,则它向左移动并进入状态 q3

  4. 如果 Mq2 中,在读取 0 或 1 时,它向右移动。到达 B 时,它向左移动并进入状态 q4 。这验证了字符串只包含 0 和 1。

  5. 如果 Mq3 中,它用 0 替换 B,向左移动并到达最终状态 qf

  6. 如果 Mq4 中,在读取 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 在每个磁带上打印一个符号并移动其磁头。

multi tape turing machine

多磁带图灵机可正式描述为 6 元组 (Q, X, B, δ, q0, F),其中 -

  1. Q 是有限状态集

  2. X 是磁带字母表

  3. B 是空白符号

  4. δ 是状态和符号之间的关系,其中δ: Q × Xk → Q × (X × {左移,右移,不移动})k,其中有 k 个磁带

  5. q0 是初始状态

  6. F 是结束状态的集合

Note - 每个多磁带图灵机都有一个等效的单磁带图灵机。

Multi-track Turing Machine

多轨图灵机是多磁带图灵机的特定类型,它包含多个磁道,但只有一个磁头可以读取和写入所有磁道。在此,单个磁头可以一步从 n 个磁道中读取 n 个符号。它接受递归可枚举语言,就像普通单轨单带图灵机所接受的一样。

多轨图灵机可以正式描述为一个 6 元组 (Q, X, ∑, δ, q0, F),其中 −

  1. Q 是有限状态集

  2. X 是磁带字母表

  3. 是输入字母表

  4. δ 是状态和符号上的一个关系,其中 δ(Qi, [a1, a2, a3,…​。)= (Qj, [b1, b2, b3,…​。],左移或右移)

  5. q0 是初始状态

  6. F 是结束状态的集合

Note − 对于每一个单轨图灵机 S ,都有一个等价的多轨图灵机 M ,使得 L(S) = L(M)

Non-Deterministic Turing Machine

在非确定图灵机中,对于每个状态和符号,TM 有一组操作。因此,这里的转换不是确定的。非确定图灵机的计算是从开始配置可以到达的一系列配置树。

如果树至少有一个节点是接受配置,则接受输入,否则不接受。如果计算树的所有分支在所有输入上停止,则非确定图灵机被称为 Decider ,如果对于某个输入,所有分支都被拒绝,则输入也被拒绝。

一个非确定图灵机可以形式地定义为一个 6 元组 (Q, X, ∑, δ, q0, B, F),其中 -

  1. Q 是有限状态集

  2. X 是磁带字母表

  3. 是输入字母表

  4. δ 是一个转移函数;δ:Q × X → P(Q × X × {左移,右移})。

  5. q0 是初始状态

  6. B 是空白符号

  7. F 是结束状态的集合

Semi-Infinite Tape Turing Machine

具有半无限磁带的图灵机具有左端但没有右端。左端用结束标记限制。

semi infinite tape

它是一条两轨磁带 -

  1. Upper track - 它表示初始磁头位置右侧的单元格。

  2. Lower track - 它表示初始磁头位置左侧的单元格(按相反顺序排列)。

无限长度的输入字符串最初写在磁带的连续磁带单元格中。

机器从初始状态 q0 开始,磁头从左端标记“结束”开始扫描。在每个步骤中,它读取磁头下方磁带上的符号。它在该磁带单元格上写一个新符号,然后将磁头向左或向右移动一个磁带单元格。转换函数决定要采取的操作。

它有两个称为 accept statereject 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),其中 −

  1. Q 是有限状态集

  2. X 是磁带字母表

  3. 是输入字母表

  4. q0 是初始状态

  5. ML 是左端标记

  6. MR 是右端标记,其中 MR ≠ ML

  7. δ 是转换函数,它将每对 (状态、磁带符号) 映射到 (状态、磁带符号、常数‘c’),其中 c 可以是 0 或 +1 或 -1

  8. F 是结束状态的集合

linear bounded automata

确定性线性有界自动机总是 context-sensitive ,而空语言线性有界自动机是 undecidable.

Language Decidability

如果存在一台图灵机,接受并停止处理每个输入字符串 w ,则称为 DecidableRecursive 语言。每个可判定的语言都是图灵可接受的。

decidability and decidable languages

如果所有“是”例子的语言 L 是可判定的,则判定问题 P 是可判定的。

对于可判定的语言,针对每个输入字符串,TM 在接受或拒绝状态停止处理,如下图所示 −

decidable language

Example 1

找出以下问题是否可判定的 −

数字“m”是否为素数?

Solution

素数 = {2, 3, 5, 7, 11, 13, …………..}

将数字 ‘m’ 除以从“2”到“√m”之间的所有数字,从“2”开始。

如果任何这些数字产生余数为零,则转到“拒绝状态”,否则转到“接受状态”。因此,答案可以是“是”或“否”。

Hence, it is a decidable problem.

Example 2

给定正则语言 L 和字符串 w ,我们如何检查是否 w ∈ L

Solution

取接受 L 的 DFA,并检查是否接受 w

dfa1

另一些可判定的问题为 −

  1. DFA 是否接受空集?

  2. 正则集中的 L1 ∩ L2 = ∅?

Note

  1. 如果语言 L 是可判定的,则其补 L' 也可判定

  2. 如果一种语言是可判定的,那么就存在一个枚举器。

Undecidable Languages

对于不可判定的语言,不存在接受该语言和对每个输入串 w 做出判定的图灵机(尽管 TM 可以对某些输入串做出判定)。如果对 P 的所有肯定实例的语言 L 是不可判定的,则判定问题 P 称为“不可判定”。不可判定语言不是递归语言,但有时可能是递归可枚举语言。

undecidable languages

Example

  1. 图灵机的求解问题

  2. The mortality problem

  3. The mortal matrix problem

  4. Post Correspondence 问题等。

Turing Machine Halting Problem

Input - 图灵机和输入串 w

Problem - 图灵机是否在有限步数中完成字符串 w 的计算?答案必须是肯定或否定。

Proof - 首先,我们将假设存在这样的图灵机来解决此问题,然后我们将证明这是自相矛盾的。我们将称此图灵机为 Halting machine ,它在有限时间内生成“是”或“否”。如果求解器在有限时间内完成,则输出结果为“是”,否则为“否”。以下是求解器的框图 −

halting machine

现在,我们将设计一个 inverted halting machine (HM)’ 为 −

  1. 如果 H 返回 YES,则无限循环。

  2. 如果 H 返回 NO,则停止。

以下是“逆求解器”的框图 −

inverted halting machine

此外,构建了一台将自身作为输入的机器 (HM)2 ,如下所示 −

  1. 如果 (HM)2 在输入时停止,则无限循环。

  2. Else, halt.

在此,我们得到了一个矛盾。因此,求解问题是 undecidable

Rice Theorem

Rice 定理指出,由图灵机识别的语言任何非平凡语义属性都是不可判定的。一个属性 P 是满足该属性的所有图灵机的语言。

Formal Definition

如果 P 是一个非平凡属性而语言持有属性,Lp,由图灵机 M 识别,则 Lp = {<M> | L(M) ∈ P} 是不可判定的。

Description and Properties

  1. 语言的属性 P 仅仅是一组语言。如果任何语言属于 P (L ∈ P),则称 L 满足属性 P。

  2. 如果没有任何递归可枚举语言满足它或所有递归可枚举语言都满足它,则一个属性被称为平凡的。

  3. 某些递归可枚举语言满足非平凡属性而其他语言则不满足。从形式上讲,在非平凡属性中,对于 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

  1. Run M on w

  2. 如果M不接受(或不停止),则不接受x(或不停止)

  3. 如果M接受w,则在x上运行M0。如果M0接受x,则接受x。

一个函数将一个实例ATM = {<M,w>| M接受输入w}映射到一个N,使得

  1. 如果M接受w且N接受与M0相同语言,则L(M) = L(M0) ∈ p

  2. 如果M不接受w且N接受φ,则L(N) = φ ∉ p

由于ATM是不可判定性的,并且它可以简化为Lp,因此Lp也是不可判定性的。

Post Correspondence Problem

在1946年,Emil Post提出了邮递对应问题(PCP),这是一个不可判定性的判定问题。对于一个字母表∑,PCP问题的描述如下−

给定以下两个列表,在∑上的非空字符串的 MN

M = (x1, x2, x3,………, xn)

N = (y1, y2, y3,………, yn)

我们可以说存在一个后缀对应解决方案,如果对于一些 i1,i2,………… ik,其中 1 ≤ ij ≤ n,条件 xi1 …….xik = yi1 …….yik 得到满足。

Example 1

找出列表

M = (abb, aa, aaa) 和 N = (bba, aaa, aa)

是否有后缀对应解?

Solution

x1

x2

x3

M

Abb

aa

aaa

N

Bba

aaa

aa

在此,

x2x1x3 = ‘aaabbaaa’

y2y1y3 = ‘aaabbaaa’

可以看出

x2x1x3 = y2y1y3

因此,解为 i = 2, j = 1, and k = 3.

Example 2

找出列表 M = (ab, bab, bbaaa)N = (a, ba, bab) 是否有后缀对应解?

Solution

x1

x2

x3

M

ab

bab

bbaaa

N

a

ba

bab

在这种情况下,没有解,因为 −

| x2x1x3 | ≠ | y2y1y3 | (长度不相同)

因此可以说,这个后缀对应问题是 undecidable