我有一位同事拒绝接受图灵机(以及扩展的冯·诺伊曼机)无法解决其自身的停机问题这一事实,他指出:
您可以花足够的时间和金钱来做任何事情。
他还不喜欢以下理论问题:
在我们的领域中,我们永远不会遇到这些问题。我们是应用程序开发人员,而不是理论科学家。
是否有一个很好的例子说明我无法用计算机来使他信服的商业问题?
我有一位同事拒绝接受图灵机(以及扩展的冯·诺伊曼机)无法解决其自身的停机问题这一事实,他指出:
您可以花足够的时间和金钱来做任何事情。
他还不喜欢以下理论问题:
在我们的领域中,我们永远不会遇到这些问题。我们是应用程序开发人员,而不是理论科学家。
是否有一个很好的例子说明我无法用计算机来使他信服的商业问题?
Answers:
从技术上来说并不是不可能,但是...
计划资源,目的是找到可以最大程度地利用时隙的理想计划。在我早期的计算时代,我曾经有一个项目具有此要求。在意识到它对NP困难之前,我花了一段时间研究它。
在此可以找到在技术上并非不可能但在技术上很难的其他问题示例。
业务计算中最困难的计算问题并非不可能,只是不切实际。你的朋友是对的。如果您向他们投入足够的资金,则可以解决其中的大多数问题。但是争论是似是而非的。经营一家企业的全部目的是赚钱,而不是赔钱。
在日常实践中,我们以模糊的方式谈论图灵完整性,不是为了说明某些数学原理,而是要举例说明HTML和CSS作为生成功能完整程序的完整工具的不足之处。
同样,停顿问题对理论家也很重要,但与大多数企业没有太大关系。
其他人对此发表了评论,但是我将尝试给出一个给出我观点的答案。
我喜欢罗伯特·哈维(Robert Harvey)的回答,以及对他的回答的评论,我想在此基础上进行扩展。
我认为您必须以平凡的方式提出这些无法确定的问题(例如终止):例如,一个IDE工具“检查此函数是否总是返回值”。
在教学时,我最喜欢的示例是重构(函数等效,另一个无法确定的问题)。我问:
在很好的重构之后,如何检查功能/程序是否相同?当然,我们对此有单元测试,但它们并不涵盖所有情况。他们很无聊,但是……我们是程序员!我们应该编写一个程序来检查这两个函数是否始终产生相同的结果!你为什么不尝试写呢?
或者,作为一种变化可能更接近您的情况:
我们用一个古老的晦涩的COBOL方言编写了这些遗留代码,没有任何规范和/或编译器。我们只有程序。我们的整个业务都依赖它,因此我们必须100%确保新的Java代码在每种情况下都完全相同。管理层希望有一个程序可以做到这一点,检查所有可能的情况,并估计可以在6到8周内完成。你为什么不尝试写呢?
关键是不要编写这样的程序。还是对需求的足够好的近似。关键是要意识到它不能直接完成,不要浪费我们无数的尝试去弄清楚该怎么做(只是意识到这是不可能的),而是要认识到它。“啊!这是无法确定的!不可能直接做到。我需要找出另一种更聪明的方法,并且要有足够的近似度。”
您必须找出一种以可识别且看似简单的方式呈现问题的方法。您不会相信有多少名CS学生会尝试直接编写这样的程序 ……在参加可计算性课程之前:)
典型的示例是尝试使用正则表达式解析HTML。这可以使用有限的HTML集合,但由于它们具有不同的Chomsky语法(如链接清楚所示),因此通用解决方案是不可能的。
一般来说,有些人(例如您的同事)不喜欢哲学思考,我不确定您是否可以从思维定式中争论自己的出路。他的第一点肯定是错误的,但是他的第二点可能只是一种表达方式,我无需担心这一点,即可为收货的网络表单编写代码。我对此表示同情,但有时知道该理论意味着您不会致力于在工作时间上找到圣杯。
也许答案是您的同事是正确的。也许您对图灵有误解,或者它在这里如何应用?
所有机器都是有限的,因此没有“真正的”图灵机,也没有永不停止的程序。一个执行简单无限循环的琐碎程序可能会运行5分钟或50年,但在有限的机器上它将停止。诸如“精确计算pi”之类的重要问题也将停止,因为最终计算将超出存储更多数字的能力。
图灵结果不能保证对有限机器特别有用,因此您的追求最终将毫无结果。最好专注于多少时间和多少钱,并让数学家无穷无尽。
您可能会认为类似的程序{ while true: print "running"; print "halted"; }
是一个反例,但事实并非如此。该程序有副作用,可能会或可能不会导致其停止。忽略副作用,可以设计出正式的证明该程序不会停止。在这个问题中,我们只关心规避无法停止的正式证明的程序。这不是这样的程序。
区分“强”图灵与“弱”图灵可能会有所帮助。强大的图灵机实际上是无限的,并且如果无法停止运行,它们将运行无限的时间。我们不能建立那些。
图灵机数量有限,时间和空间有限,它们是我们唯一可以制造的机型。我们对无法证明在这些限制内停止的程序感兴趣。图灵告诉我们,有这样的程序,但我们无法识别它们。如果极限足够低,我们可以通过编写程序并将其运行到极限来识别它们。
图灵的本质是没有捷径。确定问题在计算上是否可行的唯一方法是编写程序,运行并查找。只要有足够的时间和金钱,您就可以编写所有程序,随着时间的推移永久运行它们,并找到产生结果的程序(挂脖)。其他的仍将运行。您的同事有足够的时间和金钱来做到这一点吗?
严重的是,争议是关于极限的。图灵和NP完全告诉我们,无论预算多少,或时间表有多大,在任何给定的预算内或在给定的时间表内,计算机都无法解决某些类型的问题。这类问题的例子比比皆是:破解密码密钥;优化运送到数百个地址的路线;卡车包装箱;在大型程序中发现错误!
因此,请您的同事提供预算和时间表,并保证您会遇到无法在该预算或时间表内解决的问题。这个承诺将非常容易兑现。
while True: print "doing stuff"; print "Finished";
这是一个程序的示例,它需要无限的时间才能完成。还有无数其他程序,它们也需要无数时间才能完成。我们定期创建需要无限时间才能完成的程序。它们被称为“长期运行的过程”。大多数动态网站就是其中的一个例子。