计算理论导引实验三:构造图灵机
- 实验描述
- 形式化定义
- 图灵机M的状态图
- 算法设计与描述
- 状态转移关系类
- 键盘输入及逻辑处理类
- 编码实现
- 测试运行
实验描述
要求构造一个能够识别语言L的图灵机。语言L的描述和实验内容如下图所示
形式化定义
根据实验描述,可以将图灵机进行如下设计,得到图灵机的七元祖形式化定义。
- 状态集为{start,q0,q1,q2,q3,q4,q5,q6,q7,q9,accept,reject}
- 输入字母表为{#,+,=,1},这里使用1来表示代替题中点的特定字符
- 带子字母表为{#,+,=,1,X,},这里使用‘’在代码中表示特殊空白符号
- 起始状态为start
- 接受状态集为{accept}
- 拒绝状态集为{reject}
- 转移函数用状态图来描述,如下图所示,为简化状态图,没有在图中显示拒绝状态,也没有显示到拒绝状态的转移,表明一个状态对某个字符没有向外的转移即拒绝。图中的|_|用来表示特殊空白符号
图灵机M的状态图
算法设计与描述
将整个过程抽象成两个类,分别为状态转移类,键盘输入及逻辑处理类。
状态转移关系类
该类主要用于表示转移函数中的各项,在设计中,该类的结构如下:
- 成员变量:当前状态,读写头指的字符,转移的新状态,是否修改纸带,要替换的字符和图灵机读写头移动的方向。
- 成员方法:获取和设置当前状态、读写头指的字符、转移的新状态、是否修改纸带、要替换的字符和图灵机读写头移动的方向的方法。重写tostring方法,用来得到当前对象的字符串表示。
- 构造方法:无参构造方法和带参数的构造方法。
键盘输入及逻辑处理类
该类是用来进行一系列的初始化、以及根据状态转移函数得到图灵机读写头移动方向及状态转移是否修改纸带等操作的类,主要包括以下几项:
- 初始化待识别字符串
通过键盘输入字符串,并对输入的字符串进行前后加空白符号特殊处理后,将字符串保存到字符数组中。这里使用“_”来代替特殊的空白符号 - 初始化状态转移关系集合
将图灵机的每个状态转移关系保存到集合中。每一个状态转移函数关系都是状态转移关系类的一个实例化对象,包含了读写头指的字符,转移的新状态,是否修改纸带,要替换的字符和图灵机读写头移动的方向。 - 图灵机状态转移处理
对于输入的字符串中每一个真实输入的字符进行循环操作:
a) 遍历状态转移集合,判断当前状态下,读入当前字符,根据状态转移函数中对应的操作,进行替换字符、状态转移、图灵机读写头左右移动,如果找到了符合条件的就进行b)中操作,之后进行d)操作。否则直接执行c)中操作。
b) 此时表明存在转移,如果状态转移函数中的是否改变纸带来对纸带进行对应操作,若需要改变,则修改读写头所在位置纸带的值,根据图灵机读写头R还是L进行相应的右移和左移,同时转移到新的状态。
c) 此时表明当前状态下,图灵机读写头对于当前字符没有任何转移操作,也就是此时便不满足该图灵机的构造,不能被识别,得出该字符串被设计的图灵机拒绝。程序结束。
d) 在之前的步骤进行完之后,如果当前图灵机的读写头到了特殊空白符号,并且当前的状态也到了accept接受状态时,该输入字符串被设计的图灵机所接受。否则便是c)中的情况。
编码实现
此处省略代码部分。
测试运行
以输入为#1+1=1时为例,被本次设计的图灵机拒绝。