完美破解理发师悖论

转自:http://haoqis.com/blog/30

理发师悖论:在某个城市中有一位理发师,他的广告词是这样写的:“本人的理发技艺十分高超,誉满全城。我将为本城所有不给自己刮脸的人刮脸,我也只给这些人刮脸。我对各位表示热诚欢迎!”来找他刮脸的人络绎不绝,自然都是那些不给自己刮脸的人。可是,有一天,这位理发师从镜子里看见自己的胡子长了,他本能地抓起了剃刀,你们看他能不能给他自己刮脸呢?如果他不给自己刮脸,他就属于“不给自己刮脸的人”,他就要给自己刮脸,而如果他给自己刮脸呢?他又属于“给自己刮脸的人”,他就不该给自己刮脸。

破解:

设x,y表示任意人,b表示barber(理发师),h表示haircut(理发),
x给y理发: h(x,y)
x不给y理发: ~h(x,y)

那么,
给自己理发: h(x,x)
不给自己理发: ~h(x,x)
理发师给某人理发: h(b,x)

理发师规则:~h(x,x)=>h(b,x) (x不给自己理发,则理发师给x理发)

如果理发师规则为真,【并且】x=b,那么~h(b,b)=>h(b,b)
而 ~h(b,b)=>h(b,b) 恒为假!
因此,【并非】”理发师规则为真, 并且 x=b“,
即”理发师规则为假,或者x不等于b”成立,
于是,”如果x等于b,则理发师规则为假”。

同样,”如果x等于b,则理发师规则为假”,
等效于
“如果理发师规则为真,则x不等于b”,
与我们的常识相符。

结论:理发师规则~h(x,x)=>h(b,x) ,只有在x不等于b的时候,才能成立,例如~h(a,a)=>h(b,a) , ~h(a,a)和h(b,a)没有矛盾。

当x=b的时候(b自己给自己理发),表达式变为~h(b,b)=>h(b,b),蕴含矛盾。所以理发师规则蕴含矛盾,本身就不成立。

【假设理发师规则为真】=>
{
假设不给自己理发=》给自己理发
假设给自己理发=》不给自己理发
}
这才是正确的,完全符合逻辑。

~h(x,x)=>h(b,x) 碰巧在x不等于b的时候,成立,在x等于b的时候矛盾。

同样对于三元逻辑,如果规定对应法则f,使得
~f(x,y,z)=>f(a,b,z),当(x,y)不等于(a,b)的时候,则f可成立。
当(x,y)等于(a,b)的时候,有~f(a,b,z)=>f(a,b,z),矛盾。

说谎者悖论:“这句话是假的”
令x=“这句话是假的”
这句话=x
即x=“x是假的”
x是假的,即~x为真
即 x=~x

“这句话是假的” 蕴含 x=~x
~h(x,x)<=>h(b,x) 蕴含~h(b,b)<=>h(b,b)
….
悖论是一个或一组命题(显然),【假定悖论命题为真】的前提下,“蕴含”形如A=~A的矛盾。

由此可见,这两个著名的悖论,在于构造命题(组)P
使得P=>(Q<=>~Q),因此,矛盾否定的是P。

P=>(Q<=>~Q)等价于
P=>(Q=>~Q) and P=>(~Q=>Q)
这就是悖论的感觉:如果q为真,则q假,如果q为假,则q真。因为你假定了悖论p真。

最终结论:悖论的产生源于其前提为假!悖论进一步表明了逻辑推理的伟大和正确性!

然而可以发散一下思维,理发师虽然说错了,但是这个前提实际上是集合的自指,要破除的话,理发师只要说给除自己以外的不给自己理发的人理发就行了,另一个办法就是让其他人帮他理发。其中一种潜在的假设就是只有他一个人能理发。



另有图灵停机问题,实则同出一辙:转自http://blog.csdn.net/niushuai666/article/details/7260957


不存在这样一个程序(算法),它能够计算任何程序(算法)在给定输入上是否会结束(停机)。


那么,如何来证明这个停机问题呢?
反证!假设我们某一天真做出了这么一个极度聪明的万能算法(就叫God_algo吧),你只要给它一段程序(二进制描述),再给它这段程序的输入,它就能告诉你这段程序在这个输入上会不会结束(停机),我们来编写一下我们的这个算法吧:
bool God_algo(char* program, char* input)
{
    if(<program> halts on <input>)
        return true;
    return false;
}


这里我们假设if的判断语句里面是你天才思考的结晶,它能够像上帝一样洞察一切程序的宿命。现在,我们从这个God_algo出发导出一个新的算法:
bool Satan_algo(char* program)
{
if( God_algo(program, program) )
{
       while(1);        // loop forever!
       return false;   // can never get here!
}
else
       return true;
}
正如它的名字所暗示的那样,这个算法便是一切邪恶的根源了。当我们把这个算法运用到它自身身上时,会发生什么呢?
Satan_algo(Satan_algo);
我们来分析一下这行简单的调用:
显然,Satan_algo(Satan_algo)这个调用要么能够运行结束返回(停机),要么不能返回(loop forever)。
如果它能够结束,那么Santa_algo算法里面的那个if判断就会成立(因为God_algo(Santa_algo,Santa_algo)将会返回true),从而程序便进入那个包含一个无穷循环while(1);的if分支,于是这个Satan_algo(Satan_algo)调用便永远不会返回(结束)了。
如果不能结束(停机),则if判断就会失败,从而选择另一个if分支并返回true,即Satan_algo(Satan_algo)又能够返回(停机)。
总之,我们有:
Satan_algo(Satan_algo)能够停机=> 它不能停机
Satan_algo(Satan_algo)不能停机=> 它能够停机


所以它停也不是,不停也不是,左右矛盾。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值