编译原理实验DFA最小化.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实用文档 标准 PAGE 1 2016.11.09 确定有穷自动机的最小化 目录 TOC \o 1-3 \h \z \u 一、实验名称 2 二、实验目的 2 三、实验原理 2 1、DFA的定义 2 2、无用状态 2 3、状态等价条件 2 四、实验思路 3 1、输入 3 2、move算法 3 3、子集划分算法 3 4、输出 4 五、实验小结 4 1、输入存储问题 4 2、子集划分算法问题 4 3、输出问题 4 六、附件 4 1、源代码 4 2、运行结果截图 7 一、实验名称 确定有穷自动机的最小化 二、实验目的 1、输入DFA,输出等价的状态数最少的DFA; 2、实现子集划分算法; 3、输入和输出均以定义的形式。 三、实验原理 1、DFA的定义 一个确定的有穷自动机M是一个五元组,M=(K,E,f,S,Z)其中 K是一个有穷集,它的每个元素称为一个状态; E是一个有穷字母表,它的每个元素称为一个输入符号; f是转换函数,是K×E-K上的映像,即,如f(ki,a)=kj(ki∈K,kj∈K)就意味着,当前状态为ki,输入字符为a时,将转换到下一状态kj,我们把kj称作ki的一个后继状态; S∈K,是唯一的一个初态; Z包含于K,是一个终态集,终态也称可接受状态或结束状态。 2、无用状态 所谓有穷自动机的无用状态,是指这样的状态:从该自动机的开始状态出发,任何串也不能到达的那个状态。或者从这个状态没有通路到达状态。 3、状态等价条件 a.一致性条件——状态s和t必须同时为可接受状态或不可接受状态 b.蔓延性条件——对于所有输入符号,状态s和状态t必须转换到等价的状态里。 四、实验思路 本次实验采用python完成。 1、输入 根据实验要求,以DFA的定义形式输入,即输入M=(K,E,f,S,Z),其中f另外输入。采用putin作为输入函数,首先输入定义形式,用split函数按照’}‘进行分割,再按照’}’分割。最后对得到的二维列表zanshi1中的元素进行输出,得到K,E,S,Z。再输入f中弧的条数,依次输入弧。 2、move算法 move算法与NFA的确定化里的算法一样,在这里为了求某一子集经过弧到达什么子集而使用move算法。思路是:建立一个新列表存放move算法产生的状态集合,若f中的弧的输入符号为a或者b,求经过紧跟a或者b的下一个状态,将这些状态放于新列表中。 3、子集划分算法 定义operation()函数为子集划分算法函数,具体执行步骤如下: a.将K中的状态集分为两种:终态集和非终态集,存于KK中,KK存放最终划分后得到的集合。 b.设立循环条件,子集划分算法划分最细的情况是每个状态都为一个子集,所以以此作为循环条件。若KK中集合个数不等于K中状态个数,则继续循环。 c.设立标志位llag=0用来决定是否跳出循环,每不执行一次划分算法则llag加1,若最终llag等于KK长度,说明此次循环没有子集划分,则说明划分完毕,退出循环。 d.对KK中的集合依次进行操作,判断他们进过move算法得到的集合是否是KK中已有的集合,若是则不执行划分,否则执行划分算法。 e. 若执行划分算法,则先算出集合中首个状态的move算法得到的集合属于哪个已知集合,再对其他状态进行同样操作,和首个状态move算法属于相同集合的放于同一个列表中,其他的放于另一个列表中。 f.将KK中原来要划分的集合删除,加入划分后的两个集合。循环执行上述步骤,知道KK中集合个数和标志位llag值相同或者KK中集合个数等于K中状态个数,则退出循环。 4、输出 输出同样为DFA的定义形式,先输出M=(K,E,f,S,Z),再输出其中的f。 五、实验小结 本次实验主要遇到了以下问题: 1、输入存储问题 输入要求使用定义形式,需要区分输入的元素,分别得到状态集,输入符号集,初态集以及终态集。通过python中的split函数将输入的字符串分别以’{‘和’}’分开,再通过循环操作取出得到的二维列表中每一个元素的第二个元素,即为所求的状态集,输入符号集,初态集以及终态集,再输出f的具体弧。 2、子集划分算法问题 子集划分算法需要对划分后得到的集合一直执行划分算法,但是会有一个表示划分完毕的结果,在程序中通过设立两个条件来判断是否划分完毕,一是划分得到的子集个数是否等于状态集中状态个数,若是则说明每个状态都为一个子集,即肯定划分结束。另一判断条件为设置一个标志位,通过观察标志位的数值来判断本次划分算法是否执行,若没有执行则说明已经划分完毕,同样退出循环。 3、输出问题 输出的形式为DFA的定义形式,通过对

文档评论(0)

黄礼志 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档