限制函数的函数相等

时间:2011-01-30 17:13:55

标签: language-agnostic function equality

我已经发布了有关函数equality的问题。它很快得出结论,一般功能平等是一个非常难以解决的问题,可能在数学上是不可证明的。

我想建立一个函数

function equal(f, g, domain) {

}

f& g正在暂停一个参数的函数。他们的论点是一个自然数。这些函数将返回一个布尔值。

如果没有传递域,那么您可以假设域默认为所有自然数。

domain的结构是equal函数最方便的任何内容。

另一个重要的事实是f& g是确定性的。并将为m一致地返回相同的布尔f(n)

您可以假设fg始终返回,并且只要输入在domain

内,就不会因为错误而抛出任何异常或崩溃

这个问题与语言无关,并要求实现equal功能。我不确定SO是否适合这个地方。

f& g没有副作用。并且domain不一定是有限的。

3 个答案:

答案 0 :(得分:3)

这仍然不可能。

您可以针对某些有限数量的输入测试这两个函数,并检查它们在这些输入上是否相等。如果它们对于任何输入不相等,则这两个函数不相同。如果在你测试的每种情况下它们是相同的,那么它们就有可能是相同的功能,但你不能完全确定。

通常,除非域很小,否则测试每个可能的输入是不可行的。如果域是32位整数并且您的函数评估速度非常快,那么检查每个可能的输入可能是可行的。

答案 1 :(得分:2)

我相信如果不对源代码进行静态分析,您可以做到以下几点:

function equal(f, g, domain) {
    var n;
    for (n in domain) {
        if (f(domain[n]) != g(domain[n])) return false;
    }
    return true;
}

请注意,这假定域是有限的。

如果域不是有限的,Rice's theorem会阻止此类算法存在:

如果我们让f和g成为实现,而F和G是数学函数,这些实现计算的值,那么Rice的定理说,不可能确定f是否计算G或g计算F,因为这些是非 - 实现的特殊属性。

有关详细信息,请参阅my answer to the previous question

答案 2 :(得分:0)

根据您的使用情况,您可以对f & g做一些假设。也许在您的情况下,他们在特定条件下应用可能使其可解决的问题。

在其他情况下,我唯一推荐的是模糊测试,抽象语法树或其他表示。