课程名称: 从正规文法构造有穷状态自动机年级/专业/班: 11级计算机类(二)班
姓名: 徐勇兵
学号: E01114278
从正规文法构造有穷状态自动机输入:任意的正规文法
输出:相应的有穷状态自动机
要求:识别有穷状态自动机是确定的还是
非确定的,生成相应的五元组形式。
说明:应检查输入的是否正规文法。
实验截图:
测试一:
测试二:
*
************************************************************************** 测试三:
import java.util.Vector;
import javax.swing.JOptionPane;
class Tools{
public Vector
Vector
for(int i=0;i newvector.add(vs.get(i)); return newvector; } public Vector for(int i=0;i Vector Vector for(int j=0;j temp.add((String)produce.get(j)); }//for j newvector.add(temp); }//for i return newvector; } public Vector //if(!vs.contains(temp.get(i))) vs.add(temp.get(i)); }//for return vs; }//public Vector class Elements{ Vector Vector Vector public void setend(){//终结符元素添加 while(true) { String s=JOptionPane.showInputDialog(null,"请输入终结符"); if(s==null) { return; }//if end.add(s); }//while }//public void addend(){//元素添加 public void setnoend(){//非终结符元素添加 while(true) { String s=JOptionPane.showInputDialog(null,"非请输入终结符"); if(s==null) { return; }//if noend.add(s); }//while }//public void addnoend(){// public void setproduce(){ while(true) { String s=JOptionPane.showInputDialog(null,"请输入产生式,->隔开"); if(s==null) return; Vector temp.add(s.split("->")[0]); temp.add(s.split("->")[1]); produce.add(temp); }//while }//public void addproduce() public Vector return end; } public Vector return noend; } public Vector return this.produce; } public void run(){ /*************************TEST********************************/ end.add("a"); end.add("b"); noend.add("S"); noend.add("A"); noend.add("B"); Vector temp.add("S"); temp.add("aA"); produce.add(temp); /*************************/ Vector temp1.add("S"); temp1.add("bB"); produce.add(temp1); /*************************/ Vector temp2.add("S"); temp2.add("e"); produce.add(temp2); /*************************/ Vector temp3.add("A"); temp3.add("aB"); produce.add(temp3); /*************************/ Vector temp4.add("A"); temp4.add("bA"); produce.add(temp4); /*************************/ Vector temp5.add("B"); temp5.add("aS"); produce.add(temp5); /*************************/ Vector temp6.add("B"); temp6.add("bA"); produce.add(temp6); /*************************/ Vector temp7.add("B"); temp7.add("e"); produce.add(temp7); /*************************/ Vector temp8.add("S"); temp8.add("aB"); produce.add(temp8); /* Vector temp9.add("S"); temp9.add("aAA"); produce.add(temp9);*/ // System.out.println("produce.size()="+produce.size()); /***********************TEST**********************************/ //this.setend(); //this.setnoend(); //this.setproduce(); } public boolean Iscontainend(String s)//正则表达式判断s1是否在END的闭包里面正则忘了怎么写了 { int length=s.length(); for(int i=0;i { String a=""+s.charAt(i); if(end.contains(a)) continue; else return false; }//for return true; }//public boolean isRGPcontain(String s) public boolean IsNoENd(String s){ String ss=""+s.charAt(0); if(! Iscontainend(ss))//如果不含有终结符,则为非终结符 return true; return false; }// public boolean public void show(){ System.out.print("终结符输出如下:"); for(int i=0;i System.out.print((String)end.get(i)+", "); } System.out.println(" "); System.out.print("非终结符输出如下:"); for(int i=0;i System.out.print((String)noend.get(i)+", "); } System.out.println(" "); System.out.print("产生式输出如下:"); for(int i=0;i System.out.println(" "); Vector System.out.print((String)temp.get(0)+"->"+(String)temp.get(1)); } System.out.println(" "); } }//class Elements public class Test { Elements elements; Tools tools=new Tools(); Vector Vector Vector Vector Vector String start="S";//初态 String last="Z";//终态 public void firststep(){ if(elements.Iscontainend("aA")==true) System.out.println("yes"); for(int i=0;i Vector String left=temp.get(0); String right=temp.get(1); if(right.length()!=1){//S->aA形式 String one=""+right.charAt(0); String two=""+right.charAt(1); Vector temp1.add(left); temp1.add(one); temp1.add(two); newproduce.add(temp1); }//if else{//S->a形式 String one=""+right.charAt(0); Vector temp1.add(left); temp1.add(one); temp1.add(last); newproduce.add(temp1); } } } public boolean iszhenggui(){ for(int i=0;i Vector String left=temp.get(0); String right=temp.get(1); if(right.length()>2) return false; if(right.length()==1){ if(elements.IsNoENd(right)==false)//S->A 不满足 return false; } if(right.length()==2){ String one=""+right.charAt(0); String two=""+right.charAt(1); if(elements.Iscontainend(one)==false)// return false; if(elements.IsNoENd(two)==false)// return false; } } return true; } public void FA(){//构造自动机 } public void setstatusTable(){//状态表 for(int i=0;i statusTable.add(noend.get(i)); } statusTable.add(last); } public void setinputTable(){//状态表 for(int i=0;i inputTable.add(end.get(i)); } } public void show(){ System.out.print("状态表输出如下:"); for(int i=0;i System.out.print((String)statusTable.get(i)+", "); } System.out.println(" "); System.out.print("字母表输出如下:"); for(int i=0;i System.out.print((String)inputTable.get(i)+", "); } System.out.println(" "); System.out.print("转换函数输出如下:"); for(int i=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("终态是"+last); } public boolean judge(){ boolean flag=true; Vector //Vector for(int i=0;i Vector String left=temp.get(0); String midle=temp.get(1); if(vs.isEmpty()){//如果是第一次放入数据 Vector temp2.add(left); temp2.add(midle); vs.add(temp2); } else{ //System.out.println("11"); Vector temp2.add(left); temp2.add(midle); //System.out.println("left="+left+" midle="+midle); if(vs.contains(temp2)) return false; else vs.add(temp2); } } return true; } public Test(){ elements=new Elements(); elements.run(); this.end=elements.getend(); this.noend=elements.getnoend(); this.produce=elements.getproduce(); elements.show(); boolean tag1=iszhenggui(); if(tag1) System.out.println("是正规式"); else {System.out.println("不是正规式");System.out.println("程序结束");return;} firststep(); setstatusTable(); setinputTable(); this.show(); Boolean tag=judge(); if(tag) System.out.println("是DFA"); else System.out.println("不是NFA"); }// public static void main(String[] args) { Test app=new Test(); } } 计算理论 字母表:一个有穷的符号集合。 字母表上的字符串是该字母表中的符号的有穷序列。 一个字符串的长度是它作为序列的长度。 连接反转Kleene星号L* ,连接L中0个或多个字符串得到的所有字符串的集合。 有穷自动机:描述能力和资源极其有限的计算机模型。 有穷自动机是一个5元组M=(K,∑,?,s,F),其中 1)K是一个有穷的集合,称为状态集 2)∑是一个有穷的集合,称为字母表 3)?是从KX∑→K的函数,称为转移函数 4)s∈K是初始状态 5)F?K是接收状态集 M接收的语言是M接收的所有字符串的集合,记作L(M). 对于每一台非确定型有穷自动机,有一台等价的确定型有穷自动机 有穷自动机接受的语言在并、连接、Kleene星号、补、交运算下是封闭的。 每一台非确定型有穷自动机都等价于某一台确定型有穷自动机。一个语言是正则的当且仅当它被有穷自动机接受。 正则表达式:称R是一个正则表达式,如果R是 1)a,这里a是字母表∑中的一个元素。 2)?,只包含一个字符串空串的语言 3)?,不包含任何字符串的语言 4)(R1∪R2),这里R1和R2是正则表达式 5)(R10R2),这里R1和R2是正则表达式 6)(R1*),这里R1*是正则表达式 一个语言是正则的当且仅当可以用正则表达式描述。 2000年4月 1、根据图灵机理论,说明现代计算机系统的理论基础。 1936年,图灵向伦敦权威的数学杂志投了一篇论文,题为《论数字计算在决断难题中 的应用》。在这篇开创性的论文中,图灵给“可计算性”下了一个严格的数学定义,并 提出著名的“图灵机”(Turing Machine)的设想。“图灵机”不是一种具体的机器,而是一种思想模型,可制造一种十分简单但运算能力极强的计算机装置,用来计算所有能想像得到的可计算函数。这个装置由下面几个部分组成:一个无限长的纸带,一个读写头。(中间那个大盒子),内部状态(盒子上的方块,比如A,B,E,H),另外,还有一个程序对这个盒子进行控制。这个装置就是根据程序的命令以及它的内部状态进行磁带的读写、移动。工作带被划分为大小相同的方格,每一格上可书写一个给定字母表上的符号。控制器可以在带上左右移动,它带有一个读写出一个你期待的结果。这一理论奠定了整个 现 代计算机的理论基础。“图灵机”更在电脑史上与“冯·诺依曼机”齐名,被永远载 1、请你从形式定义、计算过程和对应的语言特点关系等诸方面综合比较DFA、PDA和图灵机 2、对于简单文法(正则语言、上下文无关语言),能够根据其产生式写出其语言 3、正则语言泵引理和上下文无关语言泵引理的理解、相互比较和应用 4、最简DFA、最简PDA的概念;DFA和PDA的简化过程;(带ε和不带ε的)NFA化简成最简DFA的过程 5、图灵机的Golder编码和通用图灵机的编码 6、上下文无关文法的乔姆斯基范式 7、DFA的计算过程 8、上下文无关文法的推导过程以及其歧义相关概念及分析 9、关于四类乔姆斯基语言及其对应的自动机类型特点分析 10、四类乔姆斯基语言的各种运算类型并形式化表示 11、关于CFG和DFA的若干判定问题 12、关于若干渐进符号:同阶渐进符号Θ、大O、小O和大Ω符号的含义和用法 13、请从NP类问题、P类问题、确定型单带TM、确定型多带TM、非确定型TM等角度综述 时间复杂性规律 相关例题: 1、请你综合比较DFA、PDA和图灵机 2、请写出下列表达式生成的正则语言 1)设有文法G=(V,T,P,S),其中V={S,A,B},T={a,b},P:S→aB;S→bA;A→bAA;A →a;A→aS;B→b;B→bS;B→aBB 请写出L(G)= 2)设一个有穷自动机M=(Q,∑,δ,q0,F),其中Q={q0,q1,q2,q3),∑={0,1}, F={q0},δ如下: δ(q0,0)=q2, δ(q0,1)=q1, δ(q1,0)=q3, δ(q1,1)=q0 δ(q2,0)=q0, δ(q2,1)=q3, δ(q3,0)=q1, δ(q3,1)=q2 请写出L(M)= 3)设有文法G=({S,A},{a,b,c,d};R,S),其中R:S→aSd|aAd, A→bAc|bc 请写出L(G)= 3、用泵引理证明下列论点 1)A1={a n b n c n|n≥0}不是正则语言 2)D={ww|w∈{0,1}*}不是上下文无关语言 4、把下面状态转换图代表的DFA变化成最简DFA 编译原理课程设计设计题目:有限自动机的运行 年级:计062 姓名:黄思铭 学号: 200600401062 日期: 2010-5-18 指导教师: 陈望明 广西工学院计算机工程系 设计目的: 1、 理解有限自动机的作用 2、 利用转态图和状态表表示有限自动机 3、 以程序实现有限自动机的运行过程 设计内容:(注:题目详细要求) 利用状态表和有限自动机的运行原理编制程序,使得程序能够识别一个输入串是否为一个有效的符号串,具体可以选择下面之一:无符号定点实数、自然数、整数、十六进制数或其它自己定义的符号串。 一、分析原理 词法分析:就是从左至右逐个字符地对源程序进行扫描,产生单词序列,用以语法分析。 在这里,我们先把文法转换成有穷自动机,然后构造出状态表,再由状态表构造出程序。 二、分析的算法 将G[<无符号数>]文法转换成有穷自动机: 构造状态矩阵;将有穷自动机的状S 1 S 2 ……S n 及输入的字a 1 a 2 ……a m 构成一个n*m 的矩阵。 再写一个程序,把状态矩阵用二维数组表示。程序通过输入的字符转换状态,从而可以识别出单词。 本程序的关键在状态表和缓冲区的运用。首先定义了一个布尔型函数ReadALine把输入的字符串送到缓冲区中;然后定义了布尔型函数Run 和Getchar实现对输入字符串的正确性判断,更改Run函数可以改变程序功能:如可将状态表改变成识别“偶数”的有限自动机的状态表。 三、程序流程图 四、课程设计出现的问题及解决的方法 刚开始写该程序时,虽然感觉个人的编程能力不错,但由于对编译原理的自动机的实现掌握不足,难以入手。但经过对问题的更深入了解和分析,再通过网上和书本的资料的细读,最后终于把程序编写出来了。程序中,碰到的最大的问题就是状态表的构造和如何把它转变为一个程序的实现过程。解决的方法当然是看书。 五、课程设计的体会 首先,题目给出的文法是有小毛病的。我个人认为<无符号数>不可能推出 . <十进制数> 或者 e <指数部分>的。在写这个程序是只要对编译原理书本词法分析分析很熟悉就可以比较容易地 写出该程序。通过这次课程设计,我对程序的编译和运行有了更进一步的了解,更好地掌握了编译原理的词法分析过程。 六、程序清单 #include 设计有穷自动机DFA实现C++简单程序的词法分析、扫描 前面两篇(一、二)只是直观地针对已明确给出的教学语言Tiny 源程序进行直接的词法分析(其实根本就称不上),不具有一般性(下面这个针对C++源程序的词法分析也相当单一,考虑面不足)。下面是我们的课程实验,需要结合课堂上学到的利用有限自动机DFA的方法来设计并分析源程序,提取出符合要求的Token。 根据老师给出的课件以及教材上的内容,扫描程序(词法分析)有下面3种实现方式,前面两篇(一、二)就是属于“直接编写”这一类,而本文则是“DFA”这一类。 1、按实验要求(如下),目前只拙劣地实现了第(1)和(5)点。 而且第(1)点中有两个要求未能完成: ★浮点数,因为包含单行、多行注释的DFA已经很混乱了,这部分暂时先不实现,考虑将来用“表驱动法”(即状态转换表)来实现。 ★注释,与教材类似不打印单行和多行注释,因此代码实现中少了处理注释的内容。 实验中用到的C++源程序与要求如下图: 2、对实验要求中的“样例程序”稍微修改了一下。 ★头文件 #include 2006年秋《计算理论基础》本科生试卷 填空题 1、确定型有穷自动机的形式定义是一个5元组(Q,∑,δ,q0,F)其中: (1)Q为有穷状态集,(2)∑有穷字母表,(3)δ(q,a)是转移函数,它的第1个自变量为q∈Q,第二个自变量a∈∑,其结果δ(q,a)∈Q,即为Q×∑→Q的函数(映射),(4)q0为初始状态(一般只有一个),(5)F有一些接受状态(可以为多个。 2、非确定型有穷自动机N接受字符串w=b1b2…b m,是指存在状态序列r0,r1,…,r m,且满足:(1)r0=q0;(2)r i+1∈δ(r i,a i+1) (i=0,1,…,m-1),(3)r m∈F。 3、正则表达式的定义是:(1)a∈∑,空串ε,空集Φ均为合法的正则表达式,(2)若R1,R2是正则表达式,则(R1?R2)、R1?R2、R1*均是正则表达式。 4、将正则表达转换成自动机时,先建立单个字符的自动机,再用并、连、星号运算得到复杂正则表达的自动机,而将自动机转换为正则表达式时,需要先建立新开始状态与一个新接受态,在新开始状态与原开始状态之间连上空串边,在原来所有的接受状态与新接受状态间连空串边。 5、对于正则语言A的任意字符串s,当其长度≥p(泵长度)时,则一定存在满足|y|>0、|xy|≤p分解方式S=xyz,使得任意i≥0,xy i z∈A。这是正则语言的性质,基于此性质并利用反证法可证明一个语言不是正则语言,这时需要验证满足“|y|>0、|xy|≤p”的每种可能分解方式,都不满足“任意i≥0,xy i z∈A”。 6、非确定型下推自动机PDA接受w=w1w2…w m,是指存在状态序列r0,r1,…,r m,栈字字符串序列s0,s1,…,s m∈Γ*,满足:(1)r0=q0,s0=ε;(2)(r i+1,b)∈δ(r i,w i+1,a),其中s i=at(此时a 为栈顶元素),s i+1=bt(b为当前动作后的栈顶元素);(3)r m∈F,s m=ε。 7、Turing机特点:(1)可以从输送带中读出字符,也可以修改输入带中的字符;(2)可沿输入带向右移动直到遇到字符串结束标志为止,也可从右向左移动直到遇到左端标志为止;(3)可以边读写边移动读写头,也可以不读写而单纯移动;(4)如果进入了“接受”状态则停机(不必消耗所有字符),如果进入了“拒绝”状态也停机,否则一直运行,永不停机。 8、图灵机的形式定义是7元组(Q,∑,Γ,δ,q0,q accept,q reject),其中:(1)Q为状态集;(2)∑为输入字母表,不包括空白符号;(3)Γ为带字母表,包括∑与空格;(4)δ:Q?Γ→Q?Γ?{L,R},转换函数,第1个自变量的取值范围是Q,第2个自变量的取值范围是Γ,其值域是一个三元组,第一个分量表示下一个状态,第二个分量表示写入到输入带上的字符,第三个分量表示下一步的位置;(5)q0∈Q是初始状态;(6)q accept∈Q是接受状态;(7)q reject∈Q拒绝状态,且q reject≠q accept。 9、图灵机M接受字符串w,是指存在一系列的格局C1,C2,…,C k,使得:(1)C1是M 在输入w的起始格局,即C1=q0w;(2)每个C i确定地产生C i+1;(3)Ck是接受格局,即从起始格局起,经过有限步后可达到接受格局。 二、简述题 1、每个多带图灵机等价于某台单带图灵机。请参考下图陈述单带图灵机描述多带图灵机的的细节。多带图灵机为M,待的单带图灵机记为S。 编译原理》无符号数的有穷自动机的实现(2007-12-04 15:07:27) package test; import java.io.*; public class Test1 { public static void main(String args[]){ InputStream input=System.in; InputStreamReader reader=new InputStreamReader(input); BufferedReader buf=new BufferedReader(reader); char num[]=new char[10]; String line=null; int i,flag; char ch1,ch2; while(true){ System.out.println("Please Input Number:"); try{ line=buf.readLine(); }catch(Exception e){ e.printStackTrace(); } if(line.equals("exit")){ System.out.println("退出"); break; } line=line+"$"; num=line.toCharArray(); i=0; flag=0; while(num[i]!='$'){ ch1=num[i]; ch2=num[i+1]; if(ch1>='0'&&ch1<='9'){ if((ch2>='0'&&ch2<='9') || ch2=='.' || ch2=='e' || ch2=='$'){ flag=1; } else flag=0; } if(ch1=='.'){ 一.填空题 1.语言类P 、PSPACE 、NP 、NPSPACE 、EXPTIME 之间的关系为 (EXPTIME NPSPACE PSPACE NP P ?=??)。 2.产生语言{12n 03n |n ≥0}的上下文无关文法是(00011|A A ε→)。 3.命题“利用递归定理,一个TM M 可以得到自己的描述 《编译原理》习题(一)——词法分析 一、是非题(请在括号内,正确的划√,错误的划×) 1.编译程序是对高级语言程序的解释执行。(× ) 2.一个有限状态自动机中,有且仅有一个唯一的终态。(×) 9.两个正规集相等的必要条件是他们对应的正规式等价。(× ) 二、选择题 1.词法分析器的输出结果是_____。 A.( ) 记号 B.( ) 相应条目在符号表中的位置 C.( ) 记号和属性二元组D.( ) 属性值 2.正规式 M 1 和 M 2 等价是指_____。 A.( ) M1和M2的状态数相等 B.( ) M1和M2的有向边条数相等 C.( ) M1和M2所识别的语言集相等D.( ) M1和M2状态数和有向边条数相等3.语言是 A.句子的集合 B.产生式的集合 C.符号串的集合 D.句型的集合 4.编译程序前三个阶段完成的工作是 A.词法分析、语法分析和代码优化 B.代码生成、代码优化和词法分析 C.词法分析、语法分析、语义分析和中间代码生成 D.词法分析、语法分析和代码优化 5.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即 A.字符 B.单词 C.句子 D.句型 6.构造编译程序应掌握______。 A.( )源程序B.( ) 目标语言 C.( ) 编译方法D.( ) 以上三项都是 7.词法分析的任务是 A.识别单词 B.分析句子的含义 C.识别句子 D.生成目标代码 三、填空题 1.计算机执行用高级语言编写的程序主要有两种途径:___解释__和__编译___。 3.编译过程可分为(词法分析),(语法分析),(语义分析与中间代码生成),(优化)和(目标代码生成)五个阶段。 6.扫描器的任务是从(源程序中)中识别出一个个(单词符号)。 17.一张转换图只包含有限个状态,其中有一个被认为是(初)态;而且实际上至少要有一个(终)态。 1.编译程序首先要识别出源程序中每个(单词),然后再分析每个(句子)并翻译其意义。3.通常把编译过程分为分析前端与综合后端两大阶段。词法、语法和语义分析是对源程序的(分析),中间代码生成、代码优化与目标代码的生成则是对源程序的(综合)。 5.对编译程序而言,输入数据是(源程序),输出结果是(目标程序)。 1.如果一个语言被有穷自动机识别,则这个语 言是正则语言。 2.正则语言在并运算、连结、星号运算下封闭 3.每一台非确定有穷自动机都等价与一台确 定型有穷自动机。 4.一个语言是正则的当且仅当有一台非确定 型有穷自动机识别。 5.空集连接到任何集合上得到空集,空串连接 到任何一个串上不改变这个字符串。 6.一个语言是正则的,当且仅当有一个正则表 达式描述。 7.如果一个语言是正则的,则可以用正则表达 式描述它。 8.任何一个上下文无关语言都可以用乔姆斯 基范式的上下文无关文法产生。 9.一个语言是上下文无关的当且仅当存在一 台下推自动机识别它。 10.如果一个语言被下推自动机识别,则它是上 下文无关的。 11.每一个正则语言都是上下文无关的。 1.格局——图灵机计算过程中,当前状态、当 前带内容和读写头当前的位置组合在一起, 称为图灵机的格局。 2.图灵可识别(递归可枚举语言)——如果一 个语言可能被某一图灵机识别,则称该语言 是图灵可识别的。 3.图灵可判定(递归语言)——如果一个语言 能被某一图灵机判定,则称它是一个图灵可 判定的。 ——在输入上运行一个TM时,可能出现三种结果:接受、拒绝或者循环。这里循环仅仅指机器不停机,而不一定是这个词所指的那样,永远以同样的方式重复同样的步骤。 ——图灵机有两种方式不接受:一种是它进入拒绝状态而拒绝它,另一种是进入循环。 4.判定器——有时候很难区分进入循环还是 需要耗费很长时间的运行,因此,我们更喜 欢讨论所有输入都停机的图灵机,他们永远 不循环,这种机器称为判定器。他们总是能 决定接受还是拒绝,也称识别某个语言的判 定器判定该语言。 5.每一个可判定语言都是图灵可识别的。 6.每一个多带图灵机等价于一个单带图灵机。 7.非确定型图灵机都等价于一个确定型图灵 机。8.如果一个语言是图灵可识别的,当且仅当存 在非确定型图灵机识别它。 9.一个语言是图灵可判定的,当且仅当存在非 确定型图灵机判定它。 10.丘奇图灵论题——算法的明确定义。 11.详细描述图灵机的术语——①形式化描述, 详尽的写出图灵机的状态、转移函数,这是 最底层次的、最详细程度的描述。②描述水 平要高一些,称为实现描述,使用日常用语 来描述图灵机,没有给出状态和转移函数③ 高水平描述,他也是使用日常用语来描述算 法,忽略了实现模型不需要提及图灵机怎样 管理它的带子和读写头。 12.A DFA(确定型有穷自动机)、A NFA(非确定 型有穷自动机)、A REX(正则表达式)、 E DFA(判Φ的确定型有穷自动机)、EQ DFA(两 个判别同一个语言的DFA)、 A CFG(上下文无关文法)、ECFG(判Φ上下文 无关文法)、 A LBA(线性界限自动机)、是一个可判定语言 每一个上下文无关语言是可判定的。 A TM(图灵机)、停机问题、HALT TM(一个图 灵机对于给定的输入是否停机)、E TM(不接受任 何语言图灵机)、REGULAR TM(正则图灵机)、 EQ TM(接受串相等的图灵机)、 E LBA(不接受语言的线性界限自动机)、 ALL CFG、PCP(波斯地图对应实例)是不可判定 的。 A TM(补)是不可识别的。 13.一个语言的补是由不在此语言中的所有串 构成的语言。如果一个语言的补集是图灵可 识别的语言,则称它是补图灵可识别的。 14.一个语言是可判定的,当且仅当它既是图灵 可识别的,也是补图灵可识别的。 15.设M是一个图灵机,w是一个串。M在w 上的一个接受计算历史(accepting computation history)是一个格局序列C1、 C2、……、C l,其中C1是M在w上的起始 格局,C l是M的一个接受格局,且每个C i 都是C i-1的结果,即符合M规则。M在w 上的一个拒绝计算历史可类似定义。只是 C l是一个拒绝格局。 16.计算历史都是有限序列。如果M在w上永 不停机,则在M上既没有接受历史,也没 有拒绝计算历史存在。确定型机器在任何给 定的输入上最多只有一个计算历史。非确定 型机器即使在单个输入上都有多个计算历 史,他们与各个分支相对应。 17.线性有穷自动机是一种受到限制的图灵机, 它不允许其读写头离开包含输入带的区域。 如果此机器试图将它的读写头离开输入的 两个端点,则读写头就在原地保持不动。这 与普通的图灵机读写头不会离开带子的左 端点方式一样。 18.讲一个问题归约为另一个问题的概念可以 用多种方式来定义,选择哪种方式要根据具 体应用的情况。我们选择一种简单方式的可 归约性,叫做映射可归约性。 19.用映射可归约性把问题A归约为问题B指 的是:存在一个可计算函数,他将问题A 的实例转换成问题B的实例。如果有了这样 一个转换函数(称为归约),就能用B的解 决方案来解决A。 20.函数f:∑*→∑*是一个可计算函数,如果 有某个图灵机M,使得每个输入w上M停 机,且此时只有f(w)出现在带上。 21.语言A是映射可归约到语言B的,如果存在 可计算函数f:∑*→∑*使得对每个w w∈A<=>f(w)∈B 22.记做A≤mB,称作函数f为A到B的归约。 如果A≤mB且A是不可判定的,则B也是不 可判定的。 如果A≤mB且B是图灵可识别的,则A也是 图灵可识别的 23.EQ TM既不是图灵可识别的,也不是补图灵 可识别的。 24.令t:N→R+是一个函数,定义时间复杂 性类TIME(t(n))为由时间O(t(n))的图灵机可 判定的所有语言的集合。 25.t(n)是一个函数,t(n)≥n。则每一个多带图 灵机都和某一个O(t2(n))时间的单带图灵机 等价。 26.t(n)是一个函数,t(n)≥n。则每一个t(n)时间 的非确定型单带图灵机都与某一个2O(t(n))时 间的确定型单带图灵机等价。 27.P类是一个语言类,该类在多项式时间内可 判定。 28.PATH∈P、RELPRIME∈P、每一个上下文 无关文法都是P 29.一个语言在NP中,当且仅当它能被某个非 确定型多项式时间的图灵机判定。 30.{HAMPATH, CLQUE, SUBSET-SUM, SAT, 3SAT, UHAMPATH, }∈NP 31.P=成员可以快速判定的语言类 NP=成员可以快速验证的语言类 32.若存在多项式时间图灵机M,使得在任何输 入w上,M停机时f(w)恰好在带上,函数f: ∑*→∑*是一个多项式时间可计算函数。 33.语言A称作多项式时间映射可归约到语言 B,或者简称为多项式时间可归约到B,记 为A≤pB,若存在多项式时间可计算函数 f:∑*→∑*,对于每一个w,有 w∈A<=>f(w)∈B 函数f称为A到B的多项式时间归约。 34.列文-库克定理 SAT∈P,当且仅当P=NP 35.3SAT多项式时间可归约到CLIQUE。 36.令f:N→R+是一个函数。空间复杂性类和 NSPACE(f(n))定义如下: SPACE(f(n))={L|L是被O(f(n))空间的确定型 图灵机判定的语言} NSPACE(f(n))={L|L是被O(f(n))空间的非确定 型图灵机判定的语言} 37.萨维奇定理 计算理论习题解答 练习 1.1图给出两台DFA M i和M2的状态图?回答下述有关问题? a. M 1的起始状态是q1 b. M1的接受状态集是{q2} c. M2的起始状态是q1 d. M2的接受状态集是{ q1, q4) e. 对输入aabb,M1经过的状态序列是q1, q2, q3, q1, q1 f. M 1接受字符串aabb吗?否 g. M 2接受字符串£吗?是 1.2给出练习 2.1中画出的机器M1和M2的形式描述 M 1=(Q 1,2,3 1,q1,F1)其中 1) Q1={q 1,q2,q3,}; 2) 2 ={a,b}; 3) 3 1 为: a b q1q2 q1 q2q3 q3 q3q2 q1 4) q1 5) F1={q 2} M2=(Q2,2,3 2,q2,F2)其中 1) Q2={q 1,q2,q3,q4}; 2) 2 ={a,b}; 3) 3 2为: a b q1q1 q2 q2q3 q4 q3q2 q1 q4q3 q4 3) q2是起始状态 4) F2={q 1,q4} 1.3 DFA M 的形式描述为({q1, q2, q3, q4, 机器的 q5}, {u,d}, 3 ,q3, {q3}),其中3在表2-3中给出。试画出此状态图。 1.6画出识别下述语言的DFA的状态图。 a){w | w从1开始以0结束} c) {w | w含有子串0101} 彳 c n 1 d) {w | w的长度不小于3,且第三个符号为0} 0,1 ,1 g) {w | w 的长度不超过 5} 0,1 0,1 0,1 h){w | w i){w | w 的奇位置均为1} k) { 2} 斗「0,1 1 I) {w | w 含有偶数个0,或恰好两个1} 1 - 1 . 1 0 0 0 1 m)空集 _ 0,1 n)除空串外的所有字符串 1.7给出识别下述语言的 NFA ,且要求符合规定的状态数。 #include { k=i; for(j=i+1;j 第三章有穷自动机 1、教学目的及要求: 本章介绍有关有穷自动机的基本概念和理论以及正规文法、正规表达式与有穷自动机之间的相互关系。要求掌握正则文法、状态转换图、DFA、NFA、正规式和正规集的基本概念。 2、教学内容: 本章介绍有关有穷自动机的基本概念和理论以及正规文法、正规表达式与有穷自动机之间的相互关系。 3、教学重点: 状态转换图。 4、教学难点: ◇正规式的定义-如何用作单词的描述工具 ◇有穷自动机的定义和分类-如何用作单词的识别系统 ◇正规式到有穷自动机的转换算法-词法分析程序的自动构造原理 ◇正则文法、正规集、DFA、NFA的相互转化。 5、课前思考 ◇什么是有穷自动机? ◇什么是状态转换图? 6、章节内容 第一节有穷自动机的形式定义 第二节 NFA到DFA的转换 第三节正规文法与有穷自动机 第四节正规表达式与FA 第五节 DFA在计算机中的表示 3.1 有穷自动机的形式定义 有穷状态自动机(Finite-state Automata 或简称FA)在识别功能上与正规文法类等价,而且也等价于一个特殊类型的语言产生器——正规表达式(Regular Expression)。因此许多简单的程序语言都可由FA所识别。事实上,它是描述词法的有效工具,也是进行词法分析的主要理论基础。 为了构造词法分析程序,要研究构词法,每种词类的结构模式以及识别它的数学模型——有穷自动机。它的模拟程序可以作为词法分析程序的控制程序。 有穷自动机(也称有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合,引入有穷自动机这个理论,正是为词法分析程序的自动构造寻找特殊的方法和工具。 有穷自动机分为两类:确定的有穷自动机(Deterministic Finite Automata)和不确定的有穷自动机(Nondeterministic Finite Automata) 。 一、确定有穷自动机的形式定义 一个确定的有穷自动机M(记作DFA M)是一个五元组M=(K,Σ,f,S,Z),其中(a) K是一个有限状态集合。 (b) Σ是一个字母表,它的每个元素称为一个输入字符。 (c) S∈K,S 称为初始状态,唯一。 (d) Z?K,Z称为终态集合, 终态也称可接受状态或结束状态。 (e) f是转换函数,是一个从K×Σ到K的单值映射。f(k i,a)=k j(k i,k j∈Q,a∈Σ)k j称为k i的一个后继状态。 确定性的体现:初始状态唯一;转换函数为单值映射。 例:设DFA M=({S,U,V,Q},{a,b},f,S,{Q})其中 f(S,a)=U,f(S,b)=V f(U,a)=Q,f(U,b)=V f(V,a)=U,f(V,b)=Q f(Q,a)=Q,f(Q,b)=Q 因为(1)初始状态唯一是S,(2)每个转换函数均为单值映射。所以该FA为确定有穷自动机。 二、状态转换表 DFA的映射关系可以由一个矩阵表示,矩阵的行标表示状态,列标表示输入字符,矩阵元素表示f(s,a)的值,这个矩阵称为状态转换表。 例: 内蒙古工业大学信息工程学院 实验报告 课程名称: _____编译原理 _____ _ 实验名称:无符号数的有穷自动机的实现 实验类型:验证性□ 综合性□ 设计性□ 实验室名称:电力大楼九楼东 班级:计12-1班学号: 201220201006 姓名:初旭组别: 同组人:成绩: 实验日期: 2015年6月2日 实验一无符号数的有穷自动机的实现 (一)实验目的 无符号数的有穷自动机的实现目的是使学生掌握文法的形式描述,穷自动机的概念。将文法转换成有穷自动机的方法,理解出错处理程序思想,如何用状态矩阵实现一个穷自动机的机内表示。 (二)实验内容 1.无符号数的BNF描述 (0)<无符号数> → d <余留无符号数> | .<十进制数> | e <指数部分> (1)<余留无符号数>→d <余留无符号数>|.<十进制数> | e <指数部分>|ε(2)<十进制小数> → d <余留十进制小数> (3)<余留十进制小数> e <指数部分> | d <余留十进制小数> | ε (4)<指数部分> → d <余留整指数> | + <整指数> | - <整指数> (5)<整指数> → d <余留整指数> (6)<余留整指数> → d <余留整指数> | ε 2.将G[<无符号数>]文法转换成有穷自动机。 3.构造状态矩阵;将有穷自动机的状S 1S 2 ……S n 及输入的字a 1 a 2 ……a m 构 成一个n*m的矩阵。 4.用状态矩阵设计出一个词法分析程序。 5.扫描无符号数,根据文法给出无符号数出错的位置。 (三)实验原理 1)无符号数的文法描述如下: 0.<无符号数> → d <余留无符号数> | . <十进制数> | e <指数部分> 1.<余留无符号数> → d <余留无符号数> | . <十进制数> | e <指数部分> | ε 2.<十进制小数> → d <余留十进制小数> 3.<余留十进制小数> e <指数部分> | d <余留十进制小数> | ε 学生实验报告册2017 ——2018 学年第1学期 学院:信息与电气工程学院 专业:计算机科学与技术 姓名:李金 学号:195140046 班级:计算机2班 实验一词法分析器的设计 一、实验目的 1、通过设计编制一个调试一个具体的此法分析程序,理解词 法分析在编译程序中的作用。 2、加深对有穷自动机模型的理解。 3、掌握词法分析程序的实现方法和要求。 4、用C语言,对一个简单语言的子集编制一个一遍扫描的 程序,以加深对编译原理的理解,掌握编译程序的实现方 法和技术。 编制一个读单词过程,从输入的源程序中,识别出 各个具有独立意义的单词,即基本保留字、标识符、 常数、运算符、分隔符五大类,并依次输出各个单 词的内部编码及单词符号自身值(遇到错误时课显 示“Error”,然后跳过错误部分继续显示) 一、程序要求 程序输入/输出示例 如源程序为C语言,输入如下一段: Main() { int a,b; a = 10; b = a + 20; } 要求输出如下图 (2,main) (4,=) (5,() (3,10) (5,)) (5,;) (5,{) (2,b) (1,int) (4,=) (2,a) (2,a) (5,,) (4,+) (2,b) (3,20) (5,;) (5,;) (2,a) (5,}) 要求: 1、识别保留字:if,int,for,while,do,return,break,continue; 单 词识别码为1; 2、其他的都识别为标识符;单词识别码为2; 3、常数为无符号整数;单词识别码为3; 4、运算符包括:+,-,*,/,=,<,<=,!=;单词识别码为4; 5、分隔符包括:,、;、{、}、(、);单词识别码为5; 二、实验步骤 1、定义部分:定义常亮、变量、数据结构。 2、初始化:从文件源程序全部输入到字符缓冲区中。 《计算理论》复习题总结 1、自动机、可计算性、复杂性内涵及关系; 计算理论的三个传统的核心领域:自动机、可计算性和复杂性。通过“计算机的基本能力和局限性是什么?“这一问题将这三个领域联系在一起。可计算理论与复杂性理论是密切相关的,在复杂性理论中,目标是把问题分成容易计算的和难计算的;而在可计算理论中,是把问题分成可解的和不可解。自动机阐述了计算的数学模型的定义和性质,主要包含两种模型:有穷自动机模型;上下文无关文法模型。可计算性理论和复杂性理论需要对计算机给了一个准确的定义。自动机理论允许在介绍与计算机科学的其他非理论领域有关的概念时使用计算的形式化定义。 2、有穷自动机、正则语言、正则表达式、非确定有穷自 动机、非正则语言; 有穷自动机:描述能力和资源极其有限的计算机模型。是一个5元组(Q,∑,δ,q0,F),其中1)Q是一个有穷集合,称为状态集。2)∑是一个有穷集合,称为字母表。3)δ:Q×∑→Q是转移函数。4)q0∈Q是起始状态。5)F?Q是接受状态集。 正则语言:如果一个语言能被有穷自动机识别。 正则表达式:用正则运算符构造描述语言的表达式。称R是正则表达式,如果R是:1)a,a是字母表中的一个元素;2)ε;3)?;4)(R1?R2);5)(R1 R2);6)(R1*) 非确定有穷自动机:是一个5元组(Q,∑,δ,q0,F),其中1)Q是有穷状态集。2)∑是有穷字母表。3)δ:Q×∑ε→P(Q)是转移函数。4)q0∈Q是起始状态。5)F?Q是接受状态集。 3、上下文无关语言及上下文无关文法、歧义性、乔姆 斯基范式、下推自动机、等价性、非上下文无关语言; 上下文无关语言:用上下文无关文法生成的语言。 上下文无关文法:是一个4元组(V,∑,R,S)且1)V是一个有穷集合,称为变元集2)∑是一个与V不相交的有穷集合,称为终结符集3)R是一个有穷规则集,每条规则由一个变元和一个由变元及终结符组成的字符串构成,4)S∈V是起始变元 歧义性:如果字符串W在上下文无关文法G中有两个或者两上以上不同的最左派生,则称G歧义地产生的字符串W。如果文法G歧义的产生某个字符串则称G是歧义的。 乔姆斯基范式:一个上下文无关文法如果它的每一个规则具有如下形式A→BC A→a其中a为任意终结符,ABC为任意变元且BC不是起始变元,此外允许规则S→ε其中S是起始变元。 下推自动机:是6元组Q,∑,Γ,δ,q0,F),这里Q,∑,Γ,F都是有穷集合,并且1)Q是状态集 2)∑是字母表 3)Γ是栈字母表 4)δ: Q×∑ε×Γε→P(Q×Γε)是转移函数学 5)q0∈Q是起始状态。6)F?Q是接受状态集。 4、各种等价性; 每一台非确定型有穷自动机等价于一台确定的有穷自动机;一个语言是正则的当且仅当可以用正则表达式描述;一个语言是上下文无关的则存在一台下推自动机识别它。 5、计算科学;能性问题;Church-Turing论题;计算; 可计算; 计算科学:系统的研究信息描述和变换的算法,包括其理论、分析、设计、效率、实现和应用。用计算科学涵盖并称谓计算机科学和计算机工程。计算机科学所研究问题的核心是能行问题。能行问题:什么能被(有效的)自动化?什么不能被(有效)的自动化? Church-Turing论题:可计算性等价于Turing机可计算性。 计算:Truing机所进行的工作就是计算。 可计算:Turing机能够进行的工作就叫可计算。 6、几个计算模型;各种计算模型的特点;图灵机的特点; 计算模型:1、递归函数。G?del,Church,等人提出并完善了递归函数理论。从数学演算的思想出发,考虑从简单的、直观上可计算的函数出发构复杂的可计算函数。2、Turing机(理论模型):Turing研究的Turing机计算模型与现代计算机更接近,在Turing机的基础上引进了大量的自动机。 3、Church-λ演算:用来描述计算过程,基本思想主要用于函数式程序语言的研制。4、Post系统(符号变换系统):Post系统的基础上引进了大量的形式语言。 Turing机的特点:存储无穷,时间无限制。Turing机可计算只是理论上可计算,并不是现实可计算。现实可计算:研究计算复杂性。但如果Turing机不可计算则现实更不可计算。 7、原语言,指令系统,输入输出规定; 原语言:变元、标号(语句标号)、指令:X=X+1;X=X-1;To A IF X≠0;To A;Y=X输入变元用x表示 x,x1,x2,x3,……输出变元用y表示,函数只输出一个值。 对程序做如下两点规定:1、当程序开始执行时自动认为一切变元的值为0 (输入变元除外)2、当程序出现下列两种情形之一时,自动认为停机。a、转向无定义的标号b、执行程序的最后一条指令。 8、n元程序对应的n元函数的定义; 若程序P恰有n个输入变元X1,X2,……,Xn,而没有其它X变元,则称P为n元程序。计算机考博试题计算理论及答案
计算机研究生《计算理论》复习题
编译原理课程设计报告(无符号数的有穷自动机的实现)
设计有穷自动机DFA实现C
湖南大学计算理论引论期末试题2006年秋本科试卷a-答案
无符号数的有穷自动机的实现
计算理论2013 12题
编译原理词法分析习题集带答案
计算理论知识点
计算理论习题解答
编译原理实验有穷自动机
第三章 有穷自动机
无符号数的有穷自动机的实现
词法分析器的设计
《计算理论》复习题总结