




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、实验名称 NFA的确定化和最小化 二、实验原理 NFA,也称不确定的有穷自动机,是由一个五元式定义的数学模型,特点是它的不确定性,即在当前状态下,读入同一个字符,可能有多个下一状态。DFA,也称确定的有穷自动机,也是由一个五元式定义的数学模型,相对的特点是它的确定性,即在当前状态下,读入同一个字符,最多有一个后继状态。在非确定的有限自动机NFA中,由于某些状态的转移需从若干个可能的后续状态中进行选择,故一个NFA对符号串的识别就必然是一个试探的过程。这种不确定性给识别过程带来的反复,无疑会影响到FA的工作效率。而DFA则是确定的,将NFA转化为DFA将大大提高工作效率,因此将NFA转化为DFA是有其一定必要的。得到新的DFA之后,并没有完成任务,因为通过NFA转化成DFA不一定是最简的,也就是说,有多余的状态可以被删除,而我们需要的是得到一个唯一的最简的DFA12,也就是说,NFA转化为DFA之后,还需要化简,也就是最小化。DFA的化简是指:寻找一个状态数最少的DFA M,使得L(M)=L(M)。化简的方法是消去DFA M中的多余状态(或无用状态),合并等价状态。DFA中的多余状态是指这样的状态:从开始状态出发,读入任何输入串都不能到达的那个状态;或者从这个状态没有通路到达终态。两个状态S 和T等价是指:如果从状态S出发能读出某个字W而停于终态,从T出发也能读出同样的字W而停于终态;反之,从T出发能读出同样的字W而停于终态,从S出发也能读出某个字W而停于终态。化简DFA的基本思想是指导它的状态分成一些互不相交的子集,每一个子集中的状态都不是等价的,不同子集中的状态可以由某个输入串来区别,最后将不能区别的每个子集用一个状态来做代表13-15,这种方法称为“分割法”。具体过程是:(1)将M的所有状态分成两个子集终态集和非终态集;(2)考察每一个子集,若发现某子集中的状态不等价,将其划分为两个集合;(3)重复第(2)步,继续考察已得到的每一个子集,直到没有任何一个子集需要继续划分为止。这时DFA的状态被分成若干个互不相交的子集。(4)从每个子集中选出一个状态做代表即可得到最简的DFA。三、实验目的要求编写程序实现NFA的确定化(即NFADFA)和最小化(即DFA的化简)四、注意事项 输入一个NFA的各边信息,将其转化成DFA并化简,输入时,状态集不能为两个字符,例如不能出现“10”这样可能出错。五、实验心得NFA转化为与其等价的DFA需分两步进行:1、构造NFA的状态的子集的算法;2、计算-closure。完成这些子模块的设计后,再通过某一中间模块的总控程序对其调用,最后再由主程序总调用,也就实现了NFA转化为其等价的DFA,接下来就是以分割法的思想为指导实现DFA的化简。通过本次实验,加深了对NFA和DFA的理解以及他们之间的相互关系,同时通过各种途径也略微提高了对的认识和理解。尤其是对字符串的比较和显示等。六、源程序代码#include#include#define MAXS 100using namespace std;string NODE; /结点集合string CHANGE; /终结符集合int N; /NFA边数struct edgestring first;string change;string last;struct chanstring ltab;string jiheMAXS;void kong(int a)int i;for(i=0;ia;i+) cout ;/排序void paixu(string &a)int i,j;char b;for(j=0;ja.length();j+) for(i=0;iNODE.find(ai+1) b=ai; ai=ai+1; ai+1=b; void eclouse(char c,string &he,edge b)int k;for(k=0;khe.length() he+=bk.last; eclouse(bk.last0,he,b); void move(chan &he,int m,edge b)int i,j,k,l;k=he.ltab.length();l=he.jihem.length();for(i=0;ik;i+) for(j=0;jhe.jihem.length() he.jihem+=bj.last0; for(i=0;il;i+) for(j=0;jhe.jihem.length() he.jihem+=bj.last0;/输出void outputfa(int len,int h,chan *t)int i,j,m;cout I ;for(i=0;ilen;i+) coutICHANGEi ;coutendl-endl;for(i=0;ih;i+) cout ti.ltab; m=ti.ltab.length(); for(j=0;jlen;j+) kong(8-m); m=ti.jihej.length(); coutti.jihej; coutendl;void main()edge *b=new edgeMAXS;int i,j,k,m,n,h,x,y,len;bool flag;string jhMAXS,endnode,ednode,sta;cout请输入NFA各边信息(起点 条件空为* 终点),以#结束:endl;for(i=0;ibi.first; if(bi.first=#) break; cinbi.changebi.last;N=i;for(i=0;iNODE.length() NODE+=bi.first; if(NODE.find(bi.last)NODE.length() NODE+=bi.last; if(CHANGE.find(bi.change)CHANGE.length()&(bi.change!=*) CHANGE+=bi.change;len=CHANGE.length();cout结点中属于终态的是:endnode;for(i=0;iNODE.length() cout所输终态不在集合中,错误!endl; return; /coutendnode=endnodeendl;chan *t=new chanMAXS; t0.ltab=b0.first;h=1;eclouse(b0.first0,t0.ltab,b); /求e-clouse/coutt0.ltabendl;for(i=0;ih;i+) for(j=0;jti.ltab.length();j+) for(m=0;mlen;m+) eclouse(ti.ltabj,ti.jihem,b); /求e-clouse for(k=0;klen;k+) /coutti.jihek; move(ti,k,b); /求move(I,a) /coutti.jihekendl; for(j=0;jti.jihek.length();j+) eclouse(ti.jihekj,ti.jihek,b); /求e-clouse for(j=0;jlen;j+) paixu(ti.jihej); /对集合排序以便比较 for(k=0;kh;k+) flag=operator=(tk.ltab,ti.jihej); if(flag) break; if(!flag&ti.jihej.length() th+.ltab=ti.jihej; coutendl状态转换矩阵如下:endl;outputfa(len,h,t); /输出状态转换矩阵/状态重新命名string *d=new stringh;NODE.erase();coutendl重命名:endl;for(i=0;ih;i+) sta=ti.ltab; ti.ltab.erase(); ti.ltab=A+i; NODE+=ti.ltab; coutsta=ti.ltabendl; for(j=0;jendnode.length();j+) if(sta.find(endnodej)sta.length() d1=ednode+=ti.ltab; for(k=0;kh;k+) for(m=0;mlen;m+) if(sta=tk.jihem) tk.jihem=ti.ltab;for(i=0;iednode.length() d0+=NODEi;endnode=ednode;coutendlDFA如下:endl;outputfa(len,h,t); /输出DFAcout其中终态为:endnodeendl;/DFA最小化m=2;sta.erase();flag=0; for(i=0;im;i+) /coutdi=diendl; for(k=0;klen;k+) /coutICHANGEkendl; y=m; for(j=0;jdi.length();j+) for(n=0;ny;n+) if(dn.find(tNODE.find(dij).jihek)dn.length()|tNODE.find(dij).jihek.length()=0) if(tNODE.find(dij).jihek.length()=0) x=m; else x=n; if(!sta.length() sta+=x+48; else if(sta0!=x+48) dm+=dij; flag=1; di.erase(j,1); /coutdiendl; j-; break; /跳出n /n /j if(flag) m+; flag=0; /coutsta=staendl; sta.erase(); /k/icoutendl集合划分:;for(i=0;im;i+) coutdi ;coutendl;/状态重新命名chan *md=new chanm; NODE.erase();coutendl重命名:endl;for(i=0;im;i+) mdi.ltab=A+i; NODE+=mdi.ltab; coutdi=mdi.ltabendl;for(i=0;im;i+) for(k=0;klen;k+) for(j=0;jh;j+) if(di0=tj.ltab0) for(n=0;nm;n+) if(!tj.jihek.length() break; else if(dn.find(tj.jihek)dn.length() mdi.jihek=mdn.ltab; b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 年终总结员工代表发言稿
- 四川省达州市渠县第二中学2024-2025学年八年级下学期第三次月考数学试卷(含答案)
- 北师大版五年级上册数学期中检测卷(无答案)
- 2025年湖北省黄石市中考物理模拟试卷(含答案)
- 3ds Max基础建模知到智慧树答案
- 矿业资源开发行业发展状况评估报告
- 网络安全行业发展现状与展望
- “千回百转游响停云”–中国传统戏曲、曲艺经典赏析(长青联盟)知到智慧树答案
- 跨境电子商务双语教程 试卷A中英文答案
- 水边作业安全知识培训课件
- 2025年山西省教师职称考试(理论知识)历年参考题库含答案详解(5套)
- 2025年保定高阳县招聘社区工作者考试试题(含答案)
- 火星基地建设方案-洞察及研究
- 【课件】新学期新征程 课件-2025-2026学年高一上学期开学第一课主题班会
- 心里减压培训
- 大健康产业趋势分析
- 工地交通保通方案(3篇)
- 建材公司叉车操作安全培训制度
- 人大换届工作培训课件
- 上海电子信息职业技术学院招聘笔试真题2024
- DB4201T 537-2018 武汉市房屋安全鉴定技术规程
评论
0/150
提交评论