如果TM识别出该语言并进入接受或拒绝状态,则可以确定语言。作为开发者。我认为这很重要,因为这意味着我们可以确定程序是否包含缓冲区溢出或死锁。此外,以下问题是不确定的:
程序是否曾经访问过未初始化的变量。
是否使用两个上下文无关的语法来描述相同的语言。
如果子例程的参数是通过引用或通过复制结果传递的,这是否有所不同?
关于可确定性,您要说的是可确定性的关键点,以及为什么可确定性很重要(尤其是对于开发人员)。
注意:项目符号要点很好-我可以自己查找主题。我只想知道重点。
最佳答案
也许这属于cstheory exchange,但无论如何我还是会去做的。
关键点是:有些问题是无法确定的,即无法通过算法解决,因此应通过其他方法解决。这些问题中有许多涉及计算机语言的“元问题”,例如detecting a virus问题。
确定问题无法确定后,可以采取几种措施:
有些问题可能是半确定的,即存在一个解决某些情况的半算法,但在其他情况下会永远循环。实施半算法时,在其上放置一个计时器,并在时间用完时返回no answer
。
通过简化来解决问题的几个希望的关键部分。
2 +当问题变得过于复杂时,请用户输入。
多数情况下,使用启发式方法获得正确答案。
使用其他语言,也许是非图灵完整语言。
1到3在自动推理工具(包括程序验证器)中很流行。 4是病毒扫描程序的作用。 5是允许用户编写脚本以使大型系统自动化的good choice;与其给他们完整的JavaScript / Scheme / Lua /其他内容,不如给他们一个受限制的子集,该子集不允许无限的递归/循环。
关于computer-science - 关键点和可决定性的重要性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3952968/