我已经发布了有关函数equality的问题。它很快得出结论,一般功能平等是一个非常难以解决的问题,可能在数学上是不可证明的。
我想建立一个函数
function equal(f, g, domain) {
}
f
& g
正在暂停一个参数的函数。他们的论点是一个自然数。这些函数将返回一个布尔值。
如果没有传递域,那么您可以假设域默认为所有自然数。
domain
的结构是equal
函数最方便的任何内容。
另一个重要的事实是f
& g
是确定性的。并将为m
一致地返回相同的布尔f(n)
。
您可以假设f
和g
始终返回,并且只要输入在domain
这个问题与语言无关,并要求实现equal
功能。我不确定SO是否适合这个地方。
f
& g
没有副作用。并且domain
不一定是有限的。
答案 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
做一些假设。也许在您的情况下,他们在特定条件下应用可能使其可解决的问题。
在其他情况下,我唯一推荐的是模糊测试,抽象语法树或其他表示。