NFA2DFA.docx
- 文档编号:27517998
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:20
- 大小:65.68KB
NFA2DFA.docx
《NFA2DFA.docx》由会员分享,可在线阅读,更多相关《NFA2DFA.docx(20页珍藏版)》请在冰豆网上搜索。
NFA2DFA
课程名称:
NFA2DFA
年级/专业/班:
11级计算机类
(二)班
姓名:
徐勇兵
学号:
E01114278
实验三:
求NFA的确定化以及最小化DFA
实验目的:
1.学会利用计算机求NFA的确定化以及最小化DFA。
2.加强对NFA确定化和最小化方法的深入理解。
3.实验验证NFA与某个DFA的等价性。
实验要求:
1)用矩阵形式来表达一个NFA和一个DFA。
2)将子集法和分割法的步骤显示在程序中。
输入:
矩阵形式的一个NFA,指明终态。
输出:
确定化以后的DFA及最小化后的DFA。
实验原理:
1.在有穷自动机的领域里,有这样的定理:
设L为一个由不确定的有穷自动机接受的集合,则存在一个接受L的确定的有穷自动机。
2.一种将NFA确定化为DFA的算法叫“子集法”。
3.子集法中要用到ε-closure(I)的概念,它是指状态集I中的任意状态经任意条ε弧而能到达的状态的集合(显然,集合I中的任意状态都属于ε-closure(I))。
4.状态集合I的a弧转换表示为move(I,a),定义为状态集合J,其中J是所有那些可从I中的某一状态经过一条a弧而能够到达的状态的集合。
5.有穷自动机可以通过消除无用状态和合并等价状态而转换成一个最小的与之等价的有穷自动机。
6.所谓有穷自动机的无用状态,是指这样的状态:
从该自动机的开始状态出发,任何输入串也不能到达的那个状态或者从这个状态没有通路到达终态,对于给定的有穷自动机,如果它含有无用状态,则可以简单地将其删除。
7.在有穷自动机中,两个状态s和t等价的条件是:
(1)一致性条件——状态s和t必须同时为可接受状态或不可接受状态。
(2)蔓延性条件——对于所有输入符号,状态s和t必须转换到等价的状态里。
8.一种寻找DFA中等价状态的方法叫做“分割法”。
实验算法:
1.实验中的NFA确定化算法为子集法,课本中有详尽说明,此处不再赘述。
2.实验中的DFA最小化算法为分割法,课本上亦有解释,此处从略。
实验结果:
(JAVA)
importjava.util.Stack;
importjava.util.Vector;
importjavax.swing.JOptionPane;
classTools{
publicVector
Vector
for(inti=0;i newvector.add(vs.get(i)); returnnewvector; } publicVector Vector for(inti=0;i Vector Vector for(intj=0;j temp.add((String)produce.get(j)); }//forj newvector.add(temp); }//fori returnnewvector; } publicVector for(inti=0;i //if(! vs.contains(temp.get(i))) vs.add(temp.get(i)); }//for returnvs; }//publicVector }//classtools classElements{ Vector Vector Vector Stringstart="0";//初态 Stringend="10";//终态 publicvoidsetproduce(){ while(true) { Strings=JOptionPane.showInputDialog(null,"请输入产生式,->隔开"); if(s==null) return; Vector temp.add(s.split("->")[0]); temp.add(s.split("->")[1]); produce.add(temp); }//while }//publicvoidaddproduce() publicvoidrun(){ /*************************TEST********************************/ inputTable.add("a"); inputTable.add("b"); Vector temp.add("0"); temp.add("e"); temp.add("1"); produce.add(temp); /*************************/ Vector temp1.add("0"); temp1.add("e"); temp1.add("7"); produce.add(temp1); /*************************/ Vector temp2.add("1"); temp2.add("e"); temp2.add("2"); produce.add(temp2); /*************************/ Vector temp3.add("1"); temp3.add("e"); temp3.add("4"); produce.add(temp3); /*************************/ Vector temp4.add("2"); temp4.add("a"); temp4.add("3"); produce.add(temp4); /*************************/ Vector temp5.add("3"); temp5.add("e"); temp5.add("6"); produce.add(temp5); /*************************/ Vector temp6.add("4"); temp6.add("b"); temp6.add("5"); produce.add(temp6); /*************************/ Vector temp7.add("5"); temp7.add("e"); temp7.add("6"); produce.add(temp7); /*************************/ Vector temp8.add("6"); temp8.add("e"); temp8.add("7"); produce.add(temp8); /*************************/ Vector temp9.add("6"); temp9.add("e"); temp9.add("1"); produce.add(temp9); /*************************/ /*************************/ Vector temp10.add("7"); temp10.add("a"); temp10.add("8"); produce.add(temp10); /*************************/ /*************************/ Vector temp11.add("8"); temp11.add("b"); temp11.add("9"); produce.add(temp11); /*************************/ Vector temp12.add("9"); temp12.add("b"); temp12.add("10"); produce.add(temp12); /*************************/ statusTable.add("0"); statusTable.add("1"); statusTable.add("2"); statusTable.add("3"); statusTable.add("4"); statusTable.add("5"); statusTable.add("6"); statusTable.add("7"); statusTable.add("8"); statusTable.add("9"); statusTable.add("10"); //System.out.println("produce.size()="+produce.size()); /***********************TEST**********************************/ //this.setend(); //this.setnoend(); //this.setproduce(); } publicvoidshow(){ System.out.print("状态表输出如下: "); for(inti=0;i System.out.print((String)statusTable.get(i)+","); } System.out.println(); System.out.print("又穷字母表输出如下: "); for(inti=0;i System.out.print((String)inputTable.get(i)+","); } System.out.println(""); System.out.print("转换函数输出如下: "); for(inti=0;i System.out.println(""); Vector System.out.print((String)temp.get(0)+""+(String)temp.get (1)+""+(String)temp.get (2)); } System.out.println(""); System.out.println("初态是: "+start); System.out.println("初态是: "+end); } publicVector returninputTable; } publicVector returnstatusTable; } publicStringgetend(){ returnend; } publicStringgetstart(){ returnstart; } publicVector returnthis.produce; } }//classElements publicclassNFA2DFA{ Elementselements; Vector Vector Vector Vector Vector Vector Stringstart="";//初态 Stringend="";//终态 publicStringgetflag(Vector intindex=result.indexOf(vs); //System.out.println("index="+index); Stringflag=flagTable.get(index); returnflag; } publicvoidshowresult(){ System.out.println("新的状态集标注如下(已重新命名)"); for(inti=0;i System.out.print(flagTable.get(i)+"="); Vector System.out.print("{"); for(intj=0;j System.out.print(temp.get(j)); }//forj System.out.print("}"); System.out.println(); }//for System.out.println("新的装换函数如下"); for(inti=0;i Vector System.out.print(temp.get(0)+""); System.out.print(temp.get (1)+""); System.out.print(temp.get (2)); System.out.println(); } }//publicvoidshowresult() publicvoidshow(){ System.out.print("状态表输出如下: "); for(inti=0;i System.out.print((String)statusTable.get(i)+","); } System.out.println(); System.out.print("又穷字母表输出如下: "); for(inti=0;i System.out.print((String)inputTable.get(i)+","); } System.out.println(""); System.out.print("转换函数输出如下: "); for(inti=0;i System.out.println(""); Vector System.out.print((String)temp.get(0)+""+(String)temp.get (1)+""+(String)temp.get (2)); } System.out.println(""); System.out.println("初态是: "+start); System.out.println("初态是: "+end); } publicbooleanaddElements(Vector booleanflag=false; Vector for(inti=0;i if(! vs.contains(temp.get(i)))////如果向量本来就为空,这句话是否会报错 { vs.add(temp.get(i)); flag=true; add.add(temp.get(i)); } }//for returnflag; }//publicVector publicVector Vector for(inti=0;i result.add(vs.get(i)); } booleanflag=true; BlockA: while(flag){ flag=false; //System.out.println("循环"); for(intm=0;m Stringstatus=result.get(m); Vector booleanbb=addElements(result,temp); if(bb){//如果有新的元素加入 flag=true; continueBlockA; }//if }//form }//while() returnresult; }//publicVector publicVector Vector result.add(vs); for(inti=0;i Vector Stringleft=temp.get(0); Stringmiddle=temp.get (1); Stringright=temp.get (2); if(left.equals(vs)&&middle.equals("e")){ //System.out.println("yes"); if(result.contains(right)==false)//如果向量本来就为空,这句话是否会报错 result.add(right); }//if(left.equals("status")&&middle.equals("e") }//for /*System.out.println("求空闭包结果如下"); for(inti=0;i System.out.print(result.get(i)); System.out.println();*/ returnresult; }//publicVector
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NFA2DFA
![提示](https://static.bdocx.com/images/bang_tan.gif)