【问题标题】:My copy loop does not end. Turing Machine我的复制循环没有结束。图灵机
【发布时间】:2015-03-22 23:27:07
【问题描述】:

我正在尝试编写一组复制一组刻度的规则,无论原始集旁边的空格有多长,我都有一个这样做的循环,但是它不会停止并继续前进并破坏复制的项目.

http://i.imgur.com/8cpaYkN.png

在图片的截断下应该是 5 0 -> 1 Tick

这是基于在以下位置找到的模型:http://en.wikipedia.org/wiki/Turing_machine_examples#A_copy_subroutine

有什么见解吗?

编辑:当它到达两个数字系列之间的中间零时它应该停止,但我的继续。

编辑:

所以我的程序检查一个 1,如果它找到它,它会将它变成零并跳过后面的一个直到它到达一个零,它会跳过零和下面的一个(一开始都没有)并将第一个 0 更改为 1,然后通过跳过一和零返回,然后跳过一直到找到第一个零(已更改的零)将其更改为一,然后程序循环。它应该在到达分隔两个数字的中心零时停止。

是这样的。

State 1, 0 -> state 1, 0
State 1, 1 -> state 2, 1 [changes the first 1 to a 0]
state 2, 1 -> state 2, 1
state 2, 0 -> state 3, 0
state 3, 1 -> state 3, 1
state 3, 0 -> state 4, 1 (right) (goes back) [changes the first 0 to a 1]
state 4, 1 -> state 4, 1 (right)
state 4, 0 -> state 5, 0 (right)
state 5, 1 -> state 5, 1 (right)
state 5, 0 -> state 1, 1 (left) (loops) [changes the first changed 1 back]

如果我对任何序列执行此操作,它会复制它们,但是,它不会停止循环,它会在完成后继续并中断复制。

所以如果我输入:

0 0 1 1 1 0 0 0 0 0 0.....

规则将执行以下操作:

0 0 1 1 1 0 0 0 0 0 0.....
0 0 0 1 1 0 1 0 0 0 0.....
0 0 1 0 1 0 1 1 0 0 0.....
0 0 1 1 0 0 1 1 1 0 0.....
0 0 1 1 1 0 1 1 1 0 0.....

(它现在应该停止但它继续运行,测试新复制的输入。)

【问题讨论】:

  • 外部站点上的 .png 不是共享程序的好格式。您能否在问题中总结或以其他方式包含该程序,使其独立?
  • 我这样做是为了让人们能够更好地理解它,但请稍等,我将编辑帖子
  • 您需要包括头部移动的方向。
  • 您对您机器的描述(“就是这样”)不清楚;它缺少一些左/右指示器,并且您忽略了状态 0 中的 HALT 操作。
  • 如果它不向右就向左,对不起,忘了把它放进去

标签: turing-machines


【解决方案1】:

这一行是错误的:

State 1, 1 -> state 2, 1 [changes the first 1 to a 0]

应该是

State 1, 1 -> state 2, 0 [changes the first 1 to a 0]

但我有点困惑,因为我认为这个错误的影响是不断增加磁带左边的 1 的数量。

这个过程应该是这样的:

从输入的第一个 1 开始:

  • 如果当前符号为 0,则停止。
  • 用零替换它。
  • 扫描中间的零。
  • 扫描现有的 1。
  • 写一个 1
  • 向后扫描第二个 0。
  • 将其替换为 1。
  • 向右走一次。
  • 重复

这是 Python 中的一个有效实现。我想我的左/右与你相反(我认为左/右是描述写头的运动而不是磁带的运动)。否则,您的程序的唯一更改是我在此答案开头提到的错误。

def machine(tape, program, start, pc):
    head = start
    while True:
        if head < 0:
            raise AssertionError('off tape')
        if head >= len(tape):
            tape.append(0)
        cmd = program[pc, tape[head]]
        if cmd == 'halt': return
        newpc, write, move = cmd
        tape[head], head, pc = write, head + move, newpc
        print pc, head, tape

L, R = -1, 1
tape = [1, 1, 1, 0]
program = {
    (1, 0): 'halt',
    (1, 1): (2, 0, R),
    (2, 1): (2, 1, R),
    (2, 0): (3, 0, R),
    (3, 1): (3, 1, R),
    (3, 0): (4, 1, L),
    (4, 1): (4, 1, L),
    (4, 0): (5, 0, L),
    (5, 1): (5, 1, L),
    (5, 0): (1, 1, R)
}

machine(tape, program, 0, 1)

【讨论】:

  • 对不起,那是我输入指令的错误,程序中的行没有错。我会试试你的程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多