ImageVerifierCode 换一换
格式:DOCX , 页数:38 ,大小:335.82KB ,
资源ID:4765901      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4765901.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(NFA转换为DFA及DFA的化简.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

NFA转换为DFA及DFA的化简.docx

1、NFA转换为DFA及DFA的化简实验三(一)NFA DFA(2小时)实验目的:学会编程实现子集构造法实验任务:存储NFA与DFA,编程实现子集构造法将NFA转换成DFA实验内容:(1)确定NFA与DFA的存储格式,为3个以上测试NFA准备好存储文件。NFA的存储格式:3 /转换边数0 / 开始状态3 -1 /结束状态集,以-1为结束标志0 1 a /状态转换0 2 a /如状态0在a输入下转换为状态22 3 b /其中用#表示空转换如测试用例:(a)以a开头和结尾的小字字母串;a (a|b|z)*a | a(b)不包含三个连续的b的,由字母a与b组成的字符串;(e | b | bb) (a |

2、 ab | abb)*(c) (aa|b)*(a|bb)* (2)用C或JAVA语言编写将NFA转换成DFA的子集构造法的程序。子集构造法原理:子集构造法主要代码:子集构造函数:void child_method() int m,n; for(m=0;m100;m+) for(n=0;n100;n+) Dtranmn=#; for(m=0;m100;m+) DFAm.flag=-1; State S0,U; S0.flag=0; S0.count=1; S0.H0=first; State T; T=closure(S0); T.mark=0; T.flag=0; DFAnumof_Dtran

