3

我正在开发一个软件来从正则表达式生成一个图灵机。

[ 编辑:为了澄清,OP希望将正则表达式作为输入,并以编程方式生成图灵机来执行相同的任务。OP 正在寻求执行正则表达式创建 TM 的任务,而不是使用正则表达式。]

首先,我将解释一下我做了什么,然后我的具体问题是什么:

我将正则表达式建模如下:

正则表达式(接口):下面的类实现了这个接口

简单(即:“aaa”、“bbb”、“abcde”):这是一个叶类,它没有任何子表达式

ComplexWithoutOr (ie: "a(ab)*","(a(ab) c(b) )*"):这个类包含一个正则表达式列表。

ComplexWithOr (ie: "a(a|b) ","(a((ab) |c(b) ) "):该类包含一个Or运算,其中包含一个RegularExpression的列表。它表示“a|b " 第一个例子的一部分和第二个例子的 "(ab) |c(b) "。

变量(即:“awcw”,其中 w E {a,b}*):尚未实现,但想法是将其建模为具有与 Simple 不同的逻辑的叶类。它代表示例的“w”部分。

理解并同意上述模型很重要。如果您有任何问题,请在继续阅读之前发表评论...

在 MT 生成方面,我有不同程度的复杂性:

很简单:这种表达方式已经在起作用了。为每个字母生成一个新状态并向右移动。如果在任何状态下,读取的字母不是预期的,它就会启动一个“回滚电路”,在 MT 磁头处于初始位置时结束,并在非最终状态下停止。

ComplexWithoutOr:我的问题来了。在这里,算法为每个子表达式生成一个 MT 并将它们连接起来。这适用于一些简单的情况,但回滚机制有问题。

这是一个不适用于我的算法的示例:

“(ab) abac”:这是一个 ComplexWithoutOr 表达式,它包含一个 ComplexWithOr 表达式“(ab) ”(在“ab”内有一个 Simple 表达式)和一个 Simple 表达式“abac”

我的算法首先为“ab”生成一个 MT1。这个 MT1 被 MT2 用于“(ab)*”,所以如果 MT1 成功则再次进入 MT1,否则 MT1 回滚,MT2 正确完成。换句话说,MT2 不能失败。

然后,它为“abac”生成一个 MT3。MT2的输出就是MT3的输入。MT3的输出是执行的结果

现在,假设这个输入字符串:“abac”。如您所见,它与正则表达式匹配。因此,让我们看看执行 MT 时会发生什么。

MT1 第一次执行“ab”。MT1 第二次“ac”失败并回滚,将 MT 头置于第三位置“a”。MT2 正确完成并将输入转发到 MT3。MT3 失败,因为 "ac"!="abac"。所以 MT 不识别“abac”。

你明白这个问题吗?你知道有什么解决办法吗?

我是用Java开发的,但是语言不重要,我想讨论一下算法。

4

3 回答 3

2

我并不完全清楚你到底想实现什么。看起来您想要制作一个图灵机(或任何一般的 FSM),它只接受那些也被正则表达式接受的字符串。实际上,您希望将正则表达式转换为 FSM。

实际上,这正是真正的正则表达式匹配器在幕后所做的。我认为Russ Cox 的这一系列文章涵盖了很多你想做的事情。

于 2010-07-03T14:45:28.533 回答
1

Michael Sipser 在《计算理论导论》的第 1 章中证明,正则表达式在描述能力上等价于有限自动机。部分证明涉及构建一个非确定性有限自动机 (NDFA),它可以识别特定正则表达式所描述的语言。我不打算复制那一章的一半,由于使用了符号,这将是相当困难的,所以我建议你借或购买这本书(或者使用这些术语的谷歌搜索可能会出现类似的证据)并使用它证明作为算法的基础。

由于图灵机可以模拟 NDFA,我假设生成 NDFA 的算法已经足够好了。

于 2010-07-03T14:56:02.063 回答
0

在 chomsky 层次结构中,正则表达式是 Level3,而 TM 是 Level1。这意味着,TM 可以生成任何正则表达式,但反之则不行。

于 2010-07-02T18:55:44.747 回答