[英]Turing machine for addition and comparison of binary numbers
今天是个好日子!
我正在尝试解决此练习以进行学习。 有人可以指导我解决这三个问题吗?
就像我尝试了第一个问题,以“+”分隔的 2 个二进制数相加。 在那里我通过用相应数量的 1 或零表示每个数字来尝试 2 个数字加法,例如 5 = 1 1 1 1 1 或 0 0 0 0 0 然后将它们相加,结果也将与所表示的格式相同,但如何添加或表示 2 个二进制文件并用 + 分隔它们,没有得到任何线索。 图灵机的头部会从左边移动到加号然后左右移动+号吗? 但是将如何执行添加。 就我的一点知识而言,TM 不能简单地添加二进制文件,我们必须制定一些逻辑来表示它的二进制文件,就像简单地将 2 个数字相加一样。 比较2个二进制文件的情况类似吗? 问候
我将从问题 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,则接受。 这是有效的,因为我们知道没有前导零,数字具有相同的位数,并且我们正在按重要性的降序检查数字。 如果您发现其他不匹配或您确定数字相等,则拒绝。
要添加数字,问题说要递增和递减,但我觉得只添加进位不会太难。 该程序的概要是这样的:
磁带可能经历的不同步骤的示例:
#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#
有两种方法可以解决加法问题。 假设您的输入磁带采用^a+b$
形式,其中^
和$
是告诉您已经到达输入的正面和背面的符号。
b
并减少a
1
直到a
为 0,此时b
将是您的答案。 这是假设您可以轻松编写可以递增和递减的 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
。=
。1
。 这与我们之前阅读的位相匹配。 写一个Y
。^
。1
在a
与阅读0
中b
。 我们会停下来拒绝。希望这有助于您入门。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.