百度空间 | 百度首页 
 
查看文章
 
JavaScript能判定两个function等价吗?
2009-06-10 18:42
这里的等价不是说function的toString相同,也不是说function的引用相同,而是说
对于两个function A和B,如果它们的输入参数相同,返回值必然相同

JavaScript存在这样的判定函数吗?
答案是不存在,证明如下:

假定存在一个function P能判断任意两个一般函数f1和f2是否等价,即
若f1、f2等价,P(f1,f2) return true
若f1、f2不等价, P(f1,f2) return false;
现在我定义一个函数P1
function P1(f1,f2){
    if(P(P,f1) && P(P1,f2)) return false;
    else return P(f1,f2);
}
那么对于P(P,P1)
1) 若P(P,P1) return true,那么P,P1等价,可P1(P,P1)却return false,显然和P,P1等价假设矛盾
2) 若P(P,P1) return false,那么P1(P,P1) return false,而对于任意其它f1,f2,显然P1(f1,f2)的返回值都和P(f1,f2)的返回值完全相同,根据前面的定义,P与P1等价,同P(P,P1) return false矛盾。
综上所述,不存在一个函数P,能够判定JavaScript的两个function等价。
证毕。

类别:默认分类 | 添加到搜藏 | 浏览() | 评论 (6)
 
最近读者:
 
网友评论:
1
2009-06-10 19:00 | 回复
严密的证明,赞一个
 
2
2009-06-11 09:30 | 回复
"这里的等价不是说function的toString相同,也不是说function的引用相同,而是说对于两个function A和B,如果它们的输入参数相同,返回值必然相同"
---
这种等价的定义很怪,
因为以下function 不等价自己。

function a(){
return Math.random();
}
 
3
2009-06-11 09:43 | 回复
月影的证明,是建立在P(a,a)一定返回true的基础上的。

直观的感觉,如果通过对js的语法分析,理论上是可以判断出以下两个函数等价的:
function a(){return 1};
function b(){return 2-1};
 
4
2009-06-11 10:07 | 回复
如果真的要定义“函数等价”
定义成:
__proto__恒等,__parent__恒等(scope),各属性恒等,理想压缩后的字符串恒等。
这样的函数还是挺有意义的。

var a1=function(){return 1};
var a2=function(){return 2-1};

var b1=function(){Math.random();}
var b2=function(){Math.random();}

var c1,c2;
    (function(){
        c1=function(){alert(1);};
        c2=function(){alert(1);};
    })();

 
5
2009-06-11 13:36 | 回复
其实就是停机问题的改版~~~
Q = function(){
do{
    input = get_random_input();
}while(F(input) == G(input))
}

P是判定Q是否可以有限运行的函数…………
 
6
2009-06-15 09:33 | 回复
"如果真的要定义“函数等价”
定义成:
__proto__恒等,__parent__恒等(scope),各属性恒等,理想压缩后的字符串恒等。
这样的函数还是挺有意义的。"

当时就是这样想的,可惜没有办法判断出来 ^_^
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu