《不确定有限状态自动机的确定化(NFA-TO-DFA)(共9页).doc》由会员分享,可在线阅读,更多相关《不确定有限状态自动机的确定化(NFA-TO-DFA)(共9页).doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上不确定有限状态自动机的确定化(NFA TO DFA)2008-12-05 22:11#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 p
2、aixu(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+
3、) 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.
4、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(j=0;jN;j+) coutbj.firstbj.changebj.lastendl;*/for(i=0;iNODE
5、.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
6、=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,
7、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;
8、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如下:end
9、l;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.leng
10、th()=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
11、(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; break; break; ednode.erase();for(i=0;im;i+) for(j=0;jendnode.length();j+)
12、 if(di.find(endnodej)di.length()&ednode.find(mdi.ltab) ednode+=mdi.ltab;endnode=ednode;coutendl最小化DFA如下:endl;outputfa(len,m,md); cout其中终态为:endnodeendl;/测试数据:i * 11 a 11 b 11 * 22 a 32 b 43 a 54 b 55 * 66 a 66 b 66 * f#f/运行结果:请输入NFA各边信息(起点 条件空为* 终点),以#结束:i * 11 a 11 b 11 * 22 a 32 b 43 a 54 b 55 * 66
13、 a 66 b 66 * f#结点中属于终态的是:f状态转换矩阵如下:I Ia Ib-i12 123 124123 12356f 124124 123 12456f12356f 12356f 1246f12456f 1236f 12456f1246f 1236f 12456f1236f 12356f 1246f重命名:i12=A123=B124=C12356f=D12456f=E1246f=F1236f=GDFA如下:I Ia Ib-A B CB D CC B ED D FE G EF G EG D F其中终态为:DEFG集合划分:A DEFG B C重命名:A=ADEFG=BB=CC=D最小化DFA如下:I Ia Ib-A C DB B BC B DD C B其中终态为:B专心-专注-专业