运算符

  • 并:
  • 连接:
  • 闭包:

归纳定义

基础

  1. 常量 为正则表达式,分别表示
  2. 是任意符号,则 是正则表达式,表示
  3. 变量用大写符号表示 归纳
  4. 都是正则表达式,则 是正则表达式
  5. 都是正则表达式,则 是正则表达式
  6. 是正则表达式,则 是正则表达式
  7. 是正则表达式,则 是正则表达式

优先级

  • 闭包
  • 连接

正规语言

对于 上的语言 ,若存在 上的正规表达式满足 ,则称 是正规语言。

代数定律

交换律和结合律

  • 并满足交换律和结合律
  • 连接只满足结合律

单位元和零元

  • 是并的单位元,是连接的零元
  • 是连接的单位元

分配律

幂等律

其他

正规表达式设计

例 1


例 2


例 3


例 4


注意只有单字符的情况!

例 5


例 6


例 7


例 8


分两种情况, 若第一个 0 在第一个 1 前,, 若第一个 1 在第一个 0 前,, 因此最终结果是

例 9


将字符串分为两部分,前一部分允许出现相邻的 0,但不允许出现相邻的 1,后一部分则相反。 对于前一部分,不允许出现相邻的 1,即 1 后面必然跟着 0: 后一部分同理: 最终结果:

例 10


例 11


0,1 必然交替出现。

例 12


要么 m, n 均为奇数,要么 m, n 均为偶数:

例 13


注意这种写法

例 14


例 15


例 16


例 17


例 18


00 子串的前后都有 0 后面必须接 1:

例 19


显然 0 只能出现在首位:

代数定律的具体化

  • 具体化:将正规表达式中的每个变量用单个符号替换
  • 一般化:将具体表达式中的单个符号用变量表示
  • 应用:用于发现和测试关于正规表达式的定律 为正规表达式, 为其中的变量,将每个 替换为符号 ,得到具体表达式

正规语言的泵引理

对于 个状态的 DFA,考虑一个字符串 为长度为 的前缀通过 DFA 到达的状态,由鸽巢原理, 中至少有两个状态重复。

Pumping 特性

,令 ,其中 ,则 ,有

Example

\usetikzlibrary{automata, positioning, arrows}
\tikzset{
	->, % makes the edges directed
	>=stealth, % makes the arrow heads bold
	node distance=2.5cm, % specifies the minimum distance between two nodes. Change if necessary.
	every state/.style={thick}, % sets the properties for each ’state’ node
	initial text=$Start$, % sets the text that appears on the start arrow
}
\begin{document}
	\begin{tikzpicture}
		\node [state, initial] (q0) {$q_0$};
		\node [state, right of = q0] (q1) {$q_1$};
		\node [state, accepting, right of = q1] (q2) {$q_2$};
		\draw (q0) edge[loop above, above] node{1} (q0)
			(q0) edge[above] node{0} (q1)
			(q1) edge[above] node{1} (q2)
			(q1) edge[above, loop above] node{0} (q1)
			(q2) edge[above, loop above] node{0,1} (q2);
	\end{tikzpicture}
\end{document}

考查三个字符串:

  • 重复出现,将 拆分成 ,则
  • 重复出现,
  • 重复出现,

正规语言的泵引理

是正规语言,则存在常数 ,使得任一 都可以写成 ,且:

可用于证明某个语言不是正规语言:

  1. 考虑任意的
  2. 找到
  3. 任选满足
  4. 找到一个

Example

证明 不是正规语言。

若是,则存在 满足泵引理。 取 ,令 ,由于 均由 组成,且 中 0 的个数小于 ,取 ,应有 ,但 中 1 的个数显然大于 中 0 的个数,因此 ,矛盾。

Example

为满足 0 的数量是 1 的数量的 2 倍的串的语言。

,满足 ,令 ,且 ,显然, 由 0 组成且 0 的个数小于 ,取 ,要使 中应该包含 个 0,矛盾。

  • ! 泵引理不是正规语言的充分条件

正规语言的判定性质

判定正规语言是否为空(有限自动机表示)

判定算法:测试从初态是否可达某一终态. 先求所有可达状态的集合,若其中包含终态,则该正规语言非空,否则为空语言。

  • 基础:初态是可达的
  • 归纳:设状态 是可达的,若对于某个输入符号或 可转移到 ,则 也是可达的

判定正规语言是否为空(正规表达式表示)

  • 基础: 为空语言,而 不是
  • 归纳:
    • 为空 都为空
    • 为空 为空
    • ,则 非空
    • 为空 为空

判定是否包含特定的字符串

以 DFA 表示正规语言: 从初态开始处理输入 ,若可以结束于一个终态,则该正规语言包含 以 NFA 或 -NFA 表示正规语言: 同理进行模拟 以正规表达式表示正规语言: 转化为等价的自动机

判定两个正规语言是否相等

  1. 先将两个正规语言的表达形式都转化为 DFA,问题转化为两个 DFA 是否是等价的
  2. 适当重命名,使两个 DFA 没有重名的状态
  3. 将两个 DFA 相并,构造一个新的 DFA,原来的终态仍是终态,转移边不发生任何变化,取任何一个状态为初态
  4. 对新构造的 DFA 运用填表算法,如果原来 DFA 的两个初态不可区别,则这两个正规语言相等,否则不相等
  • 全集性:判定补是否为空
  • 包含性:,只需判定 是否为空
  • 等价性:判定双向包含

正规语言的封闭运算

为正规语言,则 为正规语言。 存在正规表达式 ,因此

上的正规语言,则 也是正规语言。 将 DFA 的终态和非终态反转即可。

为正规语言,则 是正规语言。 是正规语言,定义

Example

的 DFA,构造 - NFA

其中

- NFA 识别

是正规语言,则 是正规语言。

连接

是正规语言,则 是正规语言。 存在正规表达式 ,因此

星闭包

是正规语言,则 也是正规语言。 存在正规表达式 ,因此

反转

是正规语言,则 也是正规语言。 对 DFA 的每条转移弧反转,将初态作为终态,新增一个状态 作为初态,且 到任一终态有一 转移弧。

同态

设映射 ,对 ,定义

定义 的同态

为正规语言,则 也是正规语言。 存在正规表达式 使

  • 基础:若 ,取 ,显然 ,若 为 a,取 ,有
  • 归纳:对于 分别构造即可

逆同态

记映射 ,定义 的逆同态

为正规语言,则 也是正规语言。 DFA ,构造 DFA ,其中

应用

证明某个语言不是正则语言。

Example

注意,不能通过泵引理证明 不是正规语言: 取 ,对于任意长度大于 2 的 ,取 ,若 ,取 ,否则取 的第一个字符, 为剩余部分,则有 。 此时,

  • ,显然
  • ,容易验证
  • 的个数必然不为 1,
  • 的个数大于 1, 因此满足泵引理。

为正规语言,则

为正规语言。 设 ,则

为正则语言,不成立。 因此 不是正规语言。

Example

证明 不是正规语言

若是,则

是正规语言。 设 ,则

是正规语言,不成立。

Example

证明 不是正规语言

若是,则

是正规语言。 设 ,则

是正规语言,不成立。

Attention

证明某个语言不是正规语言的思路:

  • 不满足泵引理
  • 构造,让它进行若干次正规语言的封闭运算后得到的语言已知不是正规语言(或可通过泵引理证明其不是正规语言)
    • 不是正规语言