Binary 二进制数加法和比较的图灵机

Binary 二进制数加法和比较的图灵机,binary,automata,finite-automata,turing-machines,turing-complete,Binary,Automata,Finite Automata,Turing Machines,Turing Complete,大家好 为了学习,我正在尝试解决这个问题。有人能指导我解决这三个问题吗 就像我试过的第一个问题,两个以“+”分隔的二进制数相加。其中,我尝试了两个数字相加,用各自的数字1或0表示每个数字,例如5=1或0 0 0 0,然后将它们相加,结果也将与所表示的格式相同,但如何添加或表示2个二进制文件并用+分隔,没有任何线索。图灵机的机头会从左移到加号,然后从加号左右移动吗?但是如何进行添加。就我所知,TM不能简单地添加二进制文件,我们必须制作一些逻辑来表示它的二进制文件,就像简单地添加2个数字一样。比较两

大家好

为了学习,我正在尝试解决这个问题。有人能指导我解决这三个问题吗

就像我试过的第一个问题,两个以“+”分隔的二进制数相加。其中,我尝试了两个数字相加,用各自的数字1或0表示每个数字,例如5=1或0 0 0 0,然后将它们相加,结果也将与所表示的格式相同,但如何添加或表示2个二进制文件并用+分隔,没有任何线索。图灵机的机头会从左移到加号,然后从加号左右移动吗?但是如何进行添加。就我所知,TM不能简单地添加二进制文件,我们必须制作一些逻辑来表示它的二进制文件,就像简单地添加2个数字一样。比较两个二进制文件的情况也类似吗?
关于

