实现if语句

时间:2015-05-06 15:24:17

标签: turing-complete

我创建了自己的编程语言,编译为图灵机指令,我想知道如何实现if(a>b) do _ end。这是语言的定义(也可用here

变量是以任何宽度动态分配的,因此可以有任意大的整数

每一行都可以做三件事之一,它可以调用一个函数(修改它的参数),启动一个while循环(实际上更多是for循环),或者指定一个变量。

可用函数是incr(递增1,可以溢出),decr(递减1,可以溢出),pop(从变量中删除最后一位数字), first(将变量中最重要的0更改为1)和frost(将最重要的1更改为零)。

while循环具有以下语法

while a <func> {
    _
}

基本上每次循环时它都会<func>a直到错误状态。错误条件如下,incrfirst全部为1,decrfrost全部为0,pop删除最后一位数。在使用incrfrost的while循环之后,循环变量的所有位都将为0,与firstdecr相反。虽然循环必须在函数调用上结束,并且它们会在每次运行后删除其中包含的所有变量。

根据语法,分配可以做一些不同的事情。 a=b表示将变量b复制到变量a所拥有的空间中,如果b长于a这会导致未定义的行为,除非a是最新变量创建。 a=b,5b分配给a,左边有五个填充位(设置为零),再次溢出导致未定义的行为,除非a是创建的最新变量。 a=a,0a归零。最后,a=5,3会将5 % 2**3分配给a 3位。

现在我可以用

实现if(a != 0) do _ end
while a decr {
    _
    t=0,1
    while a incr {
        incr(t)
    }
    incr(t)
}

我的问题是如何实现其他if语句,例如if(a==b)if(a!=b)if(a>b)

作为第二个问题,这个语言图灵完全,我相信基于这个答案Are there minimum criteria for a programming language being Turing complete?。我知道语言满足1到5,但我不确定6。

1 个答案:

答案 0 :(得分:0)

(如果我对循环或incr / decr行为有误,请告诉我,这会改变我的回答)

if(a!=0)的原始代码似乎永远循环。实际上,它正在执行while(a) do _ end,因为它无论是无限循环还是根本不循环。最后,t不会存在于循环之外,并且似乎不会在其中使用,即使它看起来像您尝试捕获的值(比较时的真/假)。

您没有评论语法,因此我会在需要时提出// comment / c式评论。

也许是这样的......

if(a&gt; 0)do _ end

// if (a > 0) do _ end
_a = a
while _a decr {
    // overflow iif _a= 0
    _ // do something
    _a = 0
    frost( _a ) // only function calls at end of loops
}

if(a == 0)do _ end

// if (a == 0) do _ end
_a = a
result = 1,1
while _a decr {
    // overflow iif _a= 0
    _a = 0
    frost( result ) // only function calls at end of loops
}
while result decr {
    // overflow iif result = 0
    _ // do something
    frost( result ) // exit loop
}

对于非零检查,模式非常简单,因为您已经注意到了 - 减少它,如果您没有溢出(技术上下溢),那么您将处理1或更大的事情。 Trick退出while,你可以通过使用decr测试并在退出时将被测变量设置为0来完成。为此,您的frost函数是合适的,因为对于目标变量0,它会使结果保持不变,目标1变为0,例如在result的使用中。

您的文档说函数必须标记循环的结尾,而不是赋值或其他循环,但您自己的示例与此不一致,只需注意。

我为剩余的测试条件做了一个示例:a > ba == b;其他人可以从这两个和逻辑反转/非运算符派生而来,你在上面使用result看到过。

if(a == b)do _ end

// if( a == b ) do _ end
a_cond = a
b_cond = b
// step 1: a_cond = a - b
while b_cond decr {
    decr(a_cond)
}
// step 2: if (a_cond == 0)
result = 1,1
while a_cond decr {
    // overflow iif a_cond = 0
    a_cond = 0
    frost( result ) // only function calls at end of loops
}
while result decr {
    // overflow iif result = 0
    _ // do something
    frost( result ) // exit loop
}

if(a&gt; b)do _ end

WIP。将类似于(a == b)案例