宇宙的零成本分裂

非肯定性計算,就是科幻小說裏的平行宇宙。反過來講更合理一些。不過,以爲一上來就說非肯定性運算,頗有氣質……html

Murphis 手裏的紅藥丸與藍藥丸,Neo 選擇了前者。這是單個宇宙裏的計算。對於平行宇宙而言,當 Neo 選了紅藥丸的那一瞬間,宇宙分裂成了兩個,在另外一個宇宙裏,Neo 選了藍藥丸。git

在兩個宇宙裏的 Neo 選了不一樣顏色的藥丸以後,他們接下來還要作更多的選擇,就會致使宇宙不斷分裂。假若從 Neo 選擇藥丸的那一刻開始,結果會獲得一棵根深葉茂的宇宙樹。github

之前我說過,只要有選擇,這就意味着選擇者已經落入了一個已經編制好的程序裏了 [1]。既然是程序,那就得有運行結果,不然就是死循環。所以從根宇宙開始,向葉宇宙走,位於最長的路徑末端的葉宇宙是笑到最後的宇宙,它能夠做爲這個程序的運行結果。這個葉宇宙,就是咱們看過好幾遍的《黑客帝國》。segmentfault

這就是宇宙規模的非肯定性計算。函數

因爲我不相信我活在一個編制好的程序裏,因此平行宇宙就的話題就此爲止。不過,非肯定性計算倒是一個值得探究的話題。透徹地理解它,至少對於任何單機遊戲的通關有幫助。由於基於非肯定性運算,可以算出單機遊戲通關的全部路徑。有了這個技能,也能夠在街頭擺個攤,給那些認爲本身生活在一個單機遊戲裏的人算算命。code

爲了更爲直觀且精確地表現非肯定性計算,須要構造一個例子。先來看一個肯定性的計算過程:htm

if (Neo 選了紅藥丸)
  《黑客帝國》
else
  導演不拍了

這個計算過程是,假若 Neo 選了紅藥丸,咱們就有《黑客帝國》能夠看,不然導演無法拍,拍了也沒人看。遊戲

如今,咱們將計算過程倒過來,就是電影是必定要拍出來的,而後讓 Neo 按照這個要求去選藥丸:事件

if (Neo 從 (紅藥丸,藍藥丸) 做選擇)
  《黑客帝國》
else
  導演不拍了

這樣一來,對於 Neo 而言,他面臨的就是一個非肯定性計算的問題。他要解決這個問題,就只能讓宇宙去分裂……咱們不關心 Neo 如何選擇,只要他做出的選擇可以保證拍出《黑客帝國》這部電影便可。get

假若對續延 [2] 有所瞭解,如今想必在上述代碼中已經看到了續延:

if ([])
  《黑客帝國》
else
  導演不拍了

續延裏的洞是個黑洞。包含這種洞的代碼結構會掉進這個洞裏,再從洞裏掉出來一個值。因爲咱們要求必須得拍出《黑客帝國》這部電影,所以從這個洞裏掉出來的必須是《黑客帝國》。洞外之物決定了洞內的 Neo 的選擇。假若 Neo 選了藍藥丸,洞外之物決定了他的選擇會致使導演不拍了,因此 Neo 就試着再選擇紅藥丸,因而《黑客帝國》就拍出來了。

因此,黑洞未必真黑。外圍的世界徹底能夠決定黑洞裏面的事。爲了展示這一點,我須要用 Scheme 語言從新描述上述過程:

(if ([])
    《黑客帝國》
    導演不拍了)

接下來,看一下洞裏必須發生的事是什麼:

(if ((call/cc
      (lambda (cc)
        (if ((cc '藍藥丸) 《黑客帝國》)
            《黑客帝國》
            (cc '紅藥丸)) 
        )))
    《黑客帝國》
    導演不拍了)

在介紹陰陽謎題 [3] 的時候,已經說過了 call/cc 的做用,它能夠在表達式裏挖一個黑洞,再在這個黑洞里布置一個函數來處理掉入洞中的東西。

call/cc 佈置的黑洞裏,Neo 必須對藥丸們逐一進行選擇,而後看看續延的求值結果是否是《黑客帝國》。這裏因爲只有兩種選擇,因此,黑洞裏只須要用 if 語句就能夠涵蓋它們。

洞內發生的計算就是非肯定性計算。雖然它在形式上與一開始的肯定性計算沒有本質上的不一樣,可是它卻很好的模擬了「宇宙分裂」。不少人以爲隨便一我的選擇是吃米飯仍是吃麪條這種破事就讓宇宙分裂一次,成本過高了。如今看到了吧,有了續延,這種事基本上是零成本的。

續延不只下降了宇宙分裂的成本,並且它還能響應洞外的事件的變化。例如,如今要求 Neo 選擇藍藥丸才能拍出《黑客帝國》,上述代碼不用修改,依然可用。由於咱們一開始就已經假設了,無論洞內發生了什麼計算,反正得知足洞外的需求。

有了上述認識,接下來再去看 [4],可能就不那麼一頭霧水了。


[1] 紅藥丸,仍是藍藥丸
[2] 續延,有什麼難的……
[3] 三生萬物
[4] Scheme 裏的非肯定性運算

相關文章
相關標籤/搜索