如果我有一些函数f
的代码(为了简单起见,它接受一个输入),我需要确定输入x
是否影响输出f(x)
,即if { {1}}是下面定义的常量函数。
如果f
的输出是w.r.t f
的不变量,则将f
定义为常量函数。这应该适用于所有输入。因此,例如,如果我们有x
,它可以为除x = 0之外的所有输入输出0,其中它可能输出错误。所以f(x) = 0 power x
不是一个常数函数。
我只能对代码进行静态分析,并假设代码是Java源代码以简化。 这可能吗?
答案 0 :(得分:1)
这显然至少与解决停机问题(作为练习留下的证据)一样难,所以答案是“不”,这是不可能的。
答案 1 :(得分:1)
几乎可以肯定。在多数情况下。哪里没有奇怪的事情发生。
对于普通函数,实际返回值的普通,有用的类型,而不是做自己的小事,是的。
对于一个简单的函数,不是递归的,没有那种肮脏,手动做,我可能会使静态分析等效于符号图,在那里我检查代码并确定可能可能是边界条件等(例如代码中有if (x < 0)
,所以我检查函数的x值接近0)。如果这种尝试注定要失败,请在我尝试使用之前告诉我。
使用蛮力磨掉它可能会起作用,除非你正在使用四倍精度x值或类似大小的东西,因为那时蛮力可能需要数年时间。虽然在那时它不再是静态分析了。
静态分析通常意味着让计算机通过查看代码告诉您,而不是您自己查看(至少不是很多)。存在以多种语言执行此操作的算法,wikipedia具有这样的列表,包括一些免费或甚至开源。 可以做某事的最终证据就是它已经完成了。
答案 2 :(得分:0)
由于您将非终止函数称为非常量函数,因此这是从问题减少到停止问题:
void does_it_halt(...);
int f(int x) {
if(x == 1) {
does_it_halt();
}
return 0;
}
询问f
是否恒定等同于询问does_it_halt
是否停止。因此,你所要求的是不可能的,因为停止问题是不可判定的。