为什么FRACTRAN完成巡回演出?


10

我试图用Google进行解释,但是大多数链接只说“ FRACTRAN正在完成。例如,让我们看一下乘法”。

我记得在xkcd论坛上看到一个帖子说FRACTRAN帮助发布者了解了图灵完整性。我正在寻找一个直观的解释,说明为什么这个esolang是图灵完整的,因为从语言机制上看不是很明显。


对于不熟悉FRACTRAN的用户:en.wikipedia.org/wiki/FRACTRAN
FrustratedWithFormsDesigner

2
乘法是确保完整性的一个很好的例子,原因是乘法需要循环和存储。尽管还不能完全确定某件事是否已经完成。最好的“证明”是在其中写一个
头脑傻瓜

Answers:


12

为了使图灵命令式语言完整,它必须具有:

  1. 条件循环
  2. 任意数量的变量

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中的幂是变量)。这给了396396被33整除(减少3的幂和11),再乘以455(递增5、7和13变量)。等等。可以在FRACTRAN Wikipedia页面上阅读该程序及其状态表的完整说明,其中包括上述程序的精美动画gif。

可在以下地址找到Stack Exchange上涉及图灵完整性的其他FRACTRAN材料:将Fractran转换为Brainfuck(好吧,这确实是对时间的有效利用)

Fractran具有图灵完备性的原因是因为它模拟了套准机。数字的素数分解存储了寄存器的内容,而除法和乘法是有条件地从寄存器中进行加减的一种方法。

这里的技巧(这开始误入理论)的部分原因是在幕后,这是明斯基寄存器机为它证明了某些磁带(程序)的图灵机如果磁带被表示为一个哥德尔数是确切的FRACTRAN编号是什么(来自链接的维基百科页面):

哥德尔使用了基于素因数分解的系统。他首先用他要处理的算术形式语言为每个基本符号分配一个唯一的自然数。

因此,我们有了条件循环,将任意变量存储为Gödel数,我们有了图灵机。

在Cant Decide中可以阅读到一些类似Collat​​z的有趣读物,例如FRACTRAN的性质。不确定!将Collat​​z猜想与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程序,请执行以下操作:

  1. 清除长度为1的循环的P
  2. 用新的素数替换希腊字母(功能)
  3. 替换过渡:
   高手
p:-→q,-→r,--> s,...
   bdf

变成:

aq cres
-,-,-,...
bp dp fp

使用素数p,q,r和s来完成此操作,以存储程序的状态。

然后我们有了寄存器机...它有有限数量的寄存器,可以存储任意大数和两个指令:

  • inc(x i,m)-递增寄存器i并转到第m行
  • jzdec(x i,m 1,m 2)-如果寄存器i为0,则转到第m行,否则递减i,然后转到m2行。

该套准机已显示为图灵完成。

然后,它通过几个幻灯片显示了该过程,这些幻灯片将套准机程序编译为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程序。


2
我以为Brainf * ck很奇怪。
罗伯特·哈维

请注意,矢量加法系统是相关的,因为任何Fractran程序都可以编写为VAS。还有陪替氏网。
Dan D.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.