我正在研究图灵机的测试,我遇到了一个问题,我必须创建一个图灵机作为功能计算器:
f(x,y) = x ^ y
我理解我的磁带输入会像这样分开:
1's of base 0 1's of exponent
我的磁带输出就像
1's of base 0 1's of exponent 0 1's of the computed result
我如何将X和Y放在磁带上? (它可以是多磁带机) 状态图会是什么样子?
注意:我使用的是一元1,用于表示0和0不是用作值而是用作分隔符。
所以:
0 = delimiter
1 = 0
11 = 1
111 = 2
1111= 3
11111= 4
etc.
答案 0 :(得分:4)
我在这里猜一点,自从我玩图灵机模拟器以来已经有一段时间了。首先,我想将任务分成几个概念性步骤:
要重复执行N次任务,将N放在磁带上,执行一次任务,然后从数字N的末尾减去1.重复直到数字N从磁带上消失。
希望这足以让你开始。状态机可以或多或少地以这种方式构造。
答案 1 :(得分:1)
在我自己的图灵伪代码中:
这是应该有效的图灵代码(磁带就像指针,小写字母,输入磁带是i
):
# At the start for 2^3
# i: 000111011110000
# ^
_start_ -> *a = 0, start2
start2 [*i==0] -> i++, *a++ = 0, *b++ = 0, start4
start2 [*i==1] -> i++, *a++ = 1, start2
start4 [*i==0] -> *b-- = 0, b--, initc
start4 [*i==1] -> i++, *b++ = 1, start4
initc -> *c++ = 0, *c++ = 1, *c++ = 1, *c-- = 0, mult
# example
# i: 00011101111000
# ^
# a: 001110000
# ^
# b: 001111000
# ^
# c: 00011000
# ^
mult[*b==0]: lastcpy
mult[*b==1]: b--, *d++ = 0, *d++ = 1, rewa
rewa[*a==0]: a++, a++, multcpy
rewa[*a==1]: a--, rewa
multcpy[*c==1]: c++, multcpy2
multcpy[*c==0]: multcpy3
multcpy2[*a==0]: multcpy
multcpy2[*a==1]: *d++ = 1, multcpy2
multcpy3: *d-- = 0, *c = 0, cpydtoc
cpydtoc[*d==1]: d--, *c++ = 1, cpydtoc
cpydtoc[*d==0]: *c-- = 0, mult
lastcpy[*c==1]: *i++ = 1, c--, lastcpy
lastcpy[*c==0]: *i = 0, _finish_
# Should end with
# i: 00011101111011111111100
# ^
请检查错误:)