【问题标题】:Halting in non-Turing-complete languages在非图灵完备语言中停止
【发布时间】:2010-10-03 06:51:33
【问题描述】:

对于图灵完备的语言无法解决停止问题,而对于某些非 TC 语言(如它总是停止的正则表达式)可以轻松解决。

我想知道是否有任何语言同时具有停止和不停止的能力,但承认可以确定是否停止的算法。

【问题讨论】:

  • 你应该编辑标题说“图灵完备”;我虽然起初这是一个疯狂的问题(例如“非图灵”=“不受我们对图灵机之类的愚蠢定义的限制。”)

标签: theory turing-complete halting-problem


【解决方案1】:

halting problem 不适用于语言。相反,它作用于机器 (即程序):它询问给定程序是否在给定输入时停止。

也许您的意思是问是否可以解决其他模型 计算(就像你提到的正则表达式,但也喜欢 push-down automata)。

通常可以在资源有限的模型中检测到停止(例如 正则表达式或等价的有限自动机,它有一个固定的 状态数,没有外部存储)。这很容易通过 枚举所有可能的配置并检查机器是否进入 两次相同的配置(表示无限循环);有限的 资源,我们可以为我们必须看到之前的时间量设置一个上限 如果机器没有停止,则重复配置。

通常,具有无限资源的模型(例如,无限的 TM 和 PDA), 不能停止检查,但最好调查模型和 他们各自的未解决问题。

(抱歉所有维基百科链接,但它实际上是一个非常好的资源 这种问题。)

【讨论】:

  • 难道所有机器都不能表示为它们接受的一组输入,即一种语言吗?
  • @FryGuy:但您不能将此信息提供给程序,因为该表示是无限的。
  • @A.Rex 但您可以将停止问题表示为一种语言,该语言是所有停止的程序。
【解决方案2】:

是的。此类重要的一类是primitive recursive functions。此类包括您希望能够对数字进行的所有基本操作(加法、乘法等),以及@adrian 提到的一些复杂类(正则表达式/有限自动机、上下文无关语法/下推自动机)。但是,确实存在非原始递归的函数,例如 Ackermann function

实际上很容易理解原始递归函数。它们是您可以在没有真正递归的编程语言中获得的函数(因此函数 f 不能调用自身,无论是直接调用还是通过调用另一个函数 g 然后调用 f 等)并且没有 while 循环,而是有界的for循环。有界 for 循环类似于“for i from 1 to r”,其中 r 是程序前面已经计算过的变量;另外,我不能在 for 循环中修改。这种编程语言的重点是每个程序都会停止。

我们编写的大多数程序实际上都是原始递归的(我的意思是,可以翻译成这样的语言)。

【讨论】:

  • 等等,那种总是停​​止(正如OP所说)的正则表达式也是如此,或者可能不会停止的那种正则表达式,但如果它总是可以说有没有?因为这个问题问:stackoverflow.com/questions/1241215/…
  • 我不知道我是否会说正则表达式实际上定义了一个计算模型。在任何情况下,总是可以在有限时间内判断给定字符串是否与给定正则表达式匹配。
【解决方案3】:

简短的回答是肯定的,这样的语言甚至非常有用。

几个月前在 LtU 上有一个讨论: http://lambda-the-ultimate.org/node/2846

【讨论】:

    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 2011-04-05
    • 2011-11-11
    • 2011-02-05
    • 2021-05-06
    • 2014-12-26
    • 2015-08-23
    • 2011-05-22
    相关资源
    最近更新 更多