不确定有限状态自动机的确定化(NFA TO DFA)

合集下载

第二章+(4)非确定有限自动机NFA

第二章+(4)非确定有限自动机NFA

{4,5,7,6,2} *
{3,8}
{9}
{9,3,8} *
{9}
{9} *
{9,3,8}
输入字
状态
{1,12} {4,5,72,6,2}*
{33,8} {9,43,8}*
{95} *
a
{4,5,27,6,2}
{59} {95}
b
{33,8} {9,43,8}
a
1
b
b
2
3
4a
5
a
例2:将如下的NFA转化为DFA
例: _CLOSURE({1})={1,2}

6
b
a
ε
1ε 2
b
ε
a
3
8
9
a
b
ε
4
7
㈡ 状态集I的a转换
若I={S1, … , Sm }是NFA的状态集的一个子集(状态 子集),a, 则定义: Ia = _CLOSURE(J )
其中:
J = f (S1,a) f (S2,a)… f(Sm,a)
定义1’ 对DFA中的两个状态q1和q2 ,如果将它们 看作是初始状态,所接受的符号串相同,则定义 q1和q2是等价的。
注意: DFA的终止状态和非终止状态不是等价的。
无关状态 从有限自动机的初始状态开始,任何输入序列都 不能到达的那些状态称为无关状态。
最小的DFA(化简了的DFA) 如果DFA M 没有无关状态,也没有彼此等价的 状态,则称DFA M 是最小的(或规约的)。
复习
一.确定有限自动机 确定有限自动机M为一个五元组:
M = ( S , , s0 ,f ,Z ),其中: S:是一个有穷状态集,它的每个元素称为一个状态; :是一个有穷字母表,它的每个元素称为一个输入

作业8非确定的自动机NFA确定化为DFA

作业8非确定的自动机NFA确定化为DFA

作业8⾮确定的⾃动机NFA确定化为DFA 1.设有 NFA M=( {0,1,2,3}, {a,b},f,0,{3} ),其中 f(0,a)={0,1} f(0,b)={0} f(1,b)={2} f(2,b)={3}画出状态转换矩阵,状态转换图,并说明该NFA识别的是什么样的语⾔。

答:由题意可得,状态转换矩阵如下:a b00,1012233 状态转换图如下: 识别语⾔为:(a | b)*abb2.NFA 确定化为 DFA1.解决多值映射:⼦集法1). 上述练习1的NFA2). P64页练习32.解决空弧:对初态和所有新状态求ε-闭包1). 发给⼤家的图22).P50图3.6答:1.(1).  根据1的NFA构造DFA状态转换矩阵如下:a bA{0}{0,1}{0}B{0,1}{0,1}{0,2}C{0,2}{0,1}{0,3}D{0,3}{0,1}{0} 根据1的NFA构造DFA状态转换图如下: 识别语⾔:b*aa*(ba)*bb,与1的NFA的识别的语⾔相同,都是以abb结尾的字符串的集合。

1.(2) 状态转换矩阵如下:01 A{S}{Q,V}{Q,U}B{Q,V}{V,Z}{Q,U}C{V,Z}{Z}{Z}D{Q,U}{V}{Q,U,Z}E{V}{Z}F{Q,U,Z}{V,Z}{Q,U,Z}G{Z}{Z}{Z} 状态转换图如下: 识别语⾔:(00((100) | (0 | 1))(0 | 1)*) | (1((00) | (11*0(0 | 1)*))(0 | 1)*) 2.(1) 状态转换矩阵如下:012X{ABC}{ABC}{BC}{C}Y{BC}{BC}{C}Z{C}{C} 状态转换图如下: 识别语⾔:0*(11*2 | 2)2* 2.(2) 状态转换矩阵如下:a bQ{01247}{1234678}{124567}Q{01247}{1234678}{124567}W{1234678}{1234678}{1245679}X{124567}{1234678}{124567}Y{1245679}{1234678}{12456710}Z{12456710}{1234678}{124567} 状态转换图如下: 识别语⾔:(a | bb*a)a*(ba)*bb((bb*aa*(ba)*bb)* | (aa*(ba)*bb)*)⼦集法:f(q,a)={q1,q2,…,qn},状态集的⼦集将{q1,q2,…,qn}看做⼀个状态A,去记录NFA读⼊输⼊符号之后可能达到的所有状态的集合。

nfa转dfa算法

nfa转dfa算法

nfa转dfa算法有限自动机(Finite Automaton)是一种用于描述形式语言的数学模型。

确定性有限自动机(Deterministic Finite Automaton,DFA)和非确定性有限自动机(Nondeterministic Finite Automaton,NFA)是两种常见的有限自动机,它们在描述形式语言方面有着不同的优势和特点。

NFA转DFA算法是将一个给定的NFA转换为对应的DFA的过程。

NFA转DFA的过程可以分为以下几个步骤:1.确定所有可能的状态集合:NFA中的状态集合是非确定性的,可能有多个状态同时存在。

首先需要确定所有可能的状态集合,这些集合将成为DFA的状态。

2. 确定DFA的初始状态:在NFA中,初始状态由NFA的开始状态及其ε-闭包(epsilon-closure)构成。

ε-闭包是从NFA中的一个状态出发,通过ε-转换(epsilon transition)能够到达的所有状态的集合。

3.确定DFA的转换函数:对于DFA的每个状态和每个输入符号,需要确定转换函数的值。

转换函数的值是当前状态经过输入符号后得到的下一个状态的集合。

4.确定DFA的终止状态:在NFA中,终止状态是一个或多个状态的集合。

在DFA中,如果这个集合中至少包含一个终止状态,则该状态是DFA的终止状态。

NFA转DFA算法的关键在于如何确定所有可能的状态集合和转换函数的值。

可以使用深度优先或广度优先来生成所有可能的状态集合。

在的过程中,需要考虑ε-转换和闭包的概念,以确定当前状态可以到达的所有状态。

通过遍历NFA的每个状态和每个输入符号,可以确定转换函数的值。

当所有的状态集合、初始状态、转换函数和终止状态确定后,NFA就成功地转换为对应的DFA。

DFA的优势之一是在处理形式语言时更加高效。

相比于NFA,DFA可以避免在转换过程中的非确定性,并且可以通过转换函数的值直接跳转到下一个状态,无需进行ε-转换的判断。

编译原理实验NFA确定化为DFA

编译原理实验NFA确定化为DFA

实用文档2016.11.02不确定有穷状态自动机的确定化目录一、实验名称 (2)二、实验目的 (2)三、实验原理 (2)1、NFA定义 (2)2、DFA的定义 (2)3、closure函数 (2)4、move函数 (3)四、实验思路 (3)1、输入 (3)2、closure算法 (3)3、move算法 (3)4、构造子集 (4)5、输出 (4)五、实验小结 (4)1、输入存储问题 (4)2、closure算法问题 (4)3、输出问题 (5)六、附件 (5)1、源代码 (5)2、运行结果截图 (7)一、实验名称不确定有穷状态自动机的确定化二、实验目的输入:非确定有穷状态自动机NFA输出:确定化的有穷状态自动机DFA三、实验原理1、NFA定义一个不确定的有穷自动机M是一个五元组,M=(K,E,f,S,Z)其中a.K是一个有穷集,它的每个元素称为一个状态;b.E是一个有穷字母表,它的每个元素称为一个输入符号;c.f是一个从K×E*到K的子集的映像,即:K*E*->2k,其中2k表示K的幂集;d.S包含于K,是一个非空初态集;e.Z包含于K,是一个终态集。

2、DFA的定义一个确定的有穷自动机M是一个五元组,M=(K,E,f,S,Z)其中a.K是一个有穷集,它的每个元素称为一个状态;b.E是一个有穷字母表,它的每个元素称为一个输入符号;c.f是转换函数,是K×E->K上的映像,即,如f(ki,a)=kj(ki∈K,kj∈K)就意味着,当前状态为ki,输入字符为a时,将转换到下一状态kj,我们把kj称作ki的一个后继状态;d.S∈K,是唯一的一个初态;e.Z包含于K,是一个终态集,终态也称可接受状态或结束状态。

3、closure函数状态集合I的ε—闭包,表示为ε—closure(I),定义为一状态集,是状态集I中的任何状态S经任意条ε弧而能到达的状态的集合。

