第3章:有穷状态自动机
3.1 语言的识别
在乔姆斯基体系中,根据文法的不同,语言被分成四类。虽然文法提供了生成语言的方法,但是对于语言句子的识别,这种方法有时会显得不够直接和有效。从本章开始,我们将探讨根据语言的分类来识别语言的不同模型。
理解正则语言
正如上一章所定义,由正则文法生成的语言称为正则语言。给定一个正则文法G = (V, T, P, S),相应的正则语言L(G)便被确定下来。但问题是:给定字符串w,如何判断它是否是这种语言的一个句子?为了解答这一问题,我们需要验证在文法G中是否能够由S推导出w。这个过程涉及到追踪w的推导过程或者将w还原为S。对于所有文法来说,这都不是一件容易的事情,正则文法也不例外。已知一个由文法定义的句子可能有多种不同的推导方式,这使得识别过程更加复杂。
回溯的挑战
在某些情况下,存在多种直接推导可供选择。选择错误的推导可能导致错误,从而中断推导过程,这就需要重新选择——这称为“回溯”。这是高级编程语言编译系统设计中要解决的一个重要问题。如果无法从文法中推导出w,就必须证明G中不存在导出w的推导,或者无法将w还原为S。这包括展示所有可能的推导和还原都无法得到或还原w。
示例:文法G
考虑一个具有以下产生式的文法G:
- S→aAlaB
- A→aA|c
- B→aB|d
字符串aaad是否是该文法定义的语言的一个句子?我们通过推导来探讨(还原练习留给读者):
- S→aA
- A→aA
- A→aaA
- A→aaaA
- 结论:这一推导无法得出aaad。
这个过程可能涉及到回到之前的步骤,如果选择错误,会显著影响系统的效率。
自动机作为识别模型
是否可以简化语言的识别?考虑到由G产生的语言包含的句子都以一个或多个'a'开头,最后是'c'或'd'。以'c'或'd'结尾的句子代表语言的不同子集:{a^n c | n ≥ 1} U {a^n d | n ≥ 1}。
设计识别系统
想象一个初始状态为q₀的系统。读入'a'后,系统识别到'a'的最低要求已满足(至少一个),转移到状态q₁。在q₁状态下,遇到更多的'a'仍保持在q₁。读到'c'或'd'时,系统转移到状态q₂或q₃,分别识别字符串属于第一类或第二类。
系统可视化
状态转换可以通过顶点(状态)和带有标志的弧(根据输入字符的转换)来可视化,提供系统的直观抽象描述。处理如aaad这样的字符串时,系统操作相对简单:从q₀开始,读入'a'后转到q₁,继续读入'a'保持在q₁,直到最后一个字符'd'时转到q₃,确认aaad属于第二类句子。
识别系统的主要方面
- 有限状态:每个状态都有其在识别过程中的独特作用。
- 字母表:系统处理的所有字符串都由预定义的字母表中的字符组成。
- 状态转换:读入一个字符后,系统根据当前状态和输入的字符转移到新状态。
- 初始和终止状态:系统在一个初始状态下开始处理给定的句子,并在到达指定的终止状态时识别句子。
- 物理模型:系统可以通过一个输入带和有限状态控制器的物理模型来表示,这展示了理论概念的实际应用。
通过理解和应用这些原则,有穷状态自动机作为语言识别的有效模型,能够处理形式语言中固有的复杂模式和结构。