用Python实现ax²+by的图灵机【形式语言与自动机】

在这里插入图片描述

一、图灵机介绍

这里是图灵机的定义,防止有同学忘记了,就再提一下。
在这里插入图片描述

二、设计思想

因为我们是要求做PPT上台演讲的,所以我直接将我的PPT内容选择性地展示出来了。
在这里插入图片描述

三、转移函数

因为我只用了一张纸带,所以,需要用到的状态比较多,一共36个状态,手写了一遍,字迹比较潦草,不过不影响思路。
在这里插入图片描述

四、程序设计

然后核心就是用字典存储上面的状态转移函数,从q0开始,每次读一个就进行转移,最后计算完后,读头还必须要回到初始位置。这样就模拟出读头在纸带上的移动。
在这里插入图片描述
下面用图片描述一下变化状态,为了节省空间,每个字母就是代表有n个1,比如a就表示这里是a个1,以此类推
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、运行结果

计算出10000大概要花费30s,两个原因:1、Python编译速度很慢,C++实现起来肯定会快很多 2、单带计算读头移动次数太多,距离太长,可以改为多带实现,会更快。
在这里插入图片描述

六、实现源码

#纸袋初始状态为:@a0x0b0y0000
#输入需要计算的a、x、b、y
a=input('请输入a的值:')
x=input('请输入x的值:')
b=input('请输入b的值:')
y=input('请输入y的值:')
#开始将空格@和1还有0写上纸带,纸袋假设无限长
list=['@']
for i in range(int(a)):
      list.append('1')
list.append('0')
for i in range(int(x)):
      list.append('1')
list.append('0')
for i in range(int(b)):
      list.append('1')
list.append('0')
for i in range(int(y)):
      list.append('1')
for i in range(4):
      list.append('0')
for i in range(10000):
      list.append('@')
#转移函数,用字典存储
dict={'q0,1':'q1,a,R','q1,1':'q1,1,R','q1,0':'q2,0,R','q2,1':'q3,x,R',
      'q3,1':'q3,1,R','q3,0':'q4,0,R','q4,1':'q4,1,R','q4,0':'q5,0,R',
      'q5,1':'q5,1,R','q5,0':'q6,0,R','q6,0':'q7,1,R','q7,0':'q7,0,R',
      'q7,@':'q8,0,L','q8,1':'q8,1,L','q8,0':'q8,0,L','q8,x':'q2,x,R',
      'q6,1':'q6,1,R','q2,0':'q9,0,L','q9,x':'q9,1,L','q9,0':'q9,0,L',
      'q9,1':'q9,1,L','q9,a':'q0,a,R','q0,0':'q10,0,R',#a*x已完成
      'q10,1':'q11,x,R','q11,1':'q11,1,R','q11,0':'q12,0,R','q12,1':'q12,1,R',
      'q12,0':'q13,0,R','q13,1':'q13,1,R','q13,0':'q14,0,R','q14,1':'q15,c,R',
      'q15,1':'q15,1,R','q15,0':'q16,0,R','q16,0':'q17,1,R','q17,0':'q17,0,R',
      'q17,@':'q18,0,L','q18,0':'q18,0,L','q18,1':'q18,1,L','q18,c':'q14,c,R',
      'q16,1':'q16,1,R','q14,0':'q19,0,L','q19,c':'q19,1,L','q19,0':'q19,0,L',
      'q19,1':'q19,1,L','q19,x':'q10,x,R','q10,0':'q20,0,R',#a*x*x已完成
      'q20,1':'q21,b,R','q21,1':'q21,1,R','q21,0':'q22,0,R','q22,1':'q23,y,R',
      'q23,1':'q23,1,R','q23,0':'q24,0,R','q24,1':'q24,1,R','q24,0':'q25,0,R',
      'q25,1':'q25,1,R','q25,0':'q26,0,R','q26,0':'q27,1,R','q27,@':'q28,0,L',
      'q28,1':'q28,1,L','q28,0':'q28,0,L','q28,y':'q22,y,R','q26,1':'q26,1,R',
      'q22,0':'q29,0,L','q29,y':'q29,1,L','q29,0':'q29,0,L','q29,1':'q29,1,L',
      'q29,b':'q20,b,R','q20,0':'q30,0,R',#b*y已完成
      'q30,1':'q30,1,R','q30,0':'q31,0,R','q31,1':'q31,1,R','q31,0':'q32,0,R',
      'q32,1':'q32,1,R','q32,0':'q33,1,R','q33,1':'q33,1,R','q33,0':'q34,0,L',
      'q34,1':'q35,0,L','q35,1':'q35,1,L','q35,0':'q35,0,L','q35,b':'q35,1,L',
      'q35,x':'q35,1,L','q35,a':'q35,1,L','q35,@':'q36,@,R'#a*x*x+b*y已完成
      }
state='q0'
point=1
while(state!='q36'):
      #(q0,1)
      state=state+','+list[point]
      #1->a
      list[point]=dict[state].split(',')[1]
      #L or R
      direction=dict[state].split(',')[2]
      if direction=='R':
            point=point+1
      else:
            point=point-1
      #q0->q1
      state=dict[state].split(',')[0]
count=0
last_index=0
first_index=0
num=0
while(count<6):
      last_index = last_index + 1
      if(list[last_index]=='0'):
            count=count+1
            if(count==5):
                  first_index=last_index
num=last_index-first_index-1
print("结果为:",num)

只有十分努力,才能看起来毫不费力。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
形式语言自动机笔记主要涵盖了以下几个方面: 1. 形式语言:介绍了语言和形式语言的概念,并讨论了形式语法和推导的相关内容。 2. 有限自动机和正则文法:介绍了确定的有限自动机和不确定的有限自动机的区别,以及它们与正则文法的关系。 3. 图灵机和线性带限自动机:讨论了图灵机和线性带限自动机的特点和区别,特别强调了图灵机能够通过读/写头改变输入带的字符的能力。 4. 线性带限自动机和1型文法:介绍了线性带限自动机和1型文法的等价性,以及线性带限自动机的特点,包括其存储空间被输入符号串的长度所限制的特点。 5. 各类自动机的区别:总结了各类自动机之间的区别和联系。 总的来说,这篇笔记主要介绍了形式语言自动机的基本概念、特点和应用,并通过详细的例子和解释来帮助读者理解这些概念。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [自然语言处理(3)——形式语言自动机](https://blog.csdn.net/m0_53327618/article/details/121617719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [统计自然语言处理(第二版)学习笔记:第三章 形式语言自动机](https://blog.csdn.net/XB_please/article/details/100182309)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

振华OPPO

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值