謎題和悖論之間有著深刻的聯繫。面對一個謎題,我們可以提出許多假說,其中一個可以避免矛盾,這個假說就是答案。但是在悖論中,所有假說都是不合理的。
邏輯謎題的味道很怪——有點兒像生牡蠣。有些人覺得邏輯謎題是有趣的挑戰,有些人則很討厭它。一個重要的問題是,是否存在解決邏輯謎題的通用方法?是否存在所有人都可以掌握的固定的程序、竅門或方法,可以解決所有的邏輯謎題?如果這種東西存在,那麼它在科學以及其他領域都是無價之寶。
在實際操作中,邏輯表現為兩種方法的混合:其一是按部就班的演繹推理,其二是窮盡所有可能性的搜索。第一種方法可以通過一組經典悖論展示。
忒修斯之船
根據普盧塔克的記載,特修斯殺死人身牛頭怪物之後返回雅典,他乘坐的船被雅典人一直保存到法萊雷奧斯的德米特裡(Dmetrius Phaleron)的時代。之所以可以保存這麼久,是因為在船上的老木板腐朽以後,人們用結實的新木板替換了以前的木板。在哲學家那裡,這艘船成為爭論點,他們用這個活生生的例子探討「事物的發展」這一邏輯問題。一方認為,這艘船還是以前的那艘船,另一方則主張它已經不是了。
所有人都同意,在一艘船上換掉一塊木板並不會改變這艘船的「身份」,在撤換一塊木板之後船還是原來的船。在修理過的船上再換掉一塊木板,情況還是一樣。可是,也許到某個時刻,整條船上連一塊最初的木板也不剩了,此時,如果雅典人還把這艘船稱為特修斯之船,那就是自欺欺人了。假如這艘船當初沒有被保留下來,後來的雅典人只是用這些後來的木板直接造了一艘船,那麼所有人都會把這艘船稱為「特修斯之船的複製品」,大家不會認為這艘船還可以被稱為別的東西。
一些較小的、同一類型的悖論在古希臘很流行。芝諾說,一粒谷子掉在地上沒有聲音,但是,當一大袋谷子掉在地上時,為什麼卻發出了聲音?袋子裡除了一粒一粒的谷子之外什麼都沒有。「谷堆悖論」[1]與這個問題屬於同類問題:無論什麼時候,從一堆沙子裡拿走一粒沙子,剩下的還是一堆沙子。想像有一堆沙子,從沙堆裡取走一粒沙子。根據你過去的經驗,是否存在這樣一種可能性:本來是一堆沙子,取走一粒沙子以後,剩下的就不是一堆沙子了?當然不可能。於是,我們從一堆沙子開始,一粒一粒來取,最終,這堆沙子只剩下孤零零的一粒了,但它必須依然是一堆!然後把這僅存的一粒也取走,什麼也不剩了,但是,在這種情況下,它也必須是一堆!
當然,為了逃脫困境,我們可以規定「堆」的最小標準。「一堆至少要包含1 000粒,於是規則變成這樣:『在粒數不少於1 001粒的一堆中取走一粒,剩下的依然是一堆。』」然而,這個規定念起來都非常彆扭。它不是已經誤解最初的問題了嗎?「堆」這類詞的含義原本就被視為是模糊的。
這個悖論的一個現代版本是王浩悖論(以王浩的名字命名)。王浩聲稱,如果一個數x是小的,那麼x+1也是小的。所有人都同意0這個數是小的吧?是的。於是,1(「0+1」)是小的,2(「1+1」)是小的,3(「2+1」)也是小的……所有數都是小的。這是荒唐的。
連鎖推理
一個連鎖推理是由一連串推理構成的一個鏈條。在這種推理形式中,每一個命題的謂項與下一個命題的主項相同。換一個說法,如同下例:
所有大烏鴉都是烏鴉;
所有烏鴉都是鳥;
所有鳥都是動物;
所有動物都需要氧氣。
在這個連鎖推理中,各個前提聯繫在一起導致了一個明顯的結論(「所有大烏鴉都需要氧氣」)。在許多邏輯謎題中,關鍵就在於發現連鎖推理。上一章(插曲)提到的「公司的流言加工廠」的例子,就是一個明顯的連鎖推理。
連鎖推理(sorites)這個詞源於希臘語中與「堆」對應的單詞。這是因為,在谷堆悖論中正是(錯誤地)應用了這種推理方法:
如果x構成一堆,那麼x減去1粒構成一堆;
如果x減去1粒構成一堆,那麼x減去2粒構成一堆;
如果x減去2粒構成一堆,那麼x減去3粒構成一堆;
如果x減去3粒構成一堆,那麼x減去4粒構成一堆;
……
如果x減去12 882 902粒構成一堆,那麼x減去12 882 903粒構成一堆:
這樣下去,這個推理可以包含上百萬個步驟。
連鎖悖論可能是最簡單的演繹悖論了。這裡沒有任何難以理解的東西。一個前提輕微地不精確,在這個前提不斷地重複應用之後,這種不精確性累積起來——所有的連鎖悖論都是根據這種方法生成的。這種悖論的迷人之處在於,它利用(濫用)了一種極為常見而重要的推理形式。我們的大多數知識和觀念都是通過連鎖推理達到的。
有一天你看見一隻烏鴉,以前你從未見過這只烏鴉,任何鳥類學家也沒見過這只烏鴉。即便如此,你還是知道許多關於這只烏鴉的事。你知道(或者說有強烈的理由相信),它是恆溫動物,它的羽毛和皮膚下面有骨頭,它是從蛋裡孵出來的,為了生存它需要水、氧氣和食物,等等。這些知識既非來自直接經驗,也不是別人明確地告訴你的。你曾經把某只烏鴉放進充滿純氮的屋子裡嗎(更別說這只特定的烏鴉了)?你曾經在某本書上見過「所有烏鴉都有骨頭」這樣直截了當的陳述嗎?你通過建構必需的連鎖推理,才能瞭解關於這只烏鴉的這些事實。
科學建立於連鎖推理之上。根據這種推理形式,任何人都可以從幾個既得的概括陳述出發,推出很多信息。信賴連鎖推理可以使實驗過程更經濟。很可能從沒有人做過實驗以檢驗烏鴉是否需要氧氣。實驗已經表明各種不同種類的動物都需要氧氣,如果存在什麼理由令我們相信烏鴉也許是厭氧型生物,那麼這種可能性應當已經有人檢驗過了。就像上面介紹的那樣,我們依賴於連鎖推理。
科學家尋求「所有X都是Y」這樣的概括陳述,因為這類陳述使他們可以迅速地推理。「控制實驗」的概念已預先假定,關於這個世界的重要事實符合這類陳述(在控制實驗中,原因與結果的關係是獨立可辨的)。然而,這並不意味著,所有真理都可以如此簡單地表達。每當我們發現一部分真理時,這些真理總是反映出我們已掌握的、關於真相的片段可能與真相的整體並不相符。
複雜性
上一章介紹了「UND」謎題,這道題無法用「合乎邏輯」的方法解決。福爾摩斯對這道題的抱怨顯示了一個相反的問題類型,與那些可以用邏輯程序處理的問題相對。連鎖推理式的按部就班的程序,在這裡無法應用。
「UND」謎題涉及一個被稱為「複雜性理論」的數理邏輯分支。複雜性理論在客觀、抽像的程度上研究「一個問題會困難到什麼程度」。計算機程序員根據經驗發現,用計算機處理某些類型的問題要比處理其他類型的問題困難得多,這一發現催生了複雜性理論。
如果複雜性理論只應用於計算機,那它的用處就小多了。實際上,這個理論同樣可以應用於人類解決問題的過程。一個人解決問題必須依賴方法,方法(而非硬件)正是複雜性理論關注的焦點。
尋找一個客觀標準來衡量一個問題的困難程度,達到這個目標看起來也許是徒勞的。大多數在真實世界中出現的問題都是這樣:一些人覺得容易,另一些人覺得困難。許多問題的解決依賴於在問題和其他的特定事實之間建立的各種各樣的思想聯繫。你或者能建立起聯繫,或者不能建立起聯繫。
某些謎題需要建立特定的思想聯繫(例如華生提出的分割土地問題),從某種角度說,這類問題是最困難的一類邏輯謎題,因為如何去解一點兒道理也講不出來。換一個角度來說,這類問題又是最容易的——一旦聯繫建立好就一點兒難度也沒有了。
複雜性理論最關心這樣一類問題:即使存在程序化的解法,問題也是難解的。有些問題在本質上是困難的,不僅人類無法解決,科學幻想中遙遠的未來計算機也解決不了,但這些問題是可解的,它們不是悖論,也不是沒有解的騙人的問題。
複雜性理論的一個核心概念是「算法」。算法是處理某問題的一個確定的、機械的程序。它是一套完備的指令,在執行過程中,洞察力、直覺和想像力都是不需要的。所有計算機程序都是算法。做蔬菜湯的菜譜、裝配自行車的操作指南、許多簡單遊戲的規則等,這些都是算法的例子。在小學裡教的算術規則也是算法。我們知道,當我們把兩個數相加時,無論數有多大,應用這些規則總會得出正確的答案。如果我們的答案錯了,原因一定是誤用了規則。沒有人會懷疑算法本身。
算法必須是確切的。「如果你在樹林裡迷路了,保持冷靜,調動常識,走一步看一步。」這是建議而非算法。童子軍的條例則不同:如果你在樹林裡迷路了,一直往低處走,直到溪流旁,然後順流而下,最後你會到達一個城鎮。這則是一個算法。
給出一個有效的算法是很難的。未預料到的情況將會發生,童子軍的算法可能失效,這種情形不難想像。你有可能身處於沙漠盆地,一直往低處走會到達一個乾涸的湖底,卻找不到溪流。在地球上的某些偏遠地區,有的溪流通向一個內陸湖或者海洋,附近歷來沒有人類的住所。更糟的情況是,如果你發現自己處於一個非常平坦的平原上,不存在明顯的「低處」,此時,算法對你一點兒用也沒有。一個理想的算法應當在任何環境下都有效。
我們並非總是依賴算法。有些廚師按菜譜炒菜,還有些廚師願意自由地即興操作,以至於他們聲稱無法描述一道菜是怎麼炒的。兩種方法無所謂誰對誰錯,但是只有算法化的方法值得我們分析。
說假話的和說真話的
邏輯謎題是我們用以理解世界的演繹推理的縮影。我們來看一下,如何用程序化的方法解決一個邏輯問題。邏輯謎題中最古老的類型之一建立於如下背景:在一個遙遠的海島上有一些居民,其中有些人總說真話,還有些人總說假話。他們分別屬於兩個部落:說真話者的部落,其成員總說真話;說謊者的部落,其成員總說謊話。必須強調的是,說謊者並不狡詐,他們不會採用時而說真話的辦法來掩蓋一個謊言,他們說出的每一句話都與真話完全相反。兩個部落的服飾是一樣的,對於外地人,也沒有其他線索能夠區分某個人屬於哪個部落。也許最常被重複的「說真話—說假話」的問題是納爾遜·古德曼(此人因提出綠藍—藍綠問題而著名)設計的一個問題。這個問題於1931年發表於《波士頓郵報》的謎題專欄,但是沒有指明其發明者。我們把這個問題稍加變動,表述如下:
在一個「說真話–說假話」的海島上,你遇到三個人,分別是艾麗斯、本和查理。
你問艾麗斯,她是說謊話的還是說真話的。她用方言作答,你沒聽懂。
然後你問本,艾麗斯說的是什麼。本會說英語,他說:「艾麗斯稱自己在說謊。」你又問本關於查理的情況,本回答道:「查理也是說假話的。」
最後,查理補充說:「艾麗斯是說真話的。」
你能推出這三個人各自屬於哪個部落嗎?
誰在說謊?
在演繹推理中,基本原則與主觀性的因素無關;在「說真話—說假話」的問題中,也是如此。假如這個問題這麼開頭:我們的主人公從飛機上跳傘,落到一個海島上——這不會產生任何影響。然後給這三個人換上不同的名字,也不會有什麼不同,只不過答案中出現的名字變了。這個問題的最關鍵之處在於發現了一種邏輯聯繫,這是唯一重要的。
我們只關心一件事:確定這三個人所屬的部落。在解決算術問題時,我們經常利用「x=12+5y」之類的公式。其中x和y是變量,表示未知的量,在一個可能的變化範圍內取值。解決這類問題的關鍵,在於確定x和y必須取什麼特定的值。邏輯問題也可以用同樣的方法處理。在這個邏輯謎題中,有三個未知量:艾麗斯是否說真話,本是否說真話以及查理是否說真話。
當然你也可以說,未知量是艾麗斯、本、和查理是否說謊話。這不會帶來什麼差別。不過我們對這個思路不加評判,我們僅僅以艾麗斯、本和查理是否說真話為未知量。這樣,我們就得到了三個簡單的命題,其真假未定:
艾麗斯是說真話的。
本是說真話的。
查理是說真話的。
以上三個命題是對整個情景最基本的描述,它們構成了這個問題的邏輯結構的原子,不存在比它們更基本的命題。這三個命題不是我們已經確知的事實,它們只是我們構造出來的或真或假的命題,因此,它們的地位非常類似於代數中的變量。當然,這些語句的「值」可以是「真」,也可以是「假」。用邏輯學術語說,這些命題是「布爾變量」,這個術語得名於英國邏輯學家喬治·布爾(George Boole,1815~1864)。
在這個邏輯問題中,我們首先問了艾麗斯一個問題。但是,艾麗斯的回答我們聽不懂,我們從中推不出任何有效信息。
第一個有效信息來自本。本說艾麗斯稱自己是說謊的。你很可能已經想到了,我們不能按照該句的表面意思接受這個命題。本在轉述艾麗斯的話時可能在說謊,艾麗斯本人在介紹自己的情況時也可能在說謊。只有在確定了三個人分別屬於哪個部落之後,也就是說,只有在確定了誰說假話、誰說真話以後,本的話的真正意思才可以確定。
我們分析一下。艾麗斯和本不可能都說真話。如果他們都說真話,那麼艾麗斯會誠實地說她是說真話的,而本也會誠實地把艾麗斯的話翻譯給我們。由於本說艾麗斯稱自己是說謊的,因此我們得出結論,這兩個人並非都說真話。
艾麗斯和本有可能都說假話嗎?有可能。當我們問艾麗斯她是否說謊時,她會回答說她不說謊。本也是嘴裡沒有一句真話的撒謊精,他會對艾麗斯的話加以否定,這樣就形成了雙重否定。本會說艾麗斯稱自己是說謊的。我們聽到他就是這麼說的。
實際上,沒有人會說「我是說謊的」。說真話的人不會這樣說——因為這是謊話;說謊話的人也不會這樣說——因為這是真話。如果直截了當地問一個人是否說謊,每個人都會說自己是說真話的(在現實生活中也是如此)。
本說艾麗斯稱自己是說謊的,這句話徹底暴露了他自己。無論艾麗斯實際上屬於哪個部落,她一定會說自己是說真話的。本的話與此相反,所以本是說謊話的。
(如果艾麗斯根本沒聽懂我們的問題,又會怎麼樣呢?她很可能會說「我聽不懂英語」,或者相反,「我能聽懂英語」——如果她是說謊話的。本會向我們報告其中的一個反應,如果本是說謊的,他會給我們一個錯誤的答案。由於說謊者部落如此缺乏想像力,從本的實際回答我們得知,艾麗斯一定已經聽懂了問題,並且做出了一個關於她的部落歸屬的回答。)
由於本是說謊的,他的第二句話 (「查理是說謊的」)一定也是假的。因此,查理一定是說真話的。
下面只剩查理的話了。查理說艾麗斯是說真話的,我們已經知道查理是說真話的,所以這一定是實際情況。答案是,艾麗斯說真話,本說謊話,查理說真話。
在以上解題過程中是否存在什麼方法?是的,的確有一些方法。沒有人會說自己是說謊的,意識到這一點是有用的。這就揭示了本是說謊的,而後問題迎刃而解。
但是這個方法(假定我們稱之為「方法」)不能應用於全部的、任意的「說真話—說假話」問題。例如,雷蒙德·斯穆裡安提出的一個簡單而新穎的問題:有一個部落歸屬不明的人說:「或者我是說謊話的,或者2+2=5。」那麼,他屬於哪個部落?
在這個例子中,當事人沒有說自己是說謊話的。他把兩個命題用「或者」聯繫起來,這意味著,如果說話者是說真話的,那麼這兩個命題中至少有一個是真的。
關於說話者我們可以提出兩種可能的假設:他是說真話的,以及他是說謊話的。如果說話者是說真話的,那麼他所說的就是真的。因此,「或者說話者是說謊話的,或者2+2=5」這個命題就是真的。
但這是不可能的。在「或者……或者……」的復合命題中,整體為真,則兩個子命題中至少有一個為真。「2+2=5」不可能為真,所以「我是說謊話的」這個子命題必須為真,而這與假定(說話者是說真話的)矛盾。
於是,我們嘗試另一個假設。假定說話者是說謊話的。於是,「或者說話者是說謊話的,或者2+2=5」這個命題是假的,其中的兩個子命題必須都是假的。如果其中有一個子命題是真的,那麼由「或者……或者……」構成的整個復合命題就是真的。因此,判定「或者A或者B」為假等於判定「A和B都是假的」。如果說話者是說謊話的,那麼「我是說謊話的」和「2+2=5」這兩個命題必須都是假的。可是我們又遇到了一個矛盾。如果說話者是說真話的,那麼他必須是說謊話的;如果說話者是說謊話的,那麼他又必須是說真話的。
事實上,斯穆裡安提出的這個謎題是說謊者悖論的一個巧妙的變種。這個謎題的「答案」是:答案不存在。(或者用斯穆裡安的話說,唯一能夠得出的結論是:這道題的出題者不是說真話的。)
有一個方法可以應用於任何「說真話—說假話」問題,即使無解的問題(就像斯穆裡安提出的問題那樣)也不例外。對於任意一個問題中提到的海島居民,無非有兩種可能:他屬於說真話部落或者屬於說謊話部落。我們把關於每一個海島居民的部落歸屬的一個猜測稱為一個「完全假說」(例如,「艾麗斯說真話,本說謊話,查理說真話」是一個完全假說)。對於任意一個問題,關於海島居民的完全假說的數量是固定的(在古德曼的問題中,其數量是2×2×2=8)。我們需要做的全部工作就是,列出所有這些假說,看看哪個假說與題中的命題相符。
在驗證各個完全假說的過程中,我們的目標是找矛盾,換句話說,我們在使用歸謬法。例如,在古德曼的問題中,有一個完全假說是三個人都說真話,這個完全假說導致一個結論:本會說出他不應當說出的話。這是一個矛盾,於是我們可以排除這個完全假說。把全部8個完全假說檢驗一遍,我們發現只有一種情況不導致矛盾:艾麗斯、本和查理分別說真話、謊話、真話。通過排除法,此題得到解決。
在《四簽名》(The Sign of Four)中,福爾摩斯說道:「我跟你說過多少遍了,在我們排除了所有不可能的情況以後,剩下的情況——無論多麼不可思議——一定是真的。」應用排除法可以解決許多類型的問題,但它並非總是切實可行的。
麻煩在於,排除的過程是緩慢的,這是因為需要檢驗的完全假說數量經常是無比巨大的。
一個布爾變量只能是真的或假的。對於一個未知量來說,有兩種可能性。每一個未知量使得完全假說的總量倍增。在涉及三個未知的布爾變量的問題中,可能的完全假說的數量是23=8。一般地,當存在n個或真或假的未知量時,有2n個可能的完全假說。如果一個「說真話—說假話」問題牽涉24個海島居民,完全假說個數將有上百萬。
可滿足性
現在我們已經觸及演繹推理的核心。邏輯問題的花哨背景(關於此問題看起來在討論什麼東西)與問題的解決無關。撇開這些花哨的虛飾之後,還剩下什麼?
剩下的是「可滿足性」。對於複雜性理論來說,可滿足性是最基本的、不可還原的邏輯內核。每一個演繹推理問題的內部,都以可滿足性為骨骼。
459個蘋果加上273個蘋果是多少、459個橘子加上273個橘子是多少、459根棒球棍加上273根棒球棍是多少,在我們看來,所有這些問題在本質上都是一個問題。算術的基礎就在於意識到所有這類問題就其基礎而言是一樣的。
複雜性理論得以建立的基礎,在於意識到許多更複雜的問題實際上是同一個問題。算術發源於古代人計數的問題。人們意識到,對小麥的蒲式耳數[2]進行加減,與對騾子和金幣的數量進行加減沒什麼兩樣。在20世紀60年代和70年代,計算機程序員面臨一些問題,這些問題導致了複雜性理論的誕生。這些程序員發現,許多看起來不同的問題是相互等價的。
習慣上,可滿足性可以表達為一個用「是—否」來回答的問題:給定一組前提,它們是否相互一致?或者說:它們是否描述了一個可能的世界?或者說:它們是否包含不可解的悖論?
一個完整的可滿足性問題包括一組布爾變量(即最初真假未定的基本命題)和一組關於這些布爾變量的邏輯命題,這些命題可以包含「或者」「並且」「並非」「如果……那麼……」之類的標準的邏輯連接詞。
通常,每個命題描述一個單獨的、不明確的觀察結果。以古德曼的「說真話—說假話」問題為例,以三個人的名字為符號表示三個布爾變量。這個問題實際上就是:
布爾變量:
艾麗斯(表示艾麗斯是說真話的)
本(表示本是說真話的)
查理(表示查理是說真話的)
命題:
1.如果(艾麗斯並且本)那麼並非艾麗斯
2.如果本那麼並非查理
3.如果查理那麼艾麗斯
第一個命題是最難處理的,它對應著本斷言艾麗斯稱自己是說謊的。如果本和艾麗斯都是說真話的,那麼這個命題就是可信的,而在此情況下,艾麗斯就不是說真話的。[3]
豬排問題
可滿足性問題可能非常難。劉易斯·卡羅爾設計過一些極其枯燥的邏輯謎題,這些題要求解題者借助十幾個(甚至更多)無意義的前提推出一個單獨的有效結論。有幾道題收在他未完成的教科書《符號邏輯》中,這些問題是對科學推理或數學推理的拙劣模仿,但是卻出人意料地困難。一些更難的問題已超出了大多數人的耐心的極限(雖然這些問題已經被計算機解決)。最困難的一個問題是在他的筆記中發現的,直到1977年才發表,這個問題包含50個前提。
卡羅爾設計過一個被人腦和計算機廣泛分析過的問題,即大名鼎鼎的「豬排問題」。這個謎題要求推出「完全結論」,即一個既與所有其他命題相一致又被所有其他命題所要求的假說。
豬排問題
(1)一個晚餐吃豬排的邏輯學家很可能丟錢;
(2)一個食慾旺盛的賭徒很可能丟錢;
(3)一個已經丟了錢的,並且可能丟更多錢的、鬱悶的人,總是在凌晨5點起床;
(4)一個既非賭徒又不在晚餐時吃豬排的人,一定有旺盛的食慾;(5)一個凌晨4點以前起床的、有活力的人最好去開出租車;
(6)一個食慾旺盛的、未丟錢的、不在早晨5點起床的人,晚餐總是吃豬排;
(7)一個有丟錢的危險的邏輯學家,最好去開出租車;
(8)一個鬱悶的、未丟錢的、熱心的賭徒,沒有丟錢的危險;
(9)一個不賭錢、食慾不旺盛的人,總是有活力的;
(10)一個真正熱心的、有活力的邏輯學家,沒有丟錢的危險;
(11)一個食慾旺盛的人不需要去開出租車,如果他是真正熱心的;
(12)一個鬱悶的、沒有丟錢危險的賭徒,在凌晨4點以前不睡覺;
(13)一個丟了錢、晚餐不吃豬排的人,最好去開出租車,除非他在凌晨5點起床;
(14)一個在凌晨4點以前睡覺的賭徒不需要去開出租車,除非他食慾旺盛;
(15)一個鬱悶的、沒有丟錢危險的並且食慾旺盛的人,是一個賭徒。
我們習慣於把邏輯看作某種自然產生的東西。我們期望解決一個邏輯問題而無須認真考慮問題的答案是怎麼來的。在卡羅爾的問題中,命題的數量太多了,而且非常不自然,無法立刻掌握。所以我們不得不將其訴諸算法,例如卡羅爾介紹的樹形圖和術語(或者借助於計算機)。
豬排問題有11個布爾變量(熱心的、吃豬排、是賭徒、凌晨5點起床、丟了錢的、食慾旺盛的、很可能丟錢的、有活力的、是邏輯學家、最好去開出租車、凌晨4點以前不睡覺的)。對於其中任意一個變量,都有211=2048種不同的假說。
豬排問題要求給出一個結論,看起來這個問題更像是科學研究。這似乎與可滿足性問題完全不同,可滿足性問題是由「是」和「否」來回答的。然而,可滿足性問題的這個特徵並不妨礙它成為一種通用方法。就像「20個問題」這種遊戲所展示的,任何信息都可以通過一系列「是—否」問題表達出來。任意一個邏輯問題(無論它提出的問題是什麼)都可以表達成一個或多個「是—否」問題。
比方說,我們想檢驗這一結論:一個吃豬排的人是有活力的。解題的第一步是把原來的15個前提轉換為可滿足性問題的形式。這些前提是相互一致的嗎?應當是,否則題就出錯了。第二步,我們把待檢驗的結論作為第16個命題添加進去。現在這個更新之後的命題集合中的各命題依然是相互一致的嗎?(這是第二個可滿足性問題。)如果是一致的,那麼這個新命題至少是被最初的前提允許的。
但這並不意味著,根據前提就可以有效地推出這個結論。你可以檢驗一下「月球是由綠奶酪構成的」這個命題,把它作為第16個命題,你會發現,整體也是可滿足的——當然是這樣。由於它對於邏輯學家、賭徒以及其他豬排問題中的胡言亂語隻字未提,所以它不可能導致任何一個矛盾。
為了確定一個假說是原來的前提所要求的,我們需要引入第三個可滿足性問題。把這個假說替換成它的否定形式,即它的負命題:「並非所有吃豬排的人都是有活力的。」把這個負命題作為第16個前提加進去,看看命題集合是否一致。
如果一個假說和它的負命題加進去之後都會不引起矛盾,那麼很明顯,這個假說與命題集無關的。「月球是由綠奶酪構成的」和「月球不是由綠奶酪構成的」這兩個命題都與豬排問題一致,所以二者都不能有效地推論出來。
如果一個假說與前提一致,但是它的負命題與前提不一致,那麼這個假說就是從前提出發可以推出的正確結論。(如果一個假說與前提不一致,但是它的負命題與前提一致,那麼這個負命題就是可以有效推出的。)[4]
可滿足性問題,就像所有的一般性問題一樣,有時很簡單。即使布爾變量和語句的數量極其巨大,問題也可能是簡單的。因為我們並不總是需要檢驗所有的可能性,有時甚至不需要檢驗大多數的可能性。許多命題經常可以通過連鎖推理連接起來。如果如此,那麼這般,並且如果這般,那麼如此……這種推理在梳理數量巨大的命題時極具威力。
連鎖推理中的每一個連接都可以表達為「如果……那麼……的形式,其中包含兩個未知的布爾值。如果一個可滿足性問題的每一個命題都恰好包含兩個布爾變量,此時問題是簡單的。解決這類問題有高效率的方法,比檢驗每一個可能的假說以發現符合要求者要快得多。
並不是所有的邏輯問題都如此簡單。當命題包含3個或更多未知的布爾值時,不存在明顯比排除法迅捷的通用解法。卡羅爾的豬排問題顯然很困難,因為該問題的前提涉及三到四個布爾變量(邏輯學家、吃豬排的人、丟錢的人等)。
電梯問題
一旦命題涉及三個未知量,問題難度便會上升——這種情況在「電梯問題」中表現得很明顯。
假設電梯中有6個人,則或者其中至少有三個人互相認識,或者至少有三個人互相都不認識。你能證明這總是正確的嗎?
這是正確的,但是難以用「邏輯方法」證明。關於「認識」和「不認識」的常識推理沒有任何用處。我們不能從「B認識C」推出「A認識B」,這道題沒說兩個人之間是否認識,它說的是三個人之間的關係。
此類電梯問題有很多版本。例如,在一次聚會上,有6個客人被錯誤地安排在一張桌上,其中有些人因為宿怨而互相不說話。已知任何三個客人都不構成兩兩互相說話的關係,證明存在三個客人,這三個人中誰與誰都不說話。另一個比較淫穢的版本這樣說:在大學宿舍裡任選6名住戶,則或者至少有三個人,其中任兩個人都在一起睡過,或者至少有三個人,其中任兩個人都沒在一起睡過。
電梯問題展示了一個被稱為「圖論」的數學分支。圖論(經常是隱蔽地)出現於許多問題中,娛樂性的問題和實際問題都有。最著名的問題之一就是「氣、水、電」問題,此題因亨利·歐內斯特·杜登尼的介紹而普及,杜登尼在19世紀與20世紀之交為報紙和雜誌寫謎題和謎語。這個問題的最初版本的答案是,答案不存在。把三個點和另外三個點連接起來,任意兩條線都不相交——這是不可能的。在一個此類的謎題正風靡時,沒有人太在意一個心地單純的讀者是否會在一個無解的問題上耗費幾個小時甚至幾天時間。當然,在上一章中華生和福爾摩斯給出的巧妙的解答不在此列!
圖論研究的不是表示股票市場的平均值或者年降雨量之類的圖。圖論所研究的圖是由點構成的網絡,點之間還有線相連,就像我們在機場見到的航班線路圖。線是直是彎無關緊要,點和點的相對位置也不重要。整個網絡結構中唯一重要的拓撲性質是——哪些點之間有線相連。所有這些點和線都非常正確,但是它們並沒有說明為什麼這種性質是重要或有用的。從更廣的意義上說,圖論是關於元素之間的關係或聯繫的研究。
電梯問題很容易轉換成圖。把6個人表示為點(如圖)。在任意兩點之間,我們可以畫一條線表示二者之間的關係。用黑線表示兩個人互相認識,用灰線表示兩個人互相不認識。三個人互相都認識表現為一個黑色三角形;三個人互相都不認識表現為一個灰色三角形;是否有可能在所有點之間畫線以保證黑色三角形和灰色三角形都不出現?
證明的過程很容易理解。從A開始。我們從A出發畫出5條線,分別代表這個人與電梯裡的另外5個人認識或不認識。無論如何,其中至少有3條線同色。這是因為,一共有5條線和2種顏色,最均勻的分配方案是一種顏色3條而另一種顏色2條,否則將有4條(甚至5條)線同色。
我們不知道,A是至少認識三個人(黑線),還是至少不認識三個人(灰線)。討論第一種可能性。假定三條黑線把A與C、D、E連接起來,那麼,在C、D、E之間,線的顏色如何呢?
如果C、D、E之間存在一條黑線,則產生一個全黑的三角形,也就是說,有三個人互相都認識。為了避免全黑的三角形出現,唯一的辦法是令C、D、E之間的線都是灰色的。但是這就產生了一個全灰的三角形,也就是說,有三個人互相都不認識。無論哪種情況,一定會出現三個互相都認識的人或者三個互相都不認識的人。
如果A不認識三個(或更多)人,推理過程類似,結論一樣,必然存在一個全黑的三角形或全灰的三角形。
這不是一個邏輯問題等價於一個幾何問題的唯一的例子。複雜性理論發現,許多不同類型的問題在解決程序上是相同的。
科學與謎題
一條謎語、一段密碼、一個拼板謎題——許多諸如此類的問題反映了科學方法的特點。通常,證實更像是解一道邏輯謎題,而非前幾章討論的歸納模式。一個簡單的概括陳述可以被任何相關的觀察結果證實或反駁,但是大多數科學理論則複雜得多,必須根據大量的觀察結果進行評價。我們甚至不能說某一個特定的觀察結果能單獨地提供證實或反駁。
請考慮「地球是圓的」這個假說。對這個假說的證實不在於彙集一大堆關於「圓的地球」的觀察結果(從宇航員的視角?),而且沒有反例。實際上,人們接受「地球是圓的」這個假說,是因為它聯繫並解釋了許多先前看來無意義的經驗事實。對於古代人來說,這些都是非常瑣碎而且沒有關聯的事實:在極北之地,午夜可以見到太陽;月食發生時可以見到圓形陰影;船隻離港遠去時看起來就像沉於波濤之下。現在所有這些現象,都被視為「地球是圓的」這一假說的邏輯推論。這一假說解釋了如此眾多各不相關的觀察結果,正是因為這樣,它才如此令人信服。假如事實上地球不是圓的,那麼只有不可思議的巧合才能使所有這些觀察結果如此協調地與這些假說一致。
這是一個更加精緻的證實類型,它混合了演繹和歸納。一個能推出邏輯結論的假說,首先必須解釋以往的觀察結果,然後必須做出新的預言。預言如果是真的,則證實假說。歸納和演繹的相互影響是某些悖論的根源,這些悖論甚至比我們討論過的悖論還要奇妙。
[1] 原文為「paradox of the Heap」,直譯應為「堆的悖論」,但是中國學者習慣稱之為「谷堆悖論」,所以此處譯為「谷堆」,儘管下面說的是「沙堆」而非「谷堆」。——譯者注
[2] 蒲式耳(Bushel),穀物計量單位。——譯者注
[3] 原著此處有瑕疵。在把原題中的語句翻譯為標準的邏輯命題時,作者犯了錯誤。正確的翻譯應當是:1. 本當且僅當(艾麗斯當且僅當並非艾麗斯);2. 本當且僅當並非查理;3. 查理當且僅當艾麗斯。有興趣的讀者可耐心推敲,亦可參考斯穆裡安的奇書《這本書叫什麼?》,此書已有漢譯本。原著的這個例子意在展示問題的表達形式的轉換,所以技術性的錯誤並不造成關鍵性影響。——譯者注
[4] 也許有些讀者想知道豬排問題的答案。答案是:「一個熱心的邏輯學家總是凌晨5點起床而且凌晨4點以前不睡覺。」