如何为特定语言构建图灵机?

时间:2017-06-29 13:44:34

标签: automata turing-machines formal-languages

到目前为止,我遇到过两种语言。具有严格格式的语言,例如

L = {a ^ n b ^ n c ^ n | n> = 1}

这种语言非常严格,例如a bs总是会出现在b&#39之前。

我遇到的另一种类型是可以是任何订单的语言。

L = {a,b} *其中a的数量> b的数量

这种语言可以是任何一种语言的顺序,而且它不会卡在原地。

For the languages that are structured this machine conveys the general idea

但我找不到机器的模式,因为它可以是任何字符顺序。

例如

L = {a,b,c} * | a等于b和c的最小值

这些语言的模式是什么?什么是设计这些的真正有用的技术?

1 个答案:

答案 0 :(得分:0)

你的#a>的例子#b是一种用于无上下文语言的经典语言,由下推自动机识别。这些设备仅沿输入移动一次并具有下推式存储(堆栈)。基本思路是为输入中读取的每个字符串添加一个a;对于你,你删除一个。找到一种处理前缀的方法,其中b比a更多。然后,在读完整个输入后,你确切地接受了在堆栈上有一些左边的东西。

如果允许使用辅助磁带,可以在图灵机中轻松实现。只需使用一个作为堆栈。如果您在上一个示例中涉及更多数字,请使用更多辅助磁带。

如果没有辅助磁带,则必须使用读写磁头进行更多操作。例如,使用结构:

input%stack1%stack2%stack3%

其中%是在其他任何地方都不会出现的分隔符号。另一种选择是不属于下推自动机的方法:标记符号。例如,#a> #B:

  1. 标记第一个未标记的b
  2. 标记第一个未标记的
  3. 如果剩下未标记的b,请转到1。否则检查是否至少有一个未标记的左边 - 如果是这样接受,否则拒绝
  4. 这些是您可以用于这些计数问题的两种标准技术。当然,正如人们已经评论过的那样,对于每种语言,你都必须调整你的解决方案。