【发布时间】:2019-06-02 03:46:18
【问题描述】:
我需要正式(通过转换函数)描述图灵机,使得 {a,b}* 中的每个单词 w 都会将每个 a 更改为 b,并将每个 b 更改为 a。
我已经尝试过了,这是我的解决方案:
(s,a) -> (s,b,R)
(s,b) -> (s,a,R)
(s,空白) -> (n,空白)
n 是停止状态,s 是开始状态
这行得通吗? 谢谢!
【问题讨论】:
标签: turing-machines computation
我需要正式(通过转换函数)描述图灵机,使得 {a,b}* 中的每个单词 w 都会将每个 a 更改为 b,并将每个 b 更改为 a。
我已经尝试过了,这是我的解决方案:
(s,a) -> (s,b,R)
(s,b) -> (s,a,R)
(s,空白) -> (n,空白)
n 是停止状态,s 是开始状态
这行得通吗? 谢谢!
【问题讨论】:
标签: turing-machines computation
这类问题的常用方法是“测试”或“证明”。在这里,我将展示如何轻松测试您的方法是否成功:
GHCi, version 8.2.2: http://www.haskell.org/ghc/
:? for help
Prelude> :{
Prelude| cnv ('a':xs) = 'b':cnv xs
Prelude| cnv ('b':xs) = 'a':cnv xs
Prelude| cnv [] = []
Prelude| :}
Prelude> cnv "abaaab"
"babbba"
Prelude>
至少在我看来,这个 haskell 代码看起来与您的转换规范足够相似。 cnv 函数定义的第三行中的[] case 代表“空列表”,即它是您的暂停状态。对于这个函数的递归,它是递归停止的基本情况。
至于如何正式证明你的自动机是否结束,我还不足以帮助你解决这个问题。其他人可能会。
【讨论】:
您的 TM 工作正常。如果您对 TM 的表示法感到满意,那么您的表示法几乎是显而易见的,因此形式证明似乎有点过头了,但如果您真的坚持通过数学归纳法对输入长度进行证明,那就很简单了。
声明:给定的 TM 执行所描述的功能。
证明:证明是对最初记录在 TM 磁带上的输入字符串长度 m 的强数学归纳法。
基本情况:如果输入磁带包含空字符串,则 TM 执行转换 (s,blank) -> (n,blank) 并因此停止而不更改任何磁带符号。因为留在磁带上的结果字符串没有改变,所以它是空字符串。空字符串等同于用 b 替换所有 a 后的空字符串,反之亦然;字符串中没有任何符号与此相矛盾。
归纳假设:假设 TM 正确处理长度为 k 且包括 k 的所有输入字符串。
归纳步骤:我们必须证明 TM 正确处理所有长度等于 k + 1 的输入字符串。请注意,字母表 {a,b} 上长度为 k + 1 的任何输入字符串都等于某个输入字符串长度 k,附加符号 a 或符号 b。我们已经发现 TM 正确处理了长度为 k 的字符串;也就是说,它将所有 a 翻转为 b,反之亦然。此外,因为 TM 必须停止,所以它执行的最后一次转换是 (s,blank) -> (n,blank)。如果此时磁带上没有看到空白,而是看到了 a 或 b,我们将处于当前情况:也就是说,TM 将通过处理长度为 k 的前缀使其到达相同的位置我们的长度为 k + 1 的字符串。不是执行转换 (s,blank) -> (n,blank) 而是强制执行转换之一 (s,a) -> (s,b,R) 或(s,b) -> (s,a,R),取决于第 (k + 1) 个符号是 a 还是 b。这些转换将正确翻转位置 k + 1 处的符号,留下一个 k + 1 字符串,所有符号都正确交换。下一个转换将看到空白并转换到暂停状态。证明到此结束。
【讨论】: