实用的非图灵完整语言?

时间:2008-11-24 20:27:36

标签: regex finite-automata turing-complete halting-problem

几乎所有使用的编程语言都是Turing Complete,虽然这提供了代表任何computable算法的语言,但它还附带了自己的problems集。看到我写的所有算法都打算停止,我希望能够用一种语言来表示它们将会停止。

用于匹配字符串的{p> Regular expressions finite state machines时会使用lexing,但我想知道是否有更普遍,更广泛的语言不是图灵完成的?

编辑我应该澄清一点,“通用目的”我不一定希望能够用语言编写所有暂停算法(我不认为这样的语言会存在)但我怀疑在停止证据时有共同的线索,可以推广出一种语言,保证所有算法都停止。

还有另一种解决这个问题的方法 - 消除理论上无限记忆的需要。一旦限制了允许机器的内存量,机器所处的状态数是有限且可数的,因此您可以确定算法是否会停止(通过不允许机器进入之前的状态) )。

8 个答案:

答案 0 :(得分:50)

不要听取反对者的意见。如果您想要保证终止或简化代码,例如通过消除运行时错误的可能性,那么在某些情况下,人们可能更喜欢非图灵完整语言是有充分理由的。有时,忽略事情可能还不够。

论文Total Functional Programming或多或少有说服力地说,事实上我们几乎总是喜欢这种受限制的语言,因为编译器的保证是如此强大。能够证明程序停止本身就很重要,但实际上这是更简单的语言提供的更容易推理的产物。作为不同能力语言层次结构中的一个组成部分,非通用语言的效用范围非常广泛。

另一个更全面地解决这种分层概念的系统是HumeHume Report给出了系统的完整描述及其五层渐进式更完整,安全性越来越低的语言。

最后,不要忘记Charity。它有点抽象,但它也是一种非常有趣的方法,可用于有用但不通用的编程语言,它直接基于类别理论的概念。

答案 1 :(得分:31)

BlooP B ounded 循环的缩写)是一种有趣的非图灵完备语言。它本质上是一种图灵完备语言,有一个(主要)警告:每个循环必须包含迭代次数的界限。不允许无限循环。因此,可以为BlooP程序解决暂停问题。

答案 2 :(得分:14)

问题不在于图灵机,而在于“算法”。您无法预测算法是否会停止的原因是:

function confusion()
{
    if( halts( confusion ) )
    {
        while True:
            no-op
    }
    else
        return;
}

任何不能进行递归或循环的语言都不是“通用”。

正则表达式和有限状态机是一回事!词汇和字符串匹配是一回事! FSM停止的原因是因为它们永远不会循环;他们只是传递char-by-char输入并退出。

编辑:

对于许多算法,很明显它们是否会停止。

例如:

function nonhalting()
{
    while 1:
        no-op
}

这个功能显然永远不会停止。

而且,这个功能显然会停止:

function simple_halting_function()
{
    return 1;
}

所以最重要的是:你可以保证你的算法停止,只需设计它就可以了。

如果你不确定算法是否会一直停止;那么你可能无法用任何保证“停止”的语言来实现它。

答案 3 :(得分:9)

Charity不是图灵完整的,它不仅在理论上,教学上有趣(类别理论),而且,它可以解决实际问题(河内塔)。它的力量非常强大,甚至可以表达Ackermann function

答案 4 :(得分:8)

事实证明,完成图片相当容易。例如,您只需要8个指令ala BrainF**k,而且只需要one instruction

这些语言的核心是一个循环结构,只要你有无界循环,就会有一个固有的停顿问题。循环何时终止?即使是支持无限循环的非图灵完整语言,might仍然存在暂停问题{/ 3}}。

如果您希望所有程序都终止,那么您只需要仔细编写代码即可。一种特定的语言可能更符合您的喜好和风格,但我认为任何语言都不能完全保证最终的程序会停止。

答案 5 :(得分:2)

“消除理论上无限记忆的需要。” - 好吧,是的任何物理计算机都受到宇宙熵的限制,甚至在此之前,受到光速的影响(= =信息可以传播的最大速率)。

更容易,在物理可实现的计算机中,只需监视资源消耗并对其进行一些限制。 (即,当记忆或时间消耗> MY_LIMIT时,杀死进程)。

如果您要求的是纯粹的数学/理论解决方案,您如何定义“通用目的”?

答案 6 :(得分:2)

这样做的正确方法,恕我直言,是有一种图灵完整的语言,但提供一个系统,用于说明适合由证明检查员处理的语义。

然后,假设你是故意编写一个终止程序,你在脑海里想到了一个很好的论据,为什么它会停止,并且用这种新的语言你应该能够表达这个论点,并证明它已被证实。 / p>

作为我的生产编译器的一部分,我有递归,我知道,肯定,不会停止某些输入..我使用一个令人讨厌的黑客来阻止这个:一个具有“明智”限制的计数器。仅供参考,实际代码涉及单态多态代码,并且在使用多态递归时会发生无限扩展。 Haskell捕获了这个,我的Felix编译器没有(这是编译器中的一个错误,我碰巧不知道如何修复)。

根据我的一般论点......我肯定想知道哪种注释对于所述目的有好处:我碰巧控制了一种语言和编译器,所以如果我知道的话,我可以很容易地添加这样的支持究竟要添加什么:)为了这个目的,我已经看到为循环添加了一个“不变”和“变体”子句,虽然我不认为该语言扩展到使用该信息作为终止证明(而是检查了不变量)如果我没记错的话,在运行时变异。

也许这值得另一个问题......

答案 7 :(得分:-3)

任何非图灵完备语言作为通用语言都不会非常有用。你可能能够找到一些自称为通用语言的东西,而不是Turing-complete,但我从来没有见过。