如何检查两种算法是否对任何输入返回相同的结果?


18

当所有输入的集合都是无限的时,如何检查两种算法(例如,合并排序和朴素排序)对于任何输入是否返回相同的结果?

更新:感谢Ben解释了在一般情况下如何通过算法无法做到这一点。Dave的答案很好地总结了算法方法和手动方法(受人类智慧和隐喻的影响),这些方法并不总是有效的,但却非常有效。


5
正如yuval所说,没有任何程序可以确定任何两个程序。但是在像您的示例这样的特殊情况下,您可以证明这一点:例如,如果您证明两种算法都返回了排序的序列并且是稳定的,那么您就可以完成。
Sasho Nikolov

1
您需要自动技术/算法还是一组手动技术?
戴夫·克拉克

@SashoNikolov,如果将性能视为输出的一部分,则还必须显示它们在相同的时间/空间复杂度下运行。
edA-qa mort-ora-y 2012年

1
您是说“检查”还是证明?是指“任何输入”还是所有输入?这个问题的动机和背景是什么?
卡夫2012年

2
@AndresRiorio:证明技术不同于解决一般问题的算法。例如,停止问题是无法确定的,但是肯定有可能证明许多程序已终止(手动或自动启发式)。
拉斐尔

Answers:


16

与反对者所说的相反,有许多有效的方法可以做到这一点。

  • 双仿真是一种方法。例如,参见戈登的论文协导和函数编程

  • 另一种方法是使用程序等效的操作理论,例如 Pitts

  • 第三种方法是验证两个程序是否满足相同的功能规范。关于这种方法有成千上万的论文。

  • 第四种方法是证明可以使用声音程序转换将一个程序重写为另一个程序

当然,由于不确定性,这些方法都不是完整的,但是为解决该问题已经进行了大量的工作。


heu·ris·tic。[Gr。ε.ρίσκω“ discover”] n。1.一种旨在解决问题的技术,该技术忽略了该解决方案是否可以证明是正确的,但通常会产生一个好的解决方案,或者解决一个更简单的问题,其中包含或与更复杂的问题相交。2.(理论上)算法不起作用。
JeffE 2012年

1
巴特·辛普森(Bart Simpson):“赢不了。不要尝试。”
戴夫·克拉克

9
@JeffE:如果要检查两个算法是否返回相同的结果,请做一个证明。有很多好的技术可以做到这一点。当然,所有方法都不完整,但是谁在乎呢?戈德尔的不完备性定理不是放弃数学的理由!
Neel Krishnaswami 2012年

3
@JeffE仅仅因为没有确定两个任意算法是否返回相同结果的可计算函数,并不意味着您无法针对任何两个特定算法回答问题,尤其是搜索证明的过程不可计算时功能。同样,有大量论文证明了特定算法可以保证终止,而不管不可能机械地确定任意算法是否总是终止的事实。
2012年

2
在实践中,两个本应计算相同功能的算法几乎都不会提供基于双仿真的等效性证明。(在上述排序算法的情况下,循环/递归的中间阶段是不同的。)我想说的是,使用好的旧的Hoare逻辑来证明它们都实现了相同的I / O行为规范。去。
2012年

10

为了略微说明“这是不可能的”陈述,这是一个简单的证明草图。

我们可以用图灵机的输出对算法建模,而图灵机的输出将停止在磁带上。如果您希望通过在磁带上接受输出或拒绝(在这种情况下没有输出)可以停止的机器,则可以轻松地提出一种编码,使您可以使用“不停止或不停止,没有拒绝”的机器。

现在,假设我有一个算法P用于确定两个TM的每个输入是否具有相同的输出。然后,给定一个TM A和一个输入X,我可以构造一个新的TM B,其操作如下:

  1. 检查输入是否正好是X
  2. 如果是,则进入无限循环
  3. 如果否,则在输入上运行A

现在我可以在AB上运行P了。B不会在X上停止,但是对于所有其他输入都具有与A相同的输出,因此,并且仅当A不在X上停止时,这两种算法的每个输入才具有相同的输出。但是假设P能够判断两种算法的每个输入是否具有相同的输出,因此,如果我们拥有P,我们就可以判断任意输入的任意机器是否停止,这就是停止问题。由于已知停止问题无法确定,因此P不存在。

这意味着没有通用(可计算的)方法来确定两种算法是否始终具有相同的输出,因此您必须对要分析的一对算法应用特定的推理。但是,在实践中,可能存在适用于大量算法的可计算方法,并且当然可以使用某些技术来尝试为任何特定情况制定证明。戴夫·克拉克(Dave Clarke)的答案为您提供了一些相关的知识。“不可能”结果仅适用于设计一种通用方法,该方法将针对所有算法对一劳永逸地解决问题。


也许是我的 P仅适用于排序算法。(挑衅性的问题)
拉斐尔

@Raphael是的,我所概述的论点没有提到这样一个受限制的P,只是没有一个完全通用的P。我的直觉是,即使您仅将暂停问题限制在“排序算法”而不是通用算法上,也仍然无法确定,在这种情况下,可能性证明仍然成立,尽管我从未听说过这样的说法。
2012年

2
更普遍地讲,赖斯定理指出,只要有至少一种算法具有您要证明的特性,至少有一种算法没有,就没有一种可计算的方式证明某种算法的某些特性。例如,给定的算法A,不存在可计算函数,采用的算法乙作为输入,并测试B是否等于A.
吉尔“SO-停止尚且”

重要的是要注意,赖斯定理仅适用于语言的属性,而不适用于图灵机的属性(当您将其用作“算法”的模型时)。如果可能存在两台都识别相同语言但一台具有属性而另一台没有属性的图灵机,则赖斯定理不适用,并且可能有一种通用的可计算方法来测试该属性。但是赖斯定理显然适用于这种情况,是的。
2012年

2

通常这是不可能的,但是许多约束可以使之成为可能。例如,您可以使用BDD检查两个直线代码程序的等效性。符号执行可以处理许多其他情况。


1

不可能设计出一种可以证明这种相等性的算法。提示:减少暂停问题。


存在许多技术,尽管没有一种是全自动的。
戴夫·克拉克

我不知道是否可能,您的回答只是评论。没有答案。

@SaeedAmiri:我充实了答案的内容;我认为它足够完整,甚至可能不是特别好。
拉斐尔

@ Raphael,Yuval头脑中的减少是显而易见的,我不认为OP对此并不了解,但是IMO的难题正在为特殊情况找到某种方法,因此,这种明显的减少可能只是在提醒OP对于一般情况。

2
@SaeedAmiri:那是由OP和选民决定的,不是我们。
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.