3、+=T; memset(useof_DFA,0,sizeof(useof_DFA); /检查DFA中是否存在未被标记的状态 int j=check_inDFA(); int k; while(j!=-1) useof_DFAj=1; for(k=0;knumof_char;k+) U=closure(move(DFAj,alphak); /求闭包 /if U不在DFA中 if(!check_whetherin_DFA(U) /判断是否在DFA中 U.mark=numof_Dtran; DFAnumof_Dtran+=U; DtranDFAj.markU.mark=alphak; j=check

4、_inDFA();/检查DFA中是否存在未被标记的状态,有返回标号,否则返回-1 闭包函数:State closure(State T)/求闭包 stack STACK; State temp; int i,j,k; for(i=0;iT.count;i+) STACK.push(T.Hi); temp.Hi=T.Hi; temp.count=T.count; /*temp.flag=0;*/ temp.mark=T.mark; while(!STACK.empty() int t=STACK.top(); STACK.pop(); /搜索状态t通过一个或多个空字符到达的状态 int sear

5、ch_result100; int num; arriveBynone(t,search_result,num); for(j=0;jnum;j+) if(!check(search_resultj,temp) temp.Htemp.count+=search_resultj; STACK.push(search_resultj); for(k=0;ktemp.count;k+) if(ftemp.Hk=1) temp.flag=1; break; if(ftemp.Hk=0) temp.flag=0; break; sort(temp.H,temp.H+temp.count); for(i=

6、0;inumof_Dtran;i+) if(temp.count!=DFAi.count) continue; sort(DFAi.H,DFAi.H+DFAi.count); for(j=0;j=DFAi.count) temp.mark=DFAi.mark; return temp;检查未标记状态函数:int check_inDFA() /检查DFA中是否存在未被标记的状态,有则返回标号,否则返回-1 int i; for(i=0;inumof_Dtran;i+) if(!useof_DFAi) return i; return -1;检查一个状态是否在DFA中的函数:bool check_

7、whetherin_DFA(State T) int i,j; sort(T.H,T.H+T.count); for(i=0;inumof_Dtran;i+) if(T.count!=DFAi.count) continue; sort(DFAi.H,DFAi.H+DFAi.count); for(j=0;j=DFAi.count) return true; if(i=numof_Dtran) return false; else return true;(3)测试。利用步骤1中所给的测试用例来验证。a)以a开头和结尾的小字字母串;a (a|b|z)*a | a运行结果及分析:结果分析:首先将

8、读入的NFA信息输出:然后将转换后的DFA输出,其中2号状态表示转换后的状态,即无效状态。状态解释:0:1表示用0状态表示NFA中的1状态1:2 3 表示用1状态表示2,3状态集合。2: 表示用2状态表示状态,即无效状态。3:2 表示用3状态表示NFA中的状态2。最后,判断字符串是否能由此DFA得到:显然,从以上三个例子可以看出,以a开头且以a结尾的字符串可以由该DFA得到而以b开头或结尾的字符串则无法由该DFA得到。所以得到的DFA正确。b)不包含三个连续的b的,由字母a与b组成的字符串;(e | b | bb) (a | ab | abb)*同样可以得到结果及字符串的判断:显然,得到的DF

9、A可以接受连续最多2个b,到3个就不能接受,与NFA一样,正确。c)(c) (aa|b)*(a|bb)*显然,验证结果均正确。实验三(二)DFA化简(2小时)实验目的:学会编程实现等价划分法化简DFA。实验任务:先完善DFA,再化简DFA。实验内容:(1)准备3个以上测试DFA文件。测试文件格式即DFA存储格式说明:2 /字符个数a b /字符3 /非终结状态个数1 /终止状态个数0 1 2 /非终止状态3 /终止状态1 2 /状态转换表0 2 /如第二行表示状态1在a输入下转换成状态0,在b输入下转换成状态20 33 2 测试文件1:测试文件2:测试文件3:(2)用C或JAVA语言编写用等价

10、划分法化简DFA的程序。DFA最小化原理:确定型有穷自动机(DFA):有有穷状态集合和输入符号集合,转移函数,初始状态,以及一个终结状态集合。表示为。DFA的状态图:用箭头来表示状态间的转换,用圆圈+文字表示状态,用一个同心圆表示终结状态,用start表示开始状态。状态表:可以想象。 DFA状态最小化:最小有限自动机,是指满足下述条件的确定有限自动机: 没有无用状态(无用状态已删除); 没有等价状态(等价状态已合并)。.删除无用状态算法无用状态是指自动机从开始态出发,对任何符号串都不能到达的状态。判别算法: 构造有用状态集 Qus 设 q0 为开始态,则 令 q0Qus ; 若 qiQus 且

11、有 d(qi,a)= qj 则令 qjQus ; 重复执行,直到Qus不再增大为止。 从状态集Q中,删除不在Qus中的所有状态。. 合并等价状态算法等价状态:两个状态i,j等价,当且仅当满足下面两个条件:1 必须同是结束态,或同不是结束态;2对所有字母表上符号,状态i,j必变换到等价状态。 划分不等价状态集 初始,把状态集Q化分成两个不等价子集:Q1(结束状态集), Q2(非结束状态集); 把每个Qi再划分成不同的子集,条件是:对同一Qi中两个状态i和j,若对字母表中的某个符号,变换到已划分的不同的状态集中,则i和j应分离:如 d(i,a)Qm , d(j,a)Qn 且 mn 重复步骤,直到再

12、不能划分为止; 合并最终划分的每个子集中的各状态(合而为一)。 部分函数代码: 判断等价状态: while( endflag ) int flag; for(i=0;i(temp+1);i+) /对每个等价类集合 for(int j=0;jn;j+) /类集合内部的比较 flag=0; if(staj.lastf=i) for(int k=0;kn;k+) /若是在同一个等价类,继续测试 if(stak.lastf=staj.lastf&stak.newf=staj.newf) / for(int t=0;tletternum;t+) int s1,s2; s1=movejt; s2=move

13、kt; if(stas2.lastf!=stas1.lastf)/出现分歧 stak.newf=f+1; flag=1; break; if(flag=1) f+; for(i=0;in;i+) if(stai.lastf=stai.newf) ; else break; if(i=n) /若所有的状态等价类编号不再变化,退出while循环 endflag=0; for(i=0;in;i+) stai.lastf=stai.newf; temp=f; /循环结束 判断是否存在不可达状态:for(i=0;iletternum;i+) /检测是否含有不可达的状态 int s0=sta0.newf;

14、 stas0.kd=1; for(int j=0;jf+1;j+) stamoves0i.kd=1; s0=moves0i; int unreach=0; for(i=0;if+1;i+) if(stai.kd=1) ; else /contain unreachble state unreach=1; coutnew state i can not reachendl; for (int j=0;jletternum;j+) moveij=-1; (3)测试 测试1: 输入文件已在步骤1中进行过说明。 运行结果及分析: 从输入文件和状态转换图可以看出状态0和状态2是等价状态可以看出程序将0和

15、2号状态合并,可是建立新的状态转移的时候好像有点问题,没有解决。测试2:(测试文件格式在步骤1中)测试3:(测试文件格式在步骤1中) 经验证,状态分类是正确的,最小化之后的状态转移有点不对。实验心得:通过本次实验,学会了如何将一个非确定型状态机转换成确定型状态机以及如何将一个确定型的有穷自动机化简成一个状态最小的有穷自动机。更加深刻地理解了有穷自动机、等价状态等概念,同时也遇到了很多困难,例如,如何将一个自动机用C+语言来表示,如何将一个图形改成抽象的语言描述等。总之,对课本的知识有了进一步的理解,收获颇多。附:两个实验的代码+工程/ NFA转为DFA.cpp : 定义控制台应用程序的入口点。

16、#include stdafx.h#include#include#include#include#include#include#includeusing namespace std;struct edge int start,end; char c;E100,Ekong100;/E保存所有的边,Ekong保存转换字符为空的边struct State int H100;/状态集合 int count;/状态集合中的元素个数 int flag;/是否是接受状态 int mark;/状态编号;int n;/n:边数int nk=0;/空字符转换的边数int first,accept;/开始状态,

17、接受状态char alpha100;/输入字母表,#代表空串int numof_char=0;/字母表中的字符个数int useof_char256;/该转换字符是否用过int f200;/状态属性标志:0表示始态,1表示接受态,-1表示中间态State DFA100;/DFA状态集int useof_DFA100;/标志构造出来的状态是否已存在int numof_Dtran=0;/最后得到的DFA中的状态数char Dtran100100;/DFA状态转换表void input() ifstream fin(input3.txt,ios:in); int i,s,e; char ch; fi

18、nn; cout此状态转换有n条边first; cout开始状态为:firstendl; memset(f,-1,sizeof(f); memset(useof_char,0,sizeof(useof_char); ffirst=0; coutaccept; finaccept; while(accept!=-1) faccept=1; coutacceptaccept; coutnn起点,终点,转换字符(#表示空字符):endl; int k=0; for(i=0;isech; couts e chendl; Ei.start=s; Ei.end=e; Ei.c=ch; if(ch!=#&!

19、useof_charch) alphanumof_char+=ch; useof_charch=1; if(ch=#) Ekongnk.start=s; Ekongnk.end=e; Ekongnk.c=ch; nk+; State move(State T,char s)/c!=# State temp; temp.count=0; /*temp.flag=0;*/ temp.mark=T.mark; int i,j=0,k=0; for(i=0;iT.count;i+) j=0; while(jn) if(Ej.start=T.Hi&Ej.c=s) temp.Htemp.count+=Ej

20、.end; j+; return temp;void arriveBynone(int t,int result,int& num)/搜索状态t通过一个或多个空字符到达的状态,结果存在result中 int k=0; int m=0; num=0; stack S; S.push(t); int j; while(!S.empty() j=S.top(); S.pop(); m=0; while(mnk) if(Ekongm.start=j) resultnum+=Ekongm.end; S.push(Ekongm.end); m+; bool check(int i,State T)/判断状

21、态i是否在T中 int j; for(j=0;jT.count;j+) if(T.Hj=i) return true; return false;State closure(State T)/求闭包 stack STACK; State temp; int i,j,k; for(i=0;iT.count;i+) STACK.push(T.Hi); temp.Hi=T.Hi; temp.count=T.count; /*temp.flag=0;*/ temp.mark=T.mark; while(!STACK.empty() int t=STACK.top(); STACK.pop(); /搜索

22、状态t通过一个或多个空字符到达的状态 int search_result100; int num; arriveBynone(t,search_result,num); for(j=0;jnum;j+) if(!check(search_resultj,temp) temp.Htemp.count+=search_resultj; STACK.push(search_resultj); for(k=0;ktemp.count;k+) if(ftemp.Hk=1) temp.flag=1; break; if(ftemp.Hk=0) temp.flag=0; break; sort(temp.H

23、,temp.H+temp.count); for(i=0;inumof_Dtran;i+) if(temp.count!=DFAi.count) continue; sort(DFAi.H,DFAi.H+DFAi.count); for(j=0;j=DFAi.count) temp.mark=DFAi.mark; return temp;int check_inDFA() /检查DFA中是否存在未被标记的状态,有则返回标号,否则返回-1 int i; for(i=0;inumof_Dtran;i+) if(!useof_DFAi) return i; return -1;bool check_

24、whetherin_DFA(State T) int i,j; sort(T.H,T.H+T.count); for(i=0;inumof_Dtran;i+) if(T.count!=DFAi.count) continue; sort(DFAi.H,DFAi.H+DFAi.count); for(j=0;j=DFAi.count) return true; if(i=numof_Dtran) return false; else return true;void child_method() int m,n; for(m=0;m100;m+) for(n=0;n100;n+) Dtranmn=#; for(m=0;m100;m+) DFAm.flag=-1; State S0,U; S0.flag=0; S0.count=1; S0.H0=first; State T; T=closure(S0); T.mark=0; T.flag=0; DFAnumof_Dtran+=T; me

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1