<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>Rest Valley &#187; nfa</title> <atom:link href="http://lihdd.net/tag/nfa/feed/" rel="self" type="application/rss+xml" /><link>http://lihdd.net</link> <description>The scratchpad of quark</description> <lastBuildDate>Sat, 09 Oct 2010 13:56:19 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <item><title>一个 NFA 引发的血案</title><link>http://lihdd.net/one-nfa-related-homework-exercise/</link> <comments>http://lihdd.net/one-nfa-related-homework-exercise/#comments</comments> <pubDate>Thu, 11 Mar 2010 01:49:10 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Coding]]></category> <category><![CDATA[dfa]]></category> <category><![CDATA[nfa]]></category><guid
isPermaLink="false">http://lihdd.net/?p=331</guid> <description><![CDATA[引发血案的 NFA 就是下面这个，来自最近的《编译原理》作业的一道题： 把 NFA 变成 DFA 是有明确的办法的。只是，如果试着画一画上面这个图，就会发现另外一个问题，到底要画多少条线，几个圈，会不会把自己绕糊涂呢 于是我就想去找一个程序，可以自动完成这种枯燥的 NFA 到 DFA 的转换工作 。在 pluskid 的这篇日志里面看到了 reAnimator 这个在线工具，它可以把一串正则表达式的NFA和最简的DFA画出来。不过只能处理简单的情况，像上面那样 (a&#124;b)*a(a&#124;b)(a&#124;b)(a&#124;b)(a&#124;b) 的表达式根本没法画出图来 reAnimator 作者的博客上面介绍了它的实现，但具体细节并没有公开，只好再去找其他的工具…… 直觉说 Mathematica 很可能提供了相关的功能。很遗憾找了半天没找到内建的和 FA 有关的函数，惊喜的是在网上有一个叫做 Finite Automata 的 Mathematica 包，看起来功能全面，挺不错。但是用一下就发现它的实现（比如，NFA 到 DFA 的转换）是有错误的，果断放弃 再找到的就是一个叫做 Visual Automata Simulator 的软件，提供了 NFA 到 DFA 转换的功能，看起来很不错。用它完成了转换工作，血案由此产生了：一共画出来了 32 个状态和 64 条边…… 经过简单的测试， VAS 软件并不会做最小化 DFA 的工作，那么上面的结果可不可以再简单一点呢？比如下面的这个 DFA： 可以被最小化到： [...]]]></description> <content:encoded><![CDATA[<p>引发血案的 NFA 就是下面这个，来自最近的《编译原理》作业的一道题：</p><div
id="attachment_306" class="wp-caption aligncenter" style="width: 528px"><img
class="size-full wp-image-306  " title="ex_nfa2dfa" src="http://lihdd.net/wp-content/uploads/2010/03/ex_nfa2dfa.png" alt="ex_nfa2dfa" width="518" height="97" /><p
class="wp-caption-text">将这个 NFA 转化成 DFA</p></div><p>把 NFA 变成 DFA 是有明确的办法的。只是，如果试着画一画上面这个图，就会发现另外一个问题，到底要画多少条线，几个圈，会不会把自己绕糊涂呢 <img
src='http://lihdd.net/wp-includes/images/smilies/hmm.png' alt='.~.' class='wp-smiley' /><br
/> <span
id="more-331"></span><br
/> 于是我就想去找一个程序，可以自动完成这种枯燥的 NFA 到 DFA 的转换工作 。在 <a
href="http://blog.pluskid.org/?p=285">pluskid 的这篇日志</a>里面看到了 <a
href="http://osteele.com/tools/reanimator/">reAnimator</a> 这个在线工具，它可以把一串正则表达式的NFA和最简的DFA画出来。不过只能处理简单的情况，像上面那样</p><pre>(a|b)*a(a|b)(a|b)(a|b)(a|b)</pre><p>的表达式根本没法画出图来 <img
src='http://lihdd.net/wp-includes/images/smilies/what.png' alt='o.o' class='wp-smiley' /> reAnimator 作者的博客上面介绍了它的实现，但具体细节并没有公开，只好再去找其他的工具……</p><p>直觉说 <em>Mathematica</em> 很可能提供了相关的功能。很遗憾找了半天没找到内建的和 FA 有关的函数，惊喜的是在网上有一个叫做 <a
href="http://library.wolfram.com/infocenter/Demos/75/">Finite Automata</a> 的 <em>Mathematica</em> 包，看起来功能全面，挺不错。但是用一下就发现它的实现（比如，NFA 到 DFA 的转换）是有错误的，果断放弃 <img
src='http://lihdd.net/wp-includes/images/smilies/sigh.png' alt=':sigh:' class='wp-smiley' /></p><p>再找到的就是一个叫做 <a
href="http://www.cs.usfca.edu/~jbovet/vas.html">Visual Automata Simulator</a> 的软件，提供了 NFA 到 DFA 转换的功能，看起来很不错。用它完成了转换工作，血案由此产生了：一共画出来了 32 个状态和 64 条边……</p><p>经过简单的测试， VAS 软件并不会做最小化 DFA 的工作，那么上面的结果可不可以再简单一点呢？比如下面的这个 DFA：</p><p
style="text-align: center;"><img
class="aligncenter size-full wp-image-318" title="dfa_normal" src="http://lihdd.net/wp-content/uploads/2010/03/dfa_normal.png" alt="dfa_normal" width="330" height="239" /></p><p>可以被最小化到：</p><p
style="text-align: center;"><img
class="aligncenter size-full wp-image-319" title="dfa_minimized" src="http://lihdd.net/wp-content/uploads/2010/03/dfa_minimized.png" alt="dfa_minimized" width="286" height="240" /></p><p
style="text-align: left;">试试看？我在 VAS 的代码上加了课本上介绍的最小化 DFA 的方法，结果对刚才的 64 条边的图毫无效果 <img
src='http://lihdd.net/wp-includes/images/smilies/meeh.png' alt='._.' class='wp-smiley' /></p><p
style="text-align: left;">那么就把这个图打印出来吧，都到这一步了，写一个“略”在作业本上不太好吧。不过，VAS 自己没有自动排版功能，线条和圆圈画得非常乱。在 VAS 中不难实现一个导出 dot 文件的功能，然后就可以用 <a
href="http://www.graphviz.org/">graphviz</a> 来排版了 <img
src='http://lihdd.net/wp-includes/images/smilies/happy.png' alt='(:' class='wp-smiley' /></p><p>最后排出来大概是<a
href="http://lihdd.net/wp-content/uploads/2010/03/dfa_by_dot.svg">这个样子</a>，还是挺乱的样子，也许自动排版成这个样子算是很好了吧。</p><p>我觉得 VAS 这个工具还是挺好的，在官方 1.2.2 版本上我添加了 DFA 最小化和导出到 dot 文件两个功能，擅自把版本号改成了 1.2.3。放在这里，也许什么时候会被用一下：</p><p><a
href="http://lihdd.net/wp-content/uploads/2010/03/vas.jar">Visual Automata Simulator 1.2.3 (jar)</a> <a
href="http://lihdd.net/wp-content/uploads/2010/03/vas_src.zip">(源代码)</a></p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/one-nfa-related-homework-exercise/feed/</wfw:commentRss> <slash:comments>10</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced

Served from: lihdd.net @ 2012-05-19 14:56:02 -->
