我正在从事以下项目:
设计一个执行二进制数递增操作的图灵机。假设您有一个二进制数 𝑛。最初,磁带上有符号
,后跟二进制数 𝑛。图灵机的头部开始定位在$
符号上,同时图灵机处于状态𝑞0。当磁带包含$
符号后跟二进制值 𝑛+1,并且图灵机处于状态 𝑞𝑓 时,图灵机必须停止。磁带上的$
符号代表磁带上的空单元。Δ
L 为左,R 为右,N 表示头部不动:
从𝑞0到𝑞1:
$
,则保持为 $
并将头部向右移动 (R)。在𝑞1(处理位):
如果显示为
0
,则保持为 0
并向右移动 (R)。
如果显示为
1
,则保持为 1
并向右移动 (R)。
如果读数为
Δ
,则移动到状态𝑞2并向左移动(L)。
在𝑞2(增量)中:
如果显示为
0
,则会将其更改为 1
(无进位)并转到 𝑞𝑓(结束)。
如果显示为
1
,则会将其更改为 0
(进位)并继续在 𝑞2 中向左移动 (L)。
如果显示为
$
,则会转到 𝑞3 并向左移动 (L)。
在𝑞3(额外携带的处理):
如果显示为
Δ
,则会将其更改为 1
(开始时进位)并转到 𝑞𝑓(结束)。
如果显示为
0
,则保持为 0
并向左移动 (L)。
如果显示为
1
,则保持为 1
并向左移动 (L)。
如果显示为
$
,则保持为 $
并继续在 𝑞3 向左移动 (L)。
在𝑞4(空,特殊情况):
Δ
,则会将其更改为 1
并转到 𝑞𝑓(结束)。最终状态𝑞𝑓:
我被告知这个模型是错误的。最初我没有状态𝑞4,但我添加它是为了考虑进位的特殊情况。我用几个输入对此进行了测试,但无法发现问题所在。我的错误在哪里?
当输入数字仅包含
1
数字时,例如当磁带有 $11
时,就会出现问题。在这种情况下,您的算法将正确地将所有这些数字更改为 0
并识别出存在进位,但会将进位写入错误的位置。对于 $11
示例,它将在磁带上以 1$00
结束该过程,而它应该是 $100
。
不是问题,但是:
当处于状态𝑞3时,您预见它可以读取符号
0
、1
或$
,但这些实际上都不会发生,因为您只能通过移动到达状态𝑞3 $
符号的左边,除了空白之外没有其他东西$
的一侧。
状态𝑞4无法到达(没有传入转换,也不是起始状态),因此它没有任何作用。
这是在转换表中编码的模型,该模型在 JavaScript 片段中提供给可运行的图灵机。您可以在这里运行它,看看输入如何出错
$11
。
createTuring({
transitions: [
{ state: "q0", read: "$", move: "R", nextState: "q1" },
{ state: "q1", read: "01", move: "R", nextState: "q1" },
{ state: "q1", read: "Δ", move: "L", nextState: "q2" },
{ state: "q2", read: "1", write: "0", move: "L", nextState: "q2" },
{ state: "q2", read: "0", write: "1", nextState: "qf" },
{ state: "q2", read: "$", move: "L", nextState: "q3" },
{ state: "q3", read: "$01", move: "L", nextState: "q3" },
{ state: "q3", read: "Δ", write: "1", nextState: "qf" },
{ state: "q4", read: "Δ", write: "1", nextState: "qf" },
],
initState: "q0",
blank: "Δ",
tape: "$11" // Example input
});
<script src="https://trincot.github.io/turing.js"></script>
要解决此问题,请在找到
$
符号的位置(不是其左侧)写入额外的进位,然后使用状态 𝑞3 在该位置的左侧写入新的 $
.
那么我们就得到了这个转换表:
createTuring({
transitions: [
{ state: "q0", read: "$", move: "R", nextState: "q1" },
{ state: "q1", read: "01", move: "R", nextState: "q1" },
{ state: "q1", read: "Δ", move: "L", nextState: "q2" },
{ state: "q2", read: "1", write: "0", move: "L", nextState: "q2" },
{ state: "q2", read: "0", write: "1", nextState: "qf" },
{ state: "q2", read: "$", write: "1", move: "L", nextState: "q3" },
{ state: "q3", read: "Δ", write: "$", nextState: "qf" },
],
initState: "q0",
blank: "Δ",
tape: "$11" // Example input
});
<script src="https://trincot.github.io/turing.js"></script>
您可以通过此实现尝试不同的输入,并确保它现在适用于所有有效输入。