Binary 二进制数加法和比较的图灵机
大家好 为了学习,我正在尝试解决这个问题。有人能指导我解决这三个问题吗 就像我试过的第一个问题,两个以“+”分隔的二进制数相加。其中,我尝试了两个数字相加,用各自的数字1或0表示每个数字,例如5=1或0 0 0 0,然后将它们相加,结果也将与所表示的格式相同,但如何添加或表示2个二进制文件并用+分隔,没有任何线索。图灵机的机头会从左移到加号,然后从加号左右移动吗?但是如何进行添加。就我所知,TM不能简单地添加二进制文件,我们必须制作一些逻辑来表示它的二进制文件,就像简单地添加2个数字一样。比较两个二进制文件的情况也类似吗?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个数字一样。比较两
关于有两种方法可以解决加法问题。假设您的输入磁带的格式为
^a+b$
,其中^
和$
是表示您已到达输入的前面和后面的符号
1
每一步递增b
并递减a
,直到a
为0,此时b
将是您的答案。这是假设您可以轻松地编写一个可以递增和递减的TMa
和b
中的最低有效位。这个问题指定最高有效位是第一位,因此对于a
您需要从+
开始,对于b
您需要从$
开始
例如,假设我们想要增加1011$
。我们将使用的算法是找到最不重要的未标记数字。如果是0
,请将其替换为1
。如果是1
,请向左移动
1
。将读取头向左移动1
。将读取头向左移动0
。写入1
1111$
X
,1
可以标记为Y
X
的意思是“这里有一个0,但我已经看到了
因此,对于相等性,我们可以从^
开始a
和=
开始b
(假设输入看起来像^a=b$
)算法是找到a
和b
的开头,比较它们的第一个未标记位。第一次得到不同的值时,停止并拒绝。如果得到=
和$
,则停止并拒绝
让我们看一下输入^11=10$
:
1
。写入Y
。磁带读取^Y1=10$
。我们处于表示已读取1
的状态=
1
。这与我们之前读取的位匹配。写入aY
^
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可以首先通过确保两个二进制字符串都是非空的并且不包含前导零(去掉它找到的任何前导零)来清理输入
若要执行“大于”,您可以轻松执行以下操作:
#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#