可提出性的要点和重要性

时间:2010-10-17 11:18:26

标签: computer-science computation-theory decidable

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

  • 程序是否访问未初始化的变量。
  • 两个无上下文的语法描述相同的语言。
  • 如果通过引用或copy-result
  • 传递子例程的参数,会有所不同吗?

就可判定性而言,您认为Decidability的关键点是什么?为什么Decidability很重要(特别是对开发人员而言)。

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

2 个答案:

答案 0 :(得分:3)

也许这属于cstheory exchange,但无论如何我都会参与其中。

关键点是:有些问题是不可判定的,即算法无法解决,因此应该通过其他方法解决。这些问题包括许多涉及计算机语言的“元问题”,例如detecting a virus的问题。

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

  1. 有些问题可能是半可判定的,即有一个算法可以解决某些情况,但在其他情况下会永远循环。实现半算法时,在其上放置一个计时器,并在时间用完时返回no answer
  2. 通过简化问题,解决问题中的一小部分,希望是关键部分。
  3. 2 +当问题变得过于复杂时,请求用户输入。
  4. 使用启发式获取正确答案 的时间。
  5. 使用其他语言,也许是非图灵完整语言。
  6. 1到3是自动推理工具的流行,包括程序验证程序。 4是病毒扫描程序的功能。当允许用户编写脚本以自动化更大的系统时,5是good choice;而不是给它们完整的JavaScript / Scheme / Lua / what,给它们一个不允许无限递归/循环的受限子集。

答案 1 :(得分:0)

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

这种情况是不可判定的,但更具限制性的条件可能是可判定的,例如:“不使用函数指针,任何函数都不应直接或间接包含对自身的调用”。

这是为了强调有时可以交换灵活性以确定可用性,以便系统的某些必需属性可以变得可执行。

如果编程语言是可判定的,则始终可以确定某个程序是否是该语言的有效程序。

但即使程序是该语言的有效程序,该程序是否可能导致缓冲区溢出或死锁仍然是不可判定的。