【问题标题】:Key points and Importance of Decidability可判定性的要点和重要性
【发布时间】:2010-10-17 11:18:25
【问题描述】:

如果 TM 识别语言并进入接受或拒绝状态,则语言是可判定的。作为开发者。我认为这很重要,因为这意味着我们可以确定程序是否包含缓冲区溢出或死锁。此外,以下问题是不可判定的:

  • 程序是否曾经访问过未初始化的变量。
  • 两个上下文无关语法是否描述相同的语言。
  • 如果子例程的参数是通过引用传递还是通过复制结果传递,是否会有所不同

就可判定性而言,您认为可判定性的关键点是什么以及为什么可判定性很重要(尤其是对开发人员而言)。

注意:答案中的要点很好 - 我可以自己查找主题。我只是想知道要点是什么。

【问题讨论】:

  • 您的第一点和第三点取决于语言。在一种根本不允许变量未初始化的语言中,当然可以完全确定程序是否访问未初始化的变量(答案始终是否定的)。即使它在某些情况下允许未初始化的变量,它仍然可能是可确定的(取决于这些情况是什么)。

标签: computer-science computation-theory decidable


【解决方案1】:

也许这属于cstheory exchange,但无论如何我都会尝试一下。

关键是:有些问题是不可判定的,即不能用算法解决,所以应该用其他方法解决。在这些问题中,有很多关于计算机语言的“元问题”,例如detecting a virus的问题。

确定问题无法确定后,有几种可能的行动方案:

  1. 有些问题可能是半可判定的,即有一个 semi 算法可以解决某些情况,但在其他情况下会永远循环。在实现半算法的时候,在上面放一个定时器,时间用完返回no answer
  2. 通过简化来解决问题的几个关键部分。
  3. 2 + 当问题变得过于复杂时要求用户输入。
  4. 使用大多数时间得到正确答案的启发式方法。
  5. 使用不同的语言,可能是非图灵完备的语言。

1 到 3 非常适用于自动推理工具,包括程序验证器。 4 是病毒扫描程序的作用。 5 是good choice,当允许用户编写脚本来自动化更大的系统时;与其给他们完整的 JavaScript/Scheme/Lua/whatever,不如给他们一个不允许无限递归/循环的受限子集。

【讨论】:

  • +1 很好的答案。因此,知道一个问题是不可判定的会导致你尝试不同的方法。但是您认为可判定性的重要性是什么?
【解决方案2】:

假设您必须编写一些满足条件的软件:“在运行时,任何函数都不应直接或间接地调用自己”。

该条件是不可判定的,但更严格的条件可能是可判定的,例如:“不得使用函数指针,且任何函数不得直接或间接包含对其自身的调用”。

这是为了强调有时可以用灵活性来换取可判定性,以便系统的某些必需属性可以强制执行。

如果一种编程语言是可判定的,那么总是可以判定一个程序是否是该语言的有效程序。

但即使一个程序对于该语言来说是一个有效的程序,该程序是否会导致缓冲区溢出或死锁仍然无法确定。

【讨论】:

    猜你喜欢
    • 2014-07-17
    • 2012-03-27
    • 2021-03-22
    • 2019-04-25
    • 1970-01-01
    • 2016-09-13
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多