将函数编写为图灵机流程图的有效策略

时间:2018-03-02 19:31:16

标签: recursion turing-machines

我在将功能可视化为图灵机方面遇到了麻烦,反之亦然。有没有一种方法可以用来做这种转换/可视化?或者你必须聪明,突然“得到整个事情”?

例如,你怎么能为函数f(x1,x2,...,xn)= x1 + x2 + ... + xn?

写一个图灵机

我可以使用我所知道的任何编程语言中的简单递归来完成此操作。但我仍然无法将它绑在图灵机上。

1 个答案:

答案 0 :(得分:0)

我倾向于使用Brainfuck,但任何Brainfuck程序都可以转换为通用的图灵机程序。

至于你所拥有的例子,最简单的程序是你想要的:

>[<[->+<]>>]

所以想象你有以下状态:

1 2 3 4 5 0 ...
^

程序停止后,您将具有以下状态

0 0 0 0 15 0 ...
           ^

如果您打开the visualizer,很容易看到发生了什么。

这是通用图灵机中的相同程序:

;; Adds the input together in hexadecimal
;; This does the same as BF >[<[->+<]>>]

; initial state go to check
0 * * r c ; >

; check if done
c 0 0 * halt ; [...] (when _)
c * * l r    ; [< (otherwise)

; r(educe) here, then i(ncrease) except when 0
r 0 0 r n    ; []> (when 0)
r 1 0 r i    ; [-> (when 1)
i 0 1 l r    ; +<] (when 0)
r 2 1 r i    ; [-> (when 2)
i 1 2 l r    ; +<] (when 1)
r 3 2 r i    ; etc.
i 2 3 l r
r 4 3 r i
i 3 4 l r
r 5 4 r i
i 4 5 l r
r 6 5 r i
i 5 6 l r
r 7 6 r i
i 6 7 l r
r 8 7 r i
i 7 8 l r
r 9 8 r i
i 8 9 l r
r A 9 r i
i 9 A l r
r B A r i
i A B l r
r C B r i
i B C l r
r D C r i
i C D l r
r E D r i
i D E l r
r F E r i
i E F l r


; go to right check if done
n * * r c     ; >

您需要将123450作为初始磁带,我已在an online simulator中完成此操作。现在这个比BF版本长得多的原因是图灵机没有数字的概念,只有符号。我必须告诉它每个数字的后继是什么以及每个数字的前身是什么。这也意味着我决定如何建模我的数字,因为你看到我选择了十六进制,因为可视化器有多个char符号的问题。 (有这些限制,难怪我们不是都在编程:-))

现在虽然图灵机示例的数量会超过15,但BreanFuck版本每个单元只能保证256个状态。因此,要使程序添加任意大数,您需要一种方法来建模甚至在BF中的数字。对于图灵机,可以计算哪个是锻炼的点,以及提供输入和输出的难度,模型数据只是细节。我在BF中做了a lisp interpreter,我看到一些fancy BF programs输出了大的计算数字。因此,它通常是我们的想象力的限制,而不是图灵机故障a)程序是不可能的b)程序低优雅。