有两种方法可以解决加法问题。假设您的输入磁带的格式为
^a+b$
,其中
^
$
是表示您已到达输入的前面和后面的符号

  • 您可以通过
    1
    每一步递增
    b
    并递减
    a
    ,直到
    a
    为0,此时
    b
    将是您的答案。这是假设您可以轻松地编写一个可以递增和递减的TM
  • 您可以实现一个完整的加法TM,使用进位,就像您在纸上添加二进制数字一样
  • 对于任一选项,您都需要代码来查找
    a
    b
    中的最低有效位。这个问题指定最高有效位是第一位,因此对于
    a
    您需要从
    +
    开始,对于
    b
    您需要从
    $
    开始

    例如,假设我们想要增加
    1011$
    。我们将使用的算法是找到最不重要的未标记数字。如果是
    0
    ,请将其替换为
    1
    。如果是
    1
    ,请向左移动

  • 首先查找$,将读取头移动到那里。将读取头向左移动
  • 您会看到一个
    1
    。将读取头向左移动
  • 您会看到一个
    1
    。将读取头向左移动
  • 您将看到一个
    0
    。写入
    1
  • 将读取头返回到$。二进制数现在是
    1111$
  • 要比较两个数字,您需要跟踪已经查看的值。这是通过扩展带有“标记”字符的字母表来实现的<例如,代码>0可以标记为
    X
    1
    可以标记为
    Y
    X
    的意思是“这里有一个0,但我已经看到了

    因此,对于相等性,我们可以从
    ^
    开始
    a
    =
    开始
    b
    (假设输入看起来像
    ^a=b$
    )算法是找到
    a
    b
    的开头,比较它们的第一个未标记位。第一次得到不同的值时,停止并拒绝。如果得到
    =
    $
    ,则停止并拒绝

    让我们看一下输入
    ^11=10$

  • 读取头从^开始
  • 向右移动头部,直到找到未标记的位
  • 读取
    1
    。写入
    Y
    。磁带读取
    ^Y1=10$
    。我们处于表示已读取
    1
    的状态
  • 向右移动头部,直到找到
    =
  • 向右移动头部,直到找到未标记的位
  • 读取a
    1
    。这与我们之前读取的位匹配。写入a
    Y
  • 向左移动头部,直到找到
    ^
  • 转至步骤2
  • 这次,我们将在
    a
    中读取
    1
    ,并在
    b
    中读取
    0
    。我们将暂停并拒绝

  • 希望这有助于您开始学习。

    我将从问题2和3开始,因为它们实际上比问题1容易

    我们假设我们有有效的输入(两边都是非空的二进制字符串,没有前导零),因此我们不需要进行任何输入验证。为了检查数字是否相等,我们可以简单地在=符号上来回跳转,一次划掉一个数字。如果我们在任何点上发现不匹配,我们会拒绝。如果我们在左边还有一个数字,但在右边找不到,我们会拒绝。如果我们在左边和右边的数字都用完了,我们会拒绝还有一些在右边,我们拒绝。否则,我们接受

    Q    T    Q'    T'    D
    
    q0   0    q1    X     right    // read the next (or first) symbol
    q0   1    q2    X     right    // of the first binary number, or
    q0   =    q7    =     right    // recognize no next is available
    
    q1   0    q1    0     right    // skip ahead to the = symbol while 
    q1   1    q1    1     right    // using state to remember which
    q1   =    q3    =     right    // symbol we need to look for
    q2   0    q2    0     right
    q2   1    q2    1     right
    q2   =    q4    =     right
    
    q3   X    q3    X     right    // skip any crossed-out symbols
    q3   0    q5    X     left     // in the second binary number
    q3   1,b  rej   1     left     // then, make sure the next
    q4   X    q4    X,b   right    // available digit exists and
    q4   0,b  rej   0,b   left     // matches the one remembered
    q4   1    q5    X     left     // otherwise, reject
    
    q5   X    q5    X     left     // find the = while ignoring
    q5   =    q6    =     left     // any crossed-out symbols
    
    q6   0    q6    0     left     // find the last crossed-out
    q6   1    q6    1     left     // symbol in the first binary
    q6   X    q0    X     right    // number, then move right
                                   // and start over
    
    q7   X    q7    X     right    // we ran out of symbols
    q7   b    acc   b     left     // in the first binary number,
    q7   0,1  rej   0,1   left     // make sure we already ran out
                                   // in the second as well
    
    这个TM可以首先通过确保两个二进制字符串都是非空的并且不包含前导零(去掉它找到的任何前导零)来清理输入

    若要执行“大于”,您可以轻松执行以下操作:

  • 检查第一个二进制数的长度(删除前导零后)是否大于、等于或小于第二个二进制数的长度(删除前导零后)。如果第一个二进制数长于第二个二进制数,则接受。如果第一个二进制数短于第二个二进制数,则拒绝。否则,继续执行步骤2

  • 与另一个问题一样检查是否相等,但如果在任何时候第一个数字中有1,第二个数字中有0,则接受。这是有效的,因为我们知道没有前导零,数字的位数相同,并且我们正在按重要性降序检查数字。如果发现其他不匹配或确定数字相等

  • 要添加数字,问题是递增和递减,但我觉得仅使用进位进行添加并不难。该过程的概要如下:

  • 以进位=0开始
  • 转到第一个数字的最低有效位。转到状态(dig=X,进位=0)
  • 转到第二个数字的最低有效位。转到状态(总和=(X+Y+进位)%2,进位=(X+Y+进位)/2)
  • 在第二个数字后面写下和数
  • 加油
    #1011+101#
    #101X+101#
    #101X+10X#
    #101X+10X=#
    #101X+10X=0#
    #10XX+10X=0#
    #10XX+1XX=0#
    #10XX+1XX=00#
    #1XXX+1XX=00#
    #1XXX+XXX=00#
    #1XXX+XXX=000#
    #XXXX+XXX=000#
    #XXXX+XXX=0000#
    #XXXX+XXX=00001#
    #XXXX+XXX=0000#
    #1XXX+XXX=0000#
    #1XXX+XXX=000#
    #10XX+XXX=000#
    #10XX+XXX=00#
    #100X+XXX=00#
    #100X+XXX=0#
    #1000+XXX=0#
    #1000+XXX=#
    #10000XXX=#
    #10000XXX#
    #10000XX#
    #10000X#
    #10000#