其他分享
首页 > 其他分享> > 构造图灵机Turing

构造图灵机Turing

作者:互联网

构造图灵机—Turing

一、题目描述

实验目的

  1. 理解图灵机的概念
  2. 掌握图灵机的运行过程,了解格局的转换。

实验学时:2 学时

实验内容:

构造一个图灵机能够识别语言 L = {#n +m = k | n + m = k}
,并通过若干测 试用例,验证构造的图灵机能否正确接受或拒绝这些字符串。可在程序中用任意 特定字符替代””符号。

二、整体解题思路

在这里插入图片描述

第一步

我的思路是构建好具体的图灵机状态的结构,主要是有五个变量

class Tran {
	string oldState;
	char trans;
	string newState;
	string change;
	int bian;
public:
	string getOldState() {
		return oldState;
	}
	void setOldState(string oldState) {
		this->oldState = oldState;
	}
	char getTrans() {
		return trans;
	}
	void setTrans(char trans) {
		this->trans = trans;
	}
	string getNewState() {
		return newState;
	}
	void setNewState(string newState) {
		this->newState = newState;
	}
	string getChange() {
		return change;
	}
	void setChange(string change) {
		this->change = change;
	}

	int getBian() {
		return bian;
	}

其中 oldState 代表的是原始状态,trans 代表转移字符,newState 代表的是 转以后的状态,change 用‘R’,和‘L’分别表示遍历字符后指针移动的方向, bian 用 0,1 表示的是对当前指针指向的字符是否需要变为 x。

第二步

构造一个完整的图灵机,与有穷自动机类似,构造一个 vector 能够存 储各个不同的转移状态,通过遍历匹配的关系可以很好的找到相对应的转移关系。


```cpp
static vector<Tran> inittran() {
	//将拒绝状态用NO表示,将空串用#表示
	vector<Tran> list;
	list.push_back(Tran("start", '#', "q0", "R", 0));
	list.push_back(Tran("q0", '0', "q0", "R", 0));
	list.push_back(Tran("q0", '+', "q1", "R", 0));
	list.push_back(Tran("q1", '0', "q1", "R", 0));
	list.push_back(Tran("q1", '=', "q2", "R", 0));
	list.push_back(Tran("q2", '0', "q2", "R", 0));
	list.push_back(Tran("q2", '$', "q9", "L", 0));
	list.push_back(Tran("q9", '+', "q9", "L", 0));
	list.push_back(Tran("q9", '0', "q9", "L", 0));
	list.push_back(Tran("q9", '=', "q9", "L", 0));
	list.push_back(Tran("q9", 'x', "q9", "L", 0));
	list.push_back(Tran("q9", '$', "q9", "L", 0));
	list.push_back(Tran("q9", '#', "q3", "L", 0));
	list.push_back(Tran("q3", '#', "q4", "R", 0));
	list.push_back(Tran("q4", '+', "q4", "R", 0));
	list.push_back(Tran("q4", 'x', "q4", "R", 0));
	list.push_back(Tran("q4", '0', "q5", "R", 1));
	list.push_back(Tran("q4", '=', "q6", "R", 0));
	list.push_back(Tran("q5", '0', "q5", "R", 0));
	list.push_back(Tran("q5", '+', "q5", "R", 0));
	list.push_back(Tran("q5", '=', "q7", "R", 0));
	list.push_back(Tran("q7", 'x', "q7", "R", 0));
	list.push_back(Tran("q7", '0', "q9", "R", 1));
	list.push_back(Tran("q6", 'x', "q6", "R", 0));
	list.push_back(Tran("q6", '$', "accept", "R", 0));;
	return list;
}
// 具体的构造NFA

第三步 构造具体主函数

通过设置一个双重循环可以很好的实现遍历整个图灵机,根据判出的条件就 是判断是否到达接受状态,若达到接受状态则能够立刻实现输出“该语言是 图灵可识别的”能够很好的实现目的。

三、调试结果

第一步,设置主函数的循环第一步为断点
在这里插入图片描述
第二步,调试第一步
在这里插入图片描述
第三步, 调试流程第二步
在这里插入图片描述
第三步 调试循环一次,到达第二次循环
在这里插入图片描述

四、运行结果截图

在这里插入图片描述
在这里插入图片描述

五、心得体会

在对抽象的图灵机有了初步的认识之后,能将其转换成程序级的图 灵机模拟器,立即由对知识的抽象认识提高到了形象具体的理解。本次 练习不仅锻炼了自己的编程能力同时对原本觉着高深莫测的图灵机加 深了理解。

代码分享一下(麻烦三连一下感谢)
链接:https://pan.baidu.com/s/16LjWMrGC1NiHvZuNCMFQAg
提取码:amsj
复制这段内容后打开百度网盘手机App,操作更方便哦

标签:q9,Turing,Tran,list,back,构造,图灵机,push
来源: https://blog.csdn.net/sunhaobi/article/details/111469562