Answers:
为了使图灵命令式语言完整,它必须具有:
FRACTRAN是一种由一系列分数组成的语言,该分数将其数据存储在素数的指数中。
假设您要添加两个数字:2 a 3 b变为5 ab
455 11 1 3 11 1 ---,-,-,-,-,- 33 13 11 7 2 3
那是完成上述更改的FRACTRAN程序。
您从一个数字开始,例如72(2 3 3 2)。程序进行“前进”,直到找到一个数字,该数字与指令相乘即为另一个整数(不允许有余数)。
72
将向前运行直到到达11/2
。然后,将数字除以2
并乘以11
(11中的幂是变量)。这给了396
。 396
被33整除(减少3的幂和11),再乘以455(递增5、7和13变量)。等等。可以在FRACTRAN Wikipedia页面上阅读该程序及其状态表的完整说明,其中包括上述程序的精美动画gif。
可在以下地址找到Stack Exchange上涉及图灵完整性的其他FRACTRAN材料:将Fractran转换为Brainfuck(好吧,这确实是对时间的有效利用)
Fractran具有图灵完备性的原因是因为它模拟了套准机。数字的素数分解存储了寄存器的内容,而除法和乘法是有条件地从寄存器中进行加减的一种方法。
这里的技巧(这开始误入理论)的部分原因是在幕后,这是明斯基寄存器机为它证明了某些磁带(程序)的图灵机如果磁带被表示为一个哥德尔数是确切的FRACTRAN编号是什么(来自链接的维基百科页面):
哥德尔使用了基于素因数分解的系统。他首先用他要处理的算术形式语言为每个基本符号分配一个唯一的自然数。
因此,我们有了条件循环,将任意变量存储为Gödel数,我们有了图灵机。
在Cant Decide中可以阅读到一些类似Collatz的有趣读物,例如FRACTRAN的性质。不确定!将Collatz猜想与FRACTRAN和停止问题相关联。
FRACTRAN有点难以理解。
考虑如下程序:
LABEL: start
block1
block2
block3
...
END
在这种情况下,每个块的形式为:
IF(registers X >= a, Y >= b) # or any combination of registers
THEN
X -= a
Y -= b
I += n
J += m
goto start
上面乘法程序的第一条语句:
455 --- 33
将以这种形式写成:
IF(register `3` >= 1 && `11` >= 1)
THEN
`3` -= 1
`11` -= 1
`5` += 1
`7` += 1
`13` += 1
goto start
因此,您可以清楚地看到图灵完整性所需的数据存储和循环结构。它非常简单,但是它作为一个简单的注册机存在并运行-但这就是您真正需要做的所有事情。
还是不服气?
这很大程度上借鉴了Dimitri Hendricks的关于计算模型的演讲
这采用了非常简单的程序(2/3)
,该程序是加法器(2 a 3 b- > 3 a + b),但它具有破坏性-在过程中清除2中的值。
让我们编写一个更高级别的FRACTRAN,使它很容易不被破坏。
原始程序可以认为是:
2 α:-→α 3
在F 2中,可以指定某种“功能”。
10 1 α:-→α,-→β 3 1 3 β:-→β 5
要将F 2程序(P)转换为标准FRACTRAN程序,请执行以下操作:
高手 p:-→q,-→r,--> s,... bdf
变成:
aq cres -,-,-,... bp dp fp
使用素数p,q,r和s来完成此操作,以存储程序的状态。
然后我们有了寄存器机...它有有限数量的寄存器,可以存储任意大数和两个指令:
该套准机已显示为图灵完成。
然后,它通过几个幻灯片显示了该过程,这些幻灯片将套准机程序编译为FRACTRAN程序,作为机械过程的一部分。
基本上:
( inc(x(i),m)= ----→m 1个 1 1 jzdec(x(i),m1,m2)= ----→m2,-→m1 p(i)1
因此,由于这两种计算模型之间的等效性,FRACTRAN已完成图灵处理。
顺便说一句,如果您真的想打定主意,请阅读Code Golf:Fractran,其中一些人编写了FRACTRAN程序来运行另一个FRACTRAN程序。