“给定字母表 $\Sigma$ 与自然数 $n$,长度为 $n$ 的字(word)是一个函数”
形式陈述 ​
字母表是一个有限且非空的集合,通常记作 if 可以作为一个词法符号,REQUEST 可以作为一个协议事件,二者都不必拆成排版它们的字符。
对
这里
直觉
字母表决定“观察一次输入时,最小可见单位是什么”。同一份程序文本既可在字符层使用 ASCII 或 Unicode 码点,也可在词法层使用 IDENT、NUMBER、PLUS 等 token。更换字母表会改变模型看见输入的粒度;之后所谓一步转移、一个位置和一个前缀都随之改变,远非字体替换所能概括。
把符号称为原子,是相对于当前问题而言。网络包可以在链路模型中被当作不可分事件,在更低层模型中却是字节序列。形式语言理论不要求符号在物理上不可拆,只要求一旦
有限性保证一张显式自动机转移表只有有限多列,也使“有限控制”真正成为有限对象。它并不限制由字母表生成的字有多长:只要
例子与边界
在二进制字母表 ε 真的列为普通输入符号,读入它会消耗一个位置;自动机图中的 ε-转移则完全不消耗输入。
编译器扫描完源字符后,可以改用
作为语法分析器的字母表。源代码 total+1 在字符层有七个符号,在 token 层却是 IDENT PLUS NUMBER 三个符号;两个模型描述同一对象的不同阶段,长度不可混用。
补集说明了为什么字母表必须随语言一起固定。把 2 根本不在论域;若把 2 的字都落入新的补集。字符串集合没有变,补语言却变了。
有些代数文献允许空字母表,此时
推论与应用
字母表确定字的取值范围,字再组成形式语言。有限自动机的一次转移读取一个字母表符号,文法把终结符取自字母表,经典正则表达式则以这些符号作为基本表达式。先声明输入粒度,能够避免把字符级、token 级和事件级模型画在同一张状态图里。
任意有限字母表都能有效编码为二进制:给每个符号分配定长比特块,字的连接便对应编码块的连接。这样的编码把长度至多放大一个常数因子,因此通常不改变可判定性或渐近复杂度类别;但它不会自动保留逐字符一步的精确成本,讨论状态数或流式延迟时仍应注明编码层次。
参考资料
- Michael Sipser, Introduction to the Theory of Computation, 3rd ed., Cengage, 2013, §0.2.
- John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 3rd ed., Pearson, 2006, §1.1.