如何创建一个图灵机作为x ^ y的函数计算器

时间:2009-06-23 01:24:13

标签: turing-machines

我正在研究图灵机的测试,我遇到了一个问题,我必须创建一个图灵机作为功能计算器:

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.

2 个答案:

答案 0 :(得分:4)

我在这里猜一点,自从我玩图灵机模拟器以来已经有一段时间了。首先,我想将任务分成几个概念性步骤:

  1. 将磁带上的数字增加磁带上另一个数字的值
  2. 将磁带上的数字乘以磁带上另一个数字的值 - 这可以通过重复执行步骤1来完成
  3. 在磁带上设置一个数字 - x ^ 2是通过将x放在磁带上然后将其自身相乘来计算出来的
  4. (最后一步)将磁带上的数字提升到磁带上另一个数字的值 - 这可以通过重复执行步骤2来完成
  5. 要重复执行N次任务,将N放在磁带上,执行一次任务,然后从数字N的末尾减去1.重复直到数字N从磁带上消失。

    希望这足以让你开始。状态机可以或多或少地以这种方式构造。

答案 1 :(得分:1)

在我自己的图灵伪代码中:

  1. 将输入A0B复制到磁带2
  2. 将000010000写入磁带3
    • 将磁带3上的数字乘以A从磁带2乘以
      1. 从A
      2. 开始
      3. 将0写入磁带4
        • 复制号码3 => 4
        • 在Tape 3(3 ++)
        • 上前进一次
        • 除非A结束
        • ,否则转到第3步
        • 将回答从磁带4转移到磁带3
    • 减少磁带2上的数字B
  3. 如果磁带2上的B不为0,请转到步骤2
  4. 将答案从Tape 3复制到Tape 1
  5. 这是应该有效的图灵代码(磁带就像指针,小写字母,输入磁带是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
    #                          ^
    

    请检查错误:)