5.04.2012

包子和西瓜的語言問題


image via here
女的說:買十個包子,如果看到賣西瓜的,就買一個。結果男的買了一個包子回來,因為他有看到賣西瓜的。雖然標題是「邏輯問題」,不過確切說來,是語言因為省略簡約形成的指涉歧義問題:
1. 買十個包子,如果看到賣西瓜的,就買一個。
2. 買十個包子,如果看到賣西瓜的,就再買一個西瓜。
3. 買十個包子,如果看到賣西瓜的,就改成買一個包子。
就算不給定上下文脈絡,應該也很少有人會認為(1)的意思是(3)。原因很簡單:在沒有其它資訊的情況下,若不打算買西瓜,我們無法理解為什麼要僅僅因為有人在賣西瓜就少買九個包子。雖然日常生活的語義理解往往直接了當,但其中需要的背景常識和直覺推理常常出乎你的想像。

如果把和上述常識推理有關的線索拿掉,例如改成下面這樣,要做出判斷就比較困難:
1a. 下午體能活動伏地挺身100個,如果長官中午有進來督導,就打草。
2a. 下午體能活動伏地挺身100個,如果長官中午有進來督導,就接著打草。
3a. 下午體能活動伏地挺身100個,如果長官中午有進來督導,就改成打草。
(給沒當兵的人:打草就是拔草)
你不確定(1a)是什麼意思,因為你不確定那些指令跟長官進場有什麼關係。有可能長官很注意弟兄權益,因此是(3a),但也有可能長官根本不在乎你伏地挺身做到死,只關心草拔乾淨了沒,因此是(2a)。

最上面那張圖,來自畫新聞工作室的FB,從回應判斷,這個歧義的笑點受到許多學過程式語言的人共鳴。我想這可能是因為程式語言的語義完全被語法決定,非黑即白(再不然,就是直接「show error」不跑),沒有「基於背景常識的詮釋」可言,因此不管是多麼違背常理的行動規則,都會被完整執行。而若我們把(1)用某些程式語言暴力直譯,就會變成(3)。你可以參考我朋友陳大光寫的pseudo code。(什麼是pseudo code?

然而,不管是寫錯程式語言導致結果不如預期,還是會錯意最後被女朋友罵,其癥結都不太可能是邏輯,而是語義。決定最後買回來的是什麼東西的,是「買一個」到底指的是「買一個西瓜」還是「改成買一個包子」。不管是在日常生活中,還是在寫程式,你都很難基於邏輯錯誤把這兩個(或相關的編碼)搞混。然而,若你只是搞錯女朋友的意思,或者只是混淆了不同代碼代表的東西,你遇到的會是語義問題,不是邏輯問題。


(寫這篇文章時得到Johnny、大光、Bruce、黛西的朋友、Shi和Vincent的有用建議,感謝!)

5 則留言:

  1. 純粹想講:你的大頭貼看起來很吸引學弟。
    我聽到有小男生說過:我覺得阿尿在某方面比潔霜帥。

    回覆刪除
  2. //就算不給定上下文脈絡,應該也很少有人會認為(1)的意思是(3)。//
    還有一個因素:語法。原句「買一個包子」,包子是在賓語的位置,很難領下句。如果把它「主題化」(topicalize)成這樣:

    1' 包子買十個,如果看到賣西瓜的,就買一個。

    理解成(3)的可能就會增加了。

    回覆刪除
  3. 整篇文章意思很清楚,我也同意問題在語義不在邏輯,但是程式碼的部分...怪怪的...

    那段程式碼應該是撰寫者先把(1)的句型分析成(3)的語義,再用分析後的語義寫出,要說這段程式碼會把(1)的句型分析成(3)的語義,以主張「程式語言會把(1)的句型分析成(3)的語義」,似乎犯下了循環論證的錯誤。

    根據經驗,我相信常寫程式的人比較傾向把(1)解讀成(3)。然而即使X「寫程式的習慣」和Y「把(1)解讀成(3)的傾向」有正相關,卻未必有因果關係。Kris主張用「X造成Y」解釋,但我傾向用「Z造成Y及X」來解釋(有某種思維習慣的人會傾向把(1)解讀成(3),同時也會喜歡比較擅長寫程式)。

    還有吃十個包子和一個西瓜實在太恐怖啦!敝人吃一個包子就炸開了縮...(肚量狹小orz...

    回覆刪除
  4. Lin Jen-Shin (godfat):

    哈哈,難怪我就決得好像在哪看過那個梗!

    zhengzi、幻影S:

    我同意你們的看法。

    回覆刪除