我正在尝试设计一个图灵机,它将形成的单词作为输入 通过字母表符号 Σ = {a, b} 并以二进制计数符号 a 和 符号 b 的出现次数磁带的最终内容必须与磁带的数量相对应 符号 b 的出现次数(二进制)、符号 $ 的出现次数(二进制) 符号 a,然后是输入字符串。最终的磁带应该是(二进制a的数量)(第一个符号“$”)(b的数量)(as和bs的原始字符串)
我试图构建它,但我不知道如何以二进制形式给出输出在此处输入图像描述
更新:我已经成功构建了一个可以计算 a 和 b 的系统,但是通过输入 1,有人可以帮我让它以二进制而不是单位来计数吗?
从一元表示生成二进制的一种好方法是在一元表示中标记两位中的一位,并在多标记一位时记录 1。否则记录 0。然后重复,直到所有一元表示都已被标记。
如果我们从右到左执行此操作,记录磁带写入部分左侧的位,并向左增长,我们就得到一元编码值的二进制表示形式。
由于我们必须对 𝑎 和 𝑏 都执行此操作,因此我们可以在 𝑏 被编码为二进制后交换 𝑎 和 𝑏,以便在第二阶段我们可以再次应用完全相同的过程。事实上,您可以首先交换𝑎和𝑏,然后在第二阶段之前再次交换。这样它们又恢复原来的顺序了。
我们也可以先将所有一元𝑎设置为A,标记后又返回𝑎。
这是该过程的转换表。某些特定状态用于在根本没有 𝑎 时写入 0,并写入
$
分隔符:
状态 | 阅读 | 写 | 摇头 | 下一个状态 |
---|---|---|---|---|
开始 | a | b | 对 | 开始 |
开始 | b | A | 对 | 开始 |
开始 | _ | 左 | 扫描 | |
开始 | 0 或 1 | 对 | 开始 | |
对 | a、b、A、0、1 或 $ | 对 | 对 | |
对 | _ | 左 | 扫描 | |
扫描 | A | a | 左 | 奇怪 |
扫描 | a 或 b | 左 | 扫描 | |
扫描 | _ | 0 | 左 | 美元 |
扫描 | 0 或 1 | 左 | 结束 | |
奇怪 | A | 左 | 均匀 | |
奇怪 | a、b、0、1 或 $ | 左 | 奇怪 | |
奇怪 | _ | 1 | 对 | 对 |
均匀 | A | a | 左 | 奇怪 |
均匀 | a、b、0、1 或 $ | 左 | 均匀 | |
均匀 | _ | 0 | 对 | 对 |
结束 | 0 或 1 | 左 | 结束 | |
结束 | _ | $ | 对 | 开始 |
结束 | $ | 左 | 检查 | |
美元 | _ | $ | 对 | 开始 |
检查 | 0 或 1 | 对 | 接受 | |
检查 | _ | 0 | 对 | 接受 |
这是一个可运行的片段,可以使用您自己的输入来测试该图灵机:
createTuring({
transitions: [
{ state: "start", read: "a", write: "b", move: "R", nextState: "start" },
{ state: "start", read: "b", write: "A", move: "R", nextState: "start" },
{ state: "start", read: "_", move: "L", nextState: "scan" },
{ state: "start", read: "01", move: "R", nextState: "start" },
{ state: "right", read: "abA01$", move: "R", nextState: "right" },
{ state: "right", read: "_", move: "L", nextState: "scan" },
{ state: "scan", read: "A", write: "a", move: "L", nextState: "odd" },
{ state: "scan", read: "ab", move: "L", nextState: "scan" },
{ state: "scan", read: "_", write: "0", move: "L", nextState: "dollar" },
{ state: "scan", read: "01", move: "L", nextState: "end" },
{ state: "odd", read: "A", move: "L", nextState: "even" },
{ state: "odd", read: "ab01$", move: "L", nextState: "odd" },
{ state: "odd", read: "_", write: "1", move: "R", nextState: "right" },
{ state: "even", read: "A", write: "a", move: "L", nextState: "odd" },
{ state: "even", read: "ab01$", move: "L", nextState: "even" },
{ state: "even", read: "_", write: "0", move: "R", nextState: "right" },
{ state: "end", read: "01", move: "L", nextState: "end" },
{ state: "end", read: "_", write: "$", move: "R", nextState: "start" },
{ state: "end", read: "$", move: "L", nextState: "check" },
{ state: "dollar", read: "_", write: "$", move: "R", nextState: "start" },
{ state: "check", read: "01", move: "R", nextState: "accept" },
{ state: "check", read: "_", write: "0", move: "R", nextState: "accept" },
],
initState: "start",
tape: "aababbbabaaba"
});
<script src="https://trincot.github.io/turing.js"></script>