完美破解理髮師悖論

轉自: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)不能停機=> 它能夠停機


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

發佈了20 篇原創文章 · 獲贊 12 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章