未校对
7 正则语言
7.1 Chomsky谱系
- Q: 递归枚举语言在谱系中对应最()的计算能力。其实用价值有时较低,因为()。
A: 强。不能有明确判定结果/计算复杂等 - Q: 1型语言做()特殊处理后,就可以形成0->1->2->3的()关系。
A: 包含进各个与空串的并集。0型 1型 2型 3型语言依次真包含。 - Q: 请顾名思义解释“上下文有关”“右线性”
A: 提示:上下文有关:相对上下文无关而言,某个字符的“作用”(可能后果)可能“被周围所影响”(\(\alpha\to\beta\)中\(|\alpha|>1\)时)
右线性:\(A,B\)(变元)这种为“先锋”向右延伸。线性往前而不“往回”。全程任意时刻最多只有一个变元(“有限自动机指针”)
都是不严格语言表达,合理即可。 - Q: 解释书写中常用的记号\(A\to \alpha|\beta\),\(\{B\to Aw|A\to wB\in\Gamma\}\)
A: 第一个是“或”,是两条产生式的简记。
第二个是集合的一种表示法,即“对于每个\(A\to wB\in \Gamma\),都把\(B\to Aw\)放入集合中” - Q: 证明左/右线性文法等价时,从一边的派生过程怎么“诱导出”另一边的?
A: “倒过来”看之前派生过程,从最后一步开始。比如针对从左到右的依次产生,我先看最右边产生的是什么,然后依次往左产生。
注意变元出现位置从一边挪到另一边。
注意边界情况,比如唯一不产生变元的产生式是\(S\to \epsilon\),比如原来的\(\to w\)诱导出\(S\to \cdots\)(一边结束是另一边开始) - Q: 数的巴科斯范式(BNF)描述中,刚生成完第一个0-9的数的状态是\(R_1\),刚生成完()是\(R_2\),之后依次()()()()。
除了\(R_6\to \epsilon\)外,由于()可以没有,()可以没有,所以()也\(\to\epsilon\)
A: 小数点,小数点后第一位对应\(R_3\),\(e\)对应\(R_4\),\(e\)后符号对应\(R_5\),\(e\)后符号后第一位对应\(R_6\)(注:强调“后第一位”是因为不允许在此处一个数字也没有。所以要专门引入状态作此保证)
小数点及后面所有部分,\(e\)及后面所有部分,\(R_1,R_3\)
7.2 有穷自动机
- Q: “有穷”是有穷自动机很弱的核心原因吗?
A: “有穷”原意是状态为有限种状态,可是图灵机也是有限种状态。
实际上,有穷自动机非常弱的核心原因是不能回头。不能写。
有穷自动机区别于图灵机的一个有穷是“只读一次”,计算过程步骤有穷。 - Q: 课本上的DFA必须读完字符串才能停机,但可能接受或不接受。如果我读到一半就知道肯定不接受了怎么办?
A: 统统进入某个“自暴自弃状态”(它不是接受状态)。这个“自暴自弃状态”只会不断循环,机械的往下读,读无可读就停机不接受。
其实这有一定浪费。你可以考虑如同NFA一样允许\(\delta\)是“部分函数” - Q: 课本中\(\delta\)到\(\delta^*\)的扩张,是说“部分函数”扩张成“全函数”了吗?
A: 不是。此扩张非彼扩张。这里是归纳定义,给出了\(S\times A^*\)(即一个状态和一个字符串)输出的结果。
对于NFA中,原来有些二元组对应空集的,这样扩张后该是空集的还是空集。
课本中对于DFA本来就约定\(S\times A\)中每个二元组都有对应的函数值。(当然如1.所说你可以改变定义,其实也合理) - Q: DFA模拟NFA:状态集是原来状态集\(Q\)的()集。停机的那些状态是()。
证明的核心是归纳说明每一步“模拟器的状态”就是()。
A: 幂,与原来的接受状态集\(F\)交非空的那些集合。
经过这么多步时,被模拟的NFA可能出现的所有状态之集。 - Q: “不可达”现象的出现告诉我们应该如何构造模拟NFA的DFA才不会浪费?
A: 走一步看一步,如果已经没有“悬而未决”(已经列入表中,但未计算\(\delta'\)值)的子集了就停,不继续处理了。 - Q: \(\epsilon\)转移破坏有限性吗?
A: 表面上看好像可以不断读入空串不断转移,实际上只要计算出\(\epsilon\)闭包,那还是可以枚举分类讨论的。(不断读入空串时,其实还是在闭包里打转)
注:上述这种“\(\epsilon\)转移封闭性”当然也是能用DFA模拟\(\epsilon-\)NFA的关键前提之一。
7.3 有穷自动机与正则文法的等价性
- Q: 做类比。
右线性文法;(从左到右读的)DFA
变元;()
\(A\to bC\);()
\(S\);()
\(A\to \epsilon\);()
终极符;()
A: 自动机指针及状态
自动机读取一个字符并作状态转移
自动机初始状态
自动机停机接受
字母表中字母 - Q: 用正则文法模拟FA,证明\(L(G)\subset L(\mathscr M)\)的关键:只有()不产生新的()。需要特别讨论的情况:()字符串。
A: \(A\to \epsilon\)型产生式,变元,空 - Q: 用\(\epsilon-NFA\)模拟正则文法,FA读取空串转移类比文法中的()。FA“读取一串字符”具体如何操作?
A: \(X\to Y\)型产生式
引入一系列中间状态
注意NFA可以猜,所以你可以猜这个a是ab的开头,也可以同时猜它是ac的开头,同时进入多个“状态序列”。 - Q: 接上,上面是对FA做处理,那能不能对正则文法做处理解决这个问题?
A: 比如限制每个产生式右侧只能最多生成一个终极符。显然能构造出满足此条件且与原来等价的正则文法。 - Q: 实际应用中,为了构造DFA往往先构造(),有时为了构造后者还要先构造()。
A: \(\epsilon-NFA\),右线性文法
7.4 正则表达式
- Q: 对于正则语言字母表扩充仍正则、正则语言并仍正则、正则语言补仍正则、正则语言连接仍正则,正则语言闭包仍正则,分别使用什么样的FA比较方便?
A: NFA(新字母直接\(\emptyset\))
\(\epsilon-\)NFA(\(\epsilon-\)转移分别进入两个自动机的初始状态)
DFA(直接改变接受状态集)
\(\epsilon-\)NFA(旧接受状态\(\epsilon\)转移至新初始状态)
\(\epsilon-\)NFA(接受状态\(\epsilon\)转移至初始状态,当然初始状态也是接受状态之一) - Q: 为什么正则表达式可以表示正闭包?
A: \(r^+=rr^*\),其中\(r\)是正则表达式(而不一定是一个字母)。注意此处省略\(\cdot\)连接。 - Q: 题0.主要能帮助()模拟()。而如果反过来模拟,核心的思想有点类似Floyd算法的“插点”。假设()的那些字符串已经用正则表达式表示(为\(R_{ij}^{k-1}\)),则如果新“插了至少一个点”,就并上相应的集合。
这些并上的集合根据插点个数不同可以统一用正则表达式()表示。
A: FA,正则表达式
能被接受且FA运行过程中只经过编号小于等于\(k-1\)状态
\(R_{ik}^{k-1}(R_{kk}^{k-1})^*R_{kj}^{k-1}\) - Q: 空集和空串做运算有何不同?
A: \(+\)运算:一个加了空串作为元素一个没有效果。
\(\cdot\)运算:一个没有效果一个变成了空。
(类比数1,0的作用区别)
\(^*\)运算:都是空串(易错:\(\emptyset ^*=\epsilon\)) - Q: 解说\((\alpha^*+\beta^*)^*=(\alpha^*\beta^*)^*=(\alpha+\beta)^*\)
A: 注意\(=\)表示\(\langle\cdots\rangle= \langle\cdots\rangle\)(两正则表达式表示的正则语言相同)
直接写出对应的集合形式,证明相互包含关系即可。
7.5 非正则语言
- Q: 解说泵引理、鸽笼原理、有穷、“存储”的关系。
A: 泵引理直接来由就是有穷导致有鸽笼(抽屉)原理,即\(n\)个状态DFA最多\(n+1\)步就至少会出现重复的。一样的两状态之间的子串(非空)可以多重复任意多次不影响字符串是否被接受。
本质上,有穷自动机的“存储”空间有限,所以对涉及“无穷”存储的语言,如\(\{a^mb^m|m>0\}\),就由于鸽笼原理,FA无法存储无穷多种状态,而一定不是正则语言。
习题
- Q: 用表格规范表示FA时,特殊的状态\(q\)怎么表示?
A: \(\rightarrow\)表示初始,\(*\)表示接受。(回忆状态转移图……) - Q: 我们讨论产生式右侧含的终极符数量。首先对于含0个的情况,对于\(A\to B\)型,类似于()转移。对此可以考察某种意义的“闭包”,把\(B_i\to w_i A_1,A_1\to A_2\)这类变成(),使得\(A\to B\)型不再出现。
注:具体去除各个\(A\to B\)型产生式的次序,可以是课本这样考虑环、链结构(实际中可能效率快),也可以暴力逐条边去除。总之有限步内一定可以完成。
注:课本没有考虑涉及\(S\)的问题。
A: \(\epsilon\)
\(B_i\to w_i A_2\)(当然,\(i\)可能取一串数,即对应了多条形如\(B\to wA\)的产生式) - Q: 接上,如何考察\(A\to \epsilon\)?
A: 除非是涉及\(S\)的情况,否则直接把\(B\to wA, A\to \epsilon\)变为\(B\to w\)即可。
注:显然,如果把\(S\to \epsilon\)这些去掉了,原来能派生空串的现在就不能。 - Q: 接1.和2.,看起来这类做法是通用的,即\(B\to wA, A\to \alpha\)时写成\(B\to w\alpha\). 那这样无限进行下去有什么后果?
A: 产生式越来越长,越来越多,但正则文法的语言仍不变。
总之这种做法可以去掉“产生式所含终极符太短”的情况,因为越这么做右侧越长。 - Q: 接3.,接下来怎么把一切产生式右侧都变为恰含1个终极符?
A: 比如对于\(A\to abB\),针对“生成了a还未生成b”这个“状态”专门引入一个变元表示。 - Q: 如果DFA只有一个接受状态,那么我们针对其没有猜想能力的特点可以***难:如果指定某语言\(\{0, 00\}\),则DFA读取0一定(),而读取00也一定(),从而(),矛盾
A: 接受,接受
接受状态读0还是接受状态,000也被接受。 - Q: NFA能猜了,那就一定能对任何语言构造接受它的一个接受状态的NFA嘛?
A: 提示:开局一个点,后面才能开枝散叶。
所以\(\{\epsilon, 0,1\}\)这个语言就不行。 - Q: 状态的合并一定要\(\delta(p, a)\equiv\delta(q,a)\)(恒相等)才能进行吗?
A: 不一定。只需\(\delta^*(p,w)\leftrightarrow \delta^*(q,w)\)对任意\(w\)成立即可。 - Q: 说明“某个正则表达式方程解存在唯一性”的思路是什么?
A: 验证某正则表达式是解,且验证其它解和它表达的语言相同。 - Q: 偏序和记号\(minL\)有何关系?
\(prefL\)和FA经过某状态的判定有何关系?
A: \(minL\)类似于偏序中极小元构成集合
由于FA从某状态开始是否可能经过某状态是可计算的,故可把所有“可能之后接受”的状态都标为接受状态,容易得到\(prefL\).
注:课本做法:“虚状态”,即读完串之后“虚”地不断\(\epsilon\)转移。 - Q: \(0^m1^n,m和n为互素正整数\)使用泵引理时,哪边需要是大质数?
A: \(n\)需要是大质数,从而使得“重复段”无论多长都和\(n\)互素。 - Q: 语言的集合运算对应状态集的()运算和接受状态集的()运算。
这样可以证明一些语言的正则性,甚至通过判定FA语言是否为空可以判定两个FA的接受的语言是否相同。其中用到()运算
A: 笛卡尔积(对于\(Q_1,Q_2\),新状态集\(Q_1\times Q_2\)),集合(例如交集就是\(\{第一分量为……\}\cap\{第二分量为……\}\))
对称差集