4、move函数状态集合I的a弧转换,表示为move(I,a),定义为状态集合J,其中J是所有那些从I中的某一状态经过一条a弧而到达的状态的全体。

不确定有限状态自动机的确定化NFATODFA

不确定有限状态自动机的确定化NFATODFA

不确定有限状态自动机的确定化(NFA TO DFA)不确定有限状态自动机的确定化(NFA TO DFA 2008-12-05 22:11#in clude<iostream>#in clude<stri ng>#defi ne MAXS 100using n amespace std;string NODE; // 结点集合stri ng CHANGE; // 终结符集合int N; //NFA 边数struct edge{stri ng first;stri ng cha nge;stri ng last;};struct cha n{stri ng ltab;stri ng jihe[MAXS];};void kon g(i nt a){int i;for(i=0;i<a;i++)cout«'';}//排序void paixu(stri ng &a){int i,j;char b;for(j=0;j<a」en gth();j++)for(i=0;i<a」en gth();i++)if(NODE.fi nd(a[i])>NODE.fi nd(a[i+1])){b=a[i];a[i]=a[i+1];a[i+1]=b;void eclouse(char c,stri ng &he,edge b[]){int k;for(k=0;k<N;k++){if(c==b[k].first[0])if(b[k].cha nge=="*"){if(he.fi nd(b[k].last)>he.le ngth())he+=b[k].last; eclouse(b[k].last[0],he,b);}}}void move(cha n &he,i nt m,edge b[]){int i,j,k,l;k=he .l tab .len gth();l=he.jihe[m].le ngth();for(i=0;i<k;i++)for(j=0;j<N;j++)if((CHANGE[m]==b[j].cha nge[0])&&(he.ltab[i]==b[j].first[0])) if(he.jihe[m].find(b[j].last[0])>he.jihe[m].le ngth()) he.jihe[m]+=b[j].last[0];for(i=0;i<l;i++)for(j=0;j<N;j++)if((CHANGE[m]==b[j].cha nge[0])&&(he.jihe[m][i]==b[j].first[0] ))if(he.jihe[m].fi nd(b[j].last[0])>he.jihe[m].le ngth()) he.jihe[m]+=b[j].last[0]; }//输出void outputfa(i nt le n,i nt h,cha n *t){int i,j,m;cout«" I ";for(i=0;i<le n;i++) coutv<TvvCHANGE[i]vv" ";cout«endlvv" ------------------------- "<<e ndl;for(i=0;i<h;i++)cout«' '<<t[i].ltab;m=t[i].ltab.le ngth();for(j=0;j<le n;j++){{kon g(8-m);m=t[i].jihe[j].le ngth();cout<<t[i].jihe[j];}cout«e ndl;}}void mai n(){edge *b=new edge[MAXS];int i,j,k,m,n,h,x,y,len;bool flag;stri ng jh[MAXS],e ndno de,ed no de,sta;coutvv"请输入NFA各边信息(起点条件[空为*]终点),以#结束:"vvendl; for(i=0;i<MAXS;i++){cin> >b[i].first;if(b[i].first=="#") break;cin> >b[i].cha nge»b[i].last;}N=i;/*for(j=0;j<N;j++)cout<<b[j].firstvvb[j].cha nge<<b[j].lastvve ndl;*/for(i=0;i<N;i++){if(NODE.fi nd(b[i].first)>NODE.Ie ngth())NODE+=b[i].first;if(NODE.fi nd(b[i].last)>NODE.le ngth())NODE+=b[i].last;if((CHANGE.fi nd(b[i].cha nge)>CHANGE.Ie ngth())&&(b[i].cha nge!="*"))CHANGE+=b[i].cha nge;}len=CHANGE.le ngth();coutvv"结点中属于终态的是:"<<endl;{coutvv"所输终态不在集合中,错误! "<<e ndl;cin>>endno de;for(i=0;i<e ndnode.len gth();i++)if(NODE.fi nd(e ndn ode[i])>NODE.le ngth()) {{coutvv"所输终态不在集合中,错误! "<<e ndl; return;}〃cout«"e ndno de="«e ndno de<<e ndl;chan *t=new chan [MAXS];t[O].ltab=b[O].first;h=1;for(j=0;j<le n;j++){paixu(t[i].jihe[j]);//对集合排序以便比较for(k=0;k<h;k++){flag=operator==(t[k].ltab,t[i].jihe[j]);if(flag)break;}if(!flag&&t[i].jihe[j].le ngth())t[h++].ltab=t[i].jihe[j];} }cout«endlvv"状态转换矩阵如下:"<<endl;outputfa(len,h,t); II 输出状态转换矩阵eclouse(b[0].first[0],t[0].ltab,b); //cout<<t[0].ltab<<e ndl; for(i=0;i<h;i++) { for(j=0;j<t[i].ltab.le ngth();j++) for(m=0;m<le n;m++) eclouse(t[i].ltab[j],t[i].jihe[m],b); for(k=0;k<le n;k++) { 〃cout<vt[i].jihe[k]vv"->"; move(t[i],k,b); 〃cout<vt[i].jihe[k]vve ndl; for(j=0;j<t[i].jihe[k].le ngth();j++) eclouse(t[i].jihe[k][j],t[i].jihe[k],b); // } // 求 e-clouse // 求 e-clouse // 求 move(I,a) 求 e-clouse//状态重新命名NODE.erase();cout«endlvv"重命名:"<<endl; for(i=0;i<h;i++)sta=t[i].ltab;{t[i].ltab.erase();t[i].ltab='A'+i;NODE+=t[i].ltab;coutvv'{'v<stavv"}="vvt[i].ltabvve ndl;for(j=0;j<e ndnode.len gth();j++)if(sta.fi nd(e ndno de[j])<sta.le ngth()) d[1]=ednode+=t[i].ltab;for(k=0;k<h;k++) for(m=0;m<le n;m++) if(sta==t[k].jihe[m])t[k].jihe[m]=t[i].ltab;}for(i=0;i<NODE.le ngth();i++)if(ed node.fi nd(NODE[i])>ed node.le ngth()) d[0]+=NODE[i]; endnode=ednode;cout«endl<v"DFA 如下:"<<endl; outputfa(len,h,t); // 输出DFA cout«"其中终态为:"<<endnode<<endl; //DFA最小化m=2;sta.erase();flag=0;for(i=0;i<m;i++){〃coutvv"d["vvivv"]="vvd[i]vve ndl;for(k=0;k<le n;k++){//coutv<TvvCHANGE[k]vve ndl;y=m;for(j=0;j<d[i].le ngth();j++){for(n=0;n<y;n++){if(d[ n].fi nd(t[NODE.fi nd(d[i][j])].jihe[k])<d[ n].le ngth() ||t[NODE.fi nd(d[i][j])].jihe[k].le ngth()==0){if(t[NODE.fi nd(d[i][j])].jihe[k].le ngth()==0)x=m;elsex=n;if(!sta.le ngth())sta+=x+48;{}elseif(sta[0]!=x+48){ d[m]+=d[i][j]; flag=1;d[i].erase(j,1); 〃cout<vd[i]vve ndl;j--;} break; // 跳出n}}//n}〃jif(flag){m++;flag=0;}//cout<<"sta="<<sta<<e ndl; sta.erase();}//k}//icout«endl<<"集合划分:";for(i=0;i<m;i++)cout<v"{"vvd[i]vv"}";cout«e ndl;//状态重新命名cha n *md=new cha n[ m];NODE.erase();cout«endlvv"重命名:"<<endl;for(i=0;i<m;i++){md[i].ltab='A'+i;NODE+=md[i].ltab; coutvv"{"v<d[i]vv"}="vvmd[i].ltabvve ndl; }for(i=0;i<m;i++)for(k=0;k<le n;k++)for(j=0;j<h;j++){if(d[i][0]==t[j].ltab[0])for(n=0;n<m;n++){{if(!t[j].jihe[k]」e ngth()) break;elseif(d[ n].fi nd(t[j].jihe[k])<d[ n].le ngth()) {md[i].jihe[k]=md[ n] .Itab;break;}}break;}}edno de.erase();for(i=0;i<m;i++)for(j=0;j<e ndnode.len gth();j++) if(d[i].fi nd(e ndno de[j])<d[i].le ngth()&&ed node.fi nd(md[i].lta b))edno de+=md[i].ltab;endnode=ednode;cout«endlvv"最小化DFA如下:"<<endl;outputfa(le n,m ,md);cout«"其中终态为:"<<endnode<<endl;}/////////////////////////////////测试数据:i* 11a 11b 11 * 22a 32b 43a 54 b 55* 66 a 66 b 66 * f#////////////////////////////////请输入NFA各边信息(起点条件[空为*]终点),以#结束:i * 11 a 11b 11 * 22a 32b 43a 54 b 55* 66 a 66 b 66 * f#结点中属于终态的是:状态转换矩阵如下:I la lbi12 123 12412312356f124124123 12456f12356f12356f1246f12456f1236f 12456f1246f 1236f 12456f1236f 12356f1246f重命名:{i12}=A{123}=B{124}=C{12356f}=D{12456f}=E{1246f}=FDFA如下:I Ia Ib B D C C B E DDF E G E F G E G D F其中终态为:DEFG集合划分:{A} {DEFG} {B} {C}重命名:{A}=A{DEFG}=B{B}=C{C}=D最小化DFA如下:I la lbA C DB B BC B DD C B 其中终态为:B。

编译原理词法NFADFA的确定化和化简

编译原理词法NFADFA的确定化和化简

编译原理词法NFADFA的确定化和化简编译原理中的词法分析主要包括以下步骤:词法分析器将输入的源程序文本转化为一个个单词(token),即词法单元。

在词法分析过程中,使用的主要工具是有限自动机(NFA)和确定的有限自动机(DFA)。

NFA(DFA)的确定化是指将一个非确定的有限自动机转化为一个确定的有限自动机。

非确定有限自动机具有多个可能的转换路径,而确定有限自动机每个状态只能有一个转换路径。

确定化的目的是简化自动机的状态图,减少转换的复杂性,便于理解和实现。

确定化的过程一般包括以下步骤:1)初始化:将NFA的起始状态作为DFA的起始状态,并为其创建一个新的DFA状态。

2)闭包运算:对于DFA中的每个状态,根据NFA的ε-转换,计算其ε-闭包(即能够通过ε-转换到达的状态集合)。

3)转换运算:对于DFA中的每个状态和每个输入符号,根据NFA的转换函数,计算DFA中该输入下的状态转移集合。

4)如果新生成的DFA状态集合不在已有的DFA状态集合中,则将其加入到DFA状态集合中,并进行闭包和转换运算;如果已存在,则继续下一个输入符号的转换运算。

5)重复步骤4,直到不再生成新的DFA状态集合。

化简是指对于一个确定的有限自动机(DFA),将其中无用的状态进行合并,得到一个更加简洁的自动机。

化简的目的是减少状态数目,提高运行效率和存储效率。

化简的过程一般包括以下步骤:1)初始化:将DFA状态分为两个集合,一个是终止状态集合,一个是非终止状态集合。

2)将所有的等价状态划分到同一个等价类中。

3)不断迭代以下步骤,直到不能再划分等价类为止:a)对于每对不同的状态p和q,若存在一个输入符号a,通过转移函数计算得到的状态分别位于不同的等价类中,则将该状态划分到不同的等价类中。

b)对于每个等价类中的状态集合,将其进一步划分为更小的等价类。

最终,得到的化简DFA状态图比原始DFA状态图要小,且功能等价。

编译原理实验NFA确定化为DFA

编译原理实验NFA确定化为DFA

编译原理实验NFA确定化为DFA编译原理中的NFA(Non-deterministic Finite Automaton,非确定性有限自动机)是一种能够识别正则语言的形式化模型。

它的设计简单,但效率较低。

为了提高识别效率,需要将NFA转化为DFA(Deterministic Finite Automaton,确定性有限自动机)。

本文将介绍NFA确定化为DFA的一般方法,并以一个具体例子来说明该过程。

首先,我们来了解一下NFA和DFA的差异。

NFA可以有多个转移路径,每个输入符号可以对应多个状态转移,而DFA每个输入符号只能对应唯一的状态转移。

这使得NFA在识别过程中具有非确定性,无法确定下一个状态。

而DFA则能够准确地根据当前状态和输入符号确定下一个状态。

NFA确定化为DFA的一般方法如下:1.创建DFA的初始状态。

该状态对应NFA的起始状态以及从起始状态经过ε(空)转移可以到达的所有状态。

2.对DFA的每个状态进行如下处理:a)对当前状态的每个输入符号进行处理。

b)根据当前状态和输入符号,确定下一个状态。

如果有多个状态,需要将它们合并为一个DFA状态。

c)重复上述步骤,直到处理完所有输入符号。

3.对于合并的DFA状态,需要重复执行第2步的处理过程,直到没有新的合并状态产生为止。

4.最终得到的DFA包含的状态即为NFA确定化的结果。

下面以一个具体的例子来说明NFA确定化为DFA的过程。

考虑以下NFA:(状态)(输入符号)(转移状态)1a,ε1,22a33b44a5首先,创建DFA的初始状态,根据NFA的起始状态和通过ε转移可以到达的状态。

在该例子中,起始状态为1,通过ε转移可以到达状态1和2、因此,初始状态为{1,2}。

接下来,对初始状态{1,2}进行处理。

对于输入符号a,根据NFA的状态转移表可以得到DFA的下一个状态为{1,2,3},因为NFA的状态1通过a和ε可以到达状态3、对于输入符号b,当前状态没有转移。

非确定有限自动机NFA的确定化

非确定有限自动机NFA的确定化

个非常不错 的选择 。 系统提供 了一个温室环境信息 本
远程监控系统 , 利用手机短信模块 和单 片机制成 一个单 机 , 本低 , 成 易于推广 , 具有很好 的发展前景 。
参考文献 [惆 驰 岷, 世勇, 1 潘 牟行军 , 一种 G M无线固定电话设计方 S 案, 微型 电脑应用 ,0 5年第 6期 2 — 7 20 52 [] 2胡顺 安 , 书茂 , 能化农业 信息远 程采集 系统 , 计 王 智 设 与研究 ,0 5年第 6期 3 — 4 20 23 [] 3李鸿 , 用单 片机控制 手机收 发短信 , 计算 机应用 ,0 3 20
维普资讯
信 息 技 术
■■_
在编译系统中 , 词法分析 阶段是 整个 编译 系统的基 础 。对于单词 的识 别 , 限 自动机 F 有 A是一种 十分 有效 的工具。有 限 自动机 由其映射 f 是否为单值而分为确定
的 有 限 自动 机 D A和 非 确 定 的有 限 自动 机 N A 在 非 F F。 确 定 的有 限 自动 机 N A中 , 由于 某 些 状 态 的转 移 需 从 F
控器 为主 ,由 G M手 机模块 和单片机控制系统两部分 S 组成 。每套 J 3 B 5模块都附带有设置软件光盘 和电脑通 讯电缆。 通过 电脑运行 J 3 B 5设置软件 , 户可以 自己定 用 义每路继 电器 的打开 和关 闭的短信 内容 , 作为 以后短信 遥控 的控 制指令 ,并 通过 通讯 电缆 写入 J 3 块 的 B 5模 E P O 存储 器 内 , E R M 即使 断 电也 不 会丢 失数 ER M EPO 据。例 如 : 1 第 路继电器用来遥控喷淋器 的开关 。先把 J3 B 5用电缆连接到计算 机的串 口, 并运行 J 3 B 5设置软 件后 , 出现一个全 中文窗 口软件 界面 , 会 在打 开第 1 路 继电器的短信指令 文字框 内, 输入 “ 打开喷淋器”; 在关 闭第 1 路继 电器 的短信指令 文字框 内 , 入 “ 输 关闭喷淋 器”。最后断开 电缆取下 J 3 B 5模块 , 并把模块安装 到喷 淋器上就完成 了。 当收到温室大棚传来 的信息确定需要 灌溉 时,只需用手机 向安装 在喷淋器 内的 J 3 B 5模块发 送 一条 内容 为 “ 打开喷淋器 ”的短 消息 , 便可 以打开温 室内 的喷 淋器 ; 如果想关 掉喷 淋器 , 只要 发送 “ 闭喷 关 淋器 ”即可 。J 3 B 5模块共有 8 路继 电器输 出 , 每路继 电 器用 户都 可以按 以上方法设置 自己需要 的控制 内容 , 非 常直 观和人性化 。此外 , 专家 自己设 置的短信遥控指令 内容 ,其他人 不知道 ,因此 即使别人也 用手机 向你 的 J3 B 5模块发短消息 , 由于短信遥控指 令 内容不正 确 , 但 也无法控制你 的电机 。同时 , 机 SM卡 号码 的唯一性 手 I
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

不确定有限状态自动机的确定化(NFA TO DFA)不确定有限状态自动机的确定化(NFA TO DFA)2008-12-05 22:11#include<iostream>#include<string>#define MAXS 100using namespace std;string NODE; //结点集合string CHANGE; //终结符集合int N; //NFA边数struct edge{string first;string change;string last;};struct chan{string ltab;string jihe[MAXS];};void kong(int a){int i;for(i=0;i<a;i++)cout<<' ';}//排序void paixu(string &a){int i,j;char b;for(j=0;j<a.length();j++)for(i=0;i<a.length();i++)if(NODE.find(a[i])>NODE.find(a[i+1])){b=a[i];a[i]=a[i+1];a[i+1]=b;}}void eclouse(char c,string &he,edge b[]){int k;for(k=0;k<N;k++){if(c==b[k].first[0])if(b[k].change=="*"){if(he.find(b[k].last)>he.length())he+=b[k].last;eclouse(b[k].last[0],he,b);}}}void move(chan &he,int m,edge b[]){int i,j,k,l;k=he.ltab.length();l=he.jihe[m].length();for(i=0;i<k;i++)for(j=0;j<N;j++)if((CHANGE[m]==b[j].change[0])&&(he.ltab[i]==b[j].first[0])) if(he.jihe[m].find(b[j].last[0])>he.jihe[m].length()) he.jihe[m]+=b[j].last[0];for(i=0;i<l;i++)for(j=0;j<N;j++)if((CHANGE[m]==b[j].change[0])&&(he.jihe[m][i]==b[j].first[0] ))if(he.jihe[m].find(b[j].last[0])>he.jihe[m].length()) he.jihe[m]+=b[j].last[0];}//输出void outputfa(int len,int h,chan *t){int i,j,m;cout<<" I ";for(i=0;i<len;i++)cout<<'I'<<CHANGE[i]<<" ";cout<<endl<<"-------------------------"<<endl;for(i=0;i<h;i++){cout<<' '<<t[i].ltab;m=t[i].ltab.length();for(j=0;j<len;j++){kong(8-m);m=t[i].jihe[j].length();cout<<t[i].jihe[j];}cout<<endl;}}void main(){edge *b=new edge[MAXS];int i,j,k,m,n,h,x,y,len;bool flag;string jh[MAXS],endnode,ednode,sta;cout<<"请输入NFA各边信息(起点条件[空为*] 终点),以#结束:"<<endl; for(i=0;i<MAXS;i++){cin>>b[i].first;if(b[i].first=="#") break;cin>>b[i].change>>b[i].last;}N=i;/*for(j=0;j<N;j++)cout<<b[j].first<<b[j].change<<b[j].last<<endl;*/for(i=0;i<N;i++){if(NODE.find(b[i].first)>NODE.length())NODE+=b[i].first;if(NODE.find(b[i].last)>NODE.length())NODE+=b[i].last;if((CHANGE.find(b[i].change)>CHANGE.length())&&(b[i].change!="* "))CHANGE+=b[i].change;}len=CHANGE.length();cout<<"结点中属于终态的是:"<<endl;cin>>endnode;for(i=0;i<endnode.length();i++)if(NODE.find(endnode[i])>NODE.length()){cout<<"所输终态不在集合中,错误!"<<endl;return;}//cout<<"endnode="<<endnode<<endl;chan *t=new chan[MAXS];t[0].ltab=b[0].first;h=1;eclouse(b[0].first[0],t[0].ltab,b); //求e-clouse//cout<<t[0].ltab<<endl;for(i=0;i<h;i++){for(j=0;j<t[i].ltab.length();j++)for(m=0;m<len;m++)eclouse(t[i].ltab[j],t[i].jihe[m],b); //求e-clouse for(k=0;k<len;k++){//cout<<t[i].jihe[k]<<"->";move(t[i],k,b); //求move(I,a)//cout<<t[i].jihe[k]<<endl;for(j=0;j<t[i].jihe[k].length();j++)eclouse(t[i].jihe[k][j],t[i].jihe[k],b); //求e-clouse }for(j=0;j<len;j++){paixu(t[i].jihe[j]); //对集合排序以便比较for(k=0;k<h;k++){flag=operator==(t[k].ltab,t[i].jihe[j]);if(flag)break;}if(!flag&&t[i].jihe[j].length())t[h++].ltab=t[i].jihe[j];}}cout<<endl<<"状态转换矩阵如下:"<<endl;outputfa(len,h,t); //输出状态转换矩阵//状态重新命名string *d=new string[h];NODE.erase();cout<<endl<<"重命名:"<<endl;for(i=0;i<h;i++){sta=t[i].ltab;t[i].ltab.erase();t[i].ltab='A'+i;NODE+=t[i].ltab;cout<<'{'<<sta<<"}="<<t[i].ltab<<endl;for(j=0;j<endnode.length();j++)if(sta.find(endnode[j])<sta.length())d[1]=ednode+=t[i].ltab;for(k=0;k<h;k++)for(m=0;m<len;m++)if(sta==t[k].jihe[m])t[k].jihe[m]=t[i].ltab;}for(i=0;i<NODE.length();i++)if(ednode.find(NODE[i])>ednode.length())d[0]+=NODE[i];endnode=ednode;cout<<endl<<"DFA如下:"<<endl;outputfa(len,h,t); //输出DFAcout<<"其中终态为:"<<endnode<<endl;//DFA最小化m=2;sta.erase();flag=0;for(i=0;i<m;i++){//cout<<"d["<<i<<"]="<<d[i]<<endl;for(k=0;k<len;k++){//cout<<"I"<<CHANGE[k]<<endl;y=m;for(j=0;j<d[i].length();j++){for(n=0;n<y;n++){if(d[n].find(t[NODE.find(d[i][j])].jihe[k])<d[n].length() ||t[NODE.find(d[i][j])].jihe[k].length()==0){if(t[NODE.find(d[i][j])].jihe[k].length()==0)x=m;elsex=n;if(!sta.length()){sta+=x+48;elseif(sta[0]!=x+48){d[m]+=d[i][j];flag=1;d[i].erase(j,1);//cout<<d[i]<<endl;j--;}break; //跳出n}}//n}//jif(flag){m++;flag=0;}//cout<<"sta="<<sta<<endl;sta.erase();}//k}//icout<<endl<<"集合划分:";for(i=0;i<m;i++)cout<<"{"<<d[i]<<"} ";cout<<endl;//状态重新命名chan *md=new chan[m];NODE.erase();cout<<endl<<"重命名:"<<endl;for(i=0;i<m;i++){md[i].ltab='A'+i;NODE+=md[i].ltab;cout<<"{"<<d[i]<<"}="<<md[i].ltab<<endl; }for(i=0;i<m;i++)for(k=0;k<len;k++)for(j=0;j<h;j++){if(d[i][0]==t[j].ltab[0]){for(n=0;n<m;n++)if(!t[j].jihe[k].length())break;elseif(d[n].find(t[j].jihe[k])<d[n].length()){md[i].jihe[k]=md[n].ltab;break;}}break;}}ednode.erase();for(i=0;i<m;i++)for(j=0;j<endnode.length();j++)if(d[i].find(endnode[j])<d[i].length()&&ednode.find(md[i].lta b))ednode+=md[i].ltab;endnode=ednode;cout<<endl<<"最小化DFA如下:"<<endl;outputfa(len,m,md);cout<<"其中终态为:"<<endnode<<endl;}/////////////////////////////////测试数据: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 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}=A{123}=B{124}=C{12356f}=D{12456f}=E{1246f}=F{1236f}=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}=A{DEFG}=B{B}=C{C}=D最小化DFA如下:I Ia Ib -------------------------A C DB B BC B DD C B 其中终态为:B。

相关文档
最新文档