λ 運算︰概念導引之《補充》※真假祇是個選擇??

200px-Cathédrale_d'Auch_20

約櫃

約櫃施恩座

義大利羅馬真理之口

聖經出埃及記25:10-22

約櫃
10 “他們要用皂莢木做一個櫃,長一百一十公分,寬六十六公分,高六十六公分。 11 你要用純金包櫃,內外都要包上;櫃上的四圍要做金邊。 12 你要鑄造四個金環,安放在櫃的四腳上,兩個環在這邊,兩個環在那邊。 13 你要用皂莢木做幾根櫃槓,並要用金包裹起來。 14 你要把櫃槓穿在櫃旁的環中,以便用槓抬櫃。 15 櫃槓要常留在櫃的環中,不可抽出環外。 16 你要把我賜給你的法版放在櫃裡。 17 你要用純金做施恩座,長一百一十公分,寬六十六公分。 18 你要用黃金錘成兩個基路伯,放在施恩座的兩端。 19 這端做個基路伯,那端做個基路伯,二基路伯要與施恩座連在一起製造,在施恩座的兩端。 20 二基路伯要在上面展開雙翼,遮掩施恩座,基路伯的臉要彼此相對,他們的臉要朝著施恩座。 21 你要把施恩座安放在櫃頂,又要把我賜給你的法版放在櫃裡。 22 我要在那裡和你相會,也要從施恩座上面,從二基路伯之間,告訴你一切我命令你傳給以色列人的事。

作者不知義大利羅馬的『真理之口』將會如何來決定『何謂是真?』而『什麼又是假』的呢??

又為什麼『』與『』的 λ表達式是

TRUE =_{df} (\lambda  x. ( \lambda y. x))
FALSE =_{df} (\lambda  x .( \lambda y. y))

的呢?如果我們將『運算』看成『黑箱』,用『實驗』的方法來『研究』輸入輸出的『關係』,這一組有兩個輸入端的黑箱,對於任意的輸入『二元組』pair  (u, v),有︰

(((\lambda x. ( \lambda y. x)) u) v) = u
(((\lambda x. ( \lambda y. y)) u) v) = v

,於是將結論歸結成︰貼『』標籤的箱子的『作用』是『選擇』輸入的『第一項』將之輸出;而貼『』標籤的箱子的『作用』是『選擇』輸入的『第二項』將之輸出。

假使一位『軟體』工程師在函式『除錯』時,可能會採取在那個『函式』內『輸出』看看得到的『輸入』參數值是否正確?

於是將結論歸結成︰』標識符的函式『作用』是『選擇』輸入參數的『第一項』;『』標識符的函式『作用』是『選擇』輸入參數的『第二項』。

那麼對一個已經打開的『白箱』,又知道作用的『函式』,怎麼會概念上『一頭霧水』的呢??如果細思一個邱奇自然數『 0 』, 0 =_{df} (\lambda f. ( \lambda x. x)),這跟『』的 λ表達式有什麼不一樣的呢?那難道我們能說『0』就是『』的嗎?在《布林代數》中的『0』與『1』其實是未定義的『兩態』基元概念── 就像歐式幾何學裡的『』、『』和『』是『基本』概念一樣 ──,因此不管說它是『電壓高低』或者講它是『電流有無』的『數位設計』可以應用布林代數。要是我們將『0』『1』與『』『』概念連繫起來看,『布林邏輯』就是『真假』是什麼的『系統化』之概念內涵開展,它的『整體內容』呈現『兩態邏輯』的『方方面面』,縱使至於『孤虛』NAND 一個邏輯概念就足夠了,對於『 0 與 1 』概念本身還是『三緘其口』。

其實『 λ表達式』建構上表徵『函式』── 假使代表某種『概念』──的『子函式組織』以及『子函式應用』之『結構』。而這個所謂的『結構』只是在『 λ語言』的『語法』上『呈現』的,所以想要如何『語意詮釋』呢?也許天下《一指》可知,萬物《一馬》可比的吧!!

LC選項設定

LC字典初始內容

現在就讓我們用 Lambda Calculator 探究一下 λ 運算的『真假邏輯』化約。首先將『選項』設定如下︰

一、選擇『正規求值』Normal Evaluation
二、選擇『帶數目的純 λ 運算』Pure Calculus With Numerals
三、不選『使用 \eta 變換』Use Eta Reductions
參見左上圖。

為什麼不使用 \eta 變換的呢?比方考慮下面的函式化約

(\lambda p. ( \lambda x. ( \lambda y. ((p x) y))))
\equiv_{\eta} (\lambda p. ( \lambda x. (p x)))
\equiv_{\eta} (\lambda p.  p)

,這並不是我們對這個『三元p, x., y 函式的概念想法,它表達的是『有一個變元 p,應用於變元 x 後,將它的結果 (p x) 再次應用於變元 y 之上 ((p x) y)』。然而由於 ( \lambda y. ((p x) y)) 中的 (p x) 表達式裡並沒有 y 變元,所以就被『 \eta 變換』的了,再次經過『 \eta 變換』後,最終變成了 (\lambda p. p) 的『恆等函式』了,這也是為什麼『 \eta 變換』會有爭議的原由之一。由於 Lambda Calculator 軟體支持一般『去除減少括號』以便於『書寫』與『閱讀』的『左向優先結合』和『最大函式跨距』之『函式應用約定』,因此上式就可以改寫成︰

\lambda p. \lambda x. \lambda y. p \ x \ y

,當你輸入帶有括號的『 λ表達式』它會將之『去除掉不必要』的括號『簡化』,可以見之於上圖的『字典Show Text 的內容︰

FALSE [(\x.(\y.y))] = \x.\y.y
IFTHENELSE [(\p. ( \x. ( \y. ((p x) y))))] = \p.\x.\y.p x y
ISZERO [(\n. ((n (\x.FALSE)) TRUE))] = \n.n (\x.FALSE) TRUE
TRUE [(\x.(\y.x))] = \x.\y.x

,它的『格式』是《『標識符』【定義輸入】=『簡化』》。

ISZERO-0
圖一

ISZERO-1
圖二

ISZERO-0
圖三

ISZERO-1
圖四

IFTHENELSE-TRUE
圖五

IFTHENELSE-FALSE
圖六

IFTHENELSE-ISZERO
圖七

現在讓我們先將上述的定義輸入字典。其中『是零嗎』ISZERO 是一個『是或不是』的邏輯判斷,一般稱作『謂語』或叫『述詞』Predicate ︰

\lambda n. n (\lambda x.  FALSE) TRUE

,左圖一是邱奇自然數 0 的推導︰ISZERO \  (\lambda f. (\lambda x. x))
1\equiv_{\beta} ISZERO \ FALSE
2\equiv_{\beta} FALSE \ (\lambda x.  \ FALSE) \ TRUE
3\equiv_{\beta}  (\lambda y.  \ y) \ TRUE
4\equiv_{\beta}  TRUE

由於『 0 』和『』的結構相同,所以『第一步』中它被替換成了『FALSE』。『第二步』展開『ISZERO』的標識符,將變元 n 賦與了『FALSE 0』的值。『第三步』展開(FALSE  (\lambda x.  FALSE) ),最左邊的 FALSE 之變元 x 被賦與 \lambda x. FALSE 的值然後將之拋棄,最後只剩下了 \lambda y. y。最後『第四步』變元 y 得到了『』。

左圖二是邱奇自然數 1 的推導,如果用 Lambda Calculator  選擇『純 λ 運算』的選項,顯示為︰

ISZERO (λf.λx.f x)
⇒ (λf.λx.f x) (λx.FALSE) TRUE
⇒ (λx.(λi0.FALSE) x) TRUE
⇒ (λx.FALSE) TRUE
⇒ FALSE

左圖三和左圖四是用 Lambda Calculator 中定義的『自然數』來作相同的推導,讀者可以自行參考。

當然『IFTHENELSE』就是程式語言中的︰

如果 p 為真,執行 x,否則就執行 y

,左圖中的五、六、七是它使用的例子。

那我們能從它的『定義
IFTHENELSE =_{df} \lambda p. \lambda x. \lambda y. p \ x \ y
看出是『這個意義』的嗎?

因此才說 λ 運算的『函式』是由『抽象』得來,λ 表達所建構的『結構』也是『抽象』的,所以不同的『概念系統』彼此『抽象化』後的『結構』可以『相同』。

如果從程式語言的『使用觀點』考慮上圖七的

IFTHENELSE (ISZERO 0) (+ 2 3) (+ 4 5)

,如果我們知道『IFTHENELSE』的『語法』定義與『功能』,那麼一個『合語法』的『表達陳述』自然得到它所定義的運算結果『(+ 2 3)』,至於運算的『化約過程』在『語用』的角度上看成了『黑箱』,通常只有在『結果』不如『預期』時,或許你自己就是那『語言』的『創始者』,才會觀察『運算過程』,試圖發現各個『定義』所構成之『系統』內部的『相容性』和『一致性』之問題的吧!!

就讓我們用 Lambda Calculator 之『純 λ 運算』,寫個『孤虛』NAND 邏輯,推算到底『牛郎織女』是『相會的成』還是『相會不成』的呢??

下面是『孤虛語』的『字典定義』︰

[\p. \q. p q 假] = \p.\q.p q 假
[\x. \y. y] = \x.\y.y
孤虛 [\u. \v. 非 ( 且 u v )] = \u.\v.u v 假 假 真
[\p. \q. p 真 q] = \p.\q.p 真 q
有數 [\f. \x. (f x)] = \f.\x.f x
沒嗎? [\n. n (\x. 假) 真] = \n.n (\x.假) 真
[\x. \y. x] = \x.\y.x
若則否則 [\p. \x. \y. p x y] = \p.\x.\y.p x y
[\p. p 假 真] = \p.p 假 真

已知『且 (孤虛 假 假) (孤虛 真 真) 』為『』,那麼

若則否則  (且 (孤虛 假 (非 假) ) (孤虛 真 (非 真) ))  (沒嗎? 假) (沒嗎? 有數) 』是『』還是『不成』的呢??

金剛石

人造金剛石

金剛經

佛告須菩提,凡所有相,皆是虛妄,若見諸相非相,則見如來。

 

也許『不變的愛』 ( λ 之. (不變的愛  之)) 只能是一個『行為的純函式』,她不製造任何的『副作用』。對於『之人』『之物』的『初衷』不變,次次回回保有『愛之初心』,不會生此一時,彼一地的『妄念』,或可至之於『終身』,方可許諾能『永恆』!!

 

λ 運算︰概念導引《四》

濮陽西水坡蚌殼龍虎圖

古人用蚌殼擺塑出了一幅天文星圖,其年代约為距今6500年

凌家灘玉版

良渚文化玉琮

曾侯乙墓二十八宿漆箱五面圖象

新石器時代仰韶文化中期,一個六千五百年前『濮陽西水坡』的墓穴,裡頭有一幅用『蚌殼』堆出的『龍虎圖』,刻意擺放的骸骨方位,到底在說著些什麼呢?中國的天文考古學家馮時先生認為︰

文本引自鄭杭生胡翼鵬先生所寫的論文《天道左旋,天圆地方:社會運行的溯源和依據

對這組蚌殼龍虎圖案解說最深入的研究者是天文考古學家馮時。馮時認為,解釋這幅蚌塑龍虎圖案的關鍵是墓主人脚下、正北面的那個蚌塑梯形與人體脛骨组成的圖案:這是一個北斗的造型,蚌塑梯形表示斗魁,東側横置的兩根脛骨表示斗杓,所以這是一個構造十分完整的二象北斗天象圖。

蚌塑梯形與脛骨構成的北斗圖象,不儘是從形狀上認證,更主要的是從表示斗杓的兩根人體脛骨去尋找線索。古代計算時間的一種方法,是通過對人體影子長短變化的測量,所以最初的測影工具是模仿人體来設計的,這就是“”。正是因為人體、表與時間具有這種特殊關係,所以古人把計量時間的表叫作“”,而“髀”的本 義是人體的腿骨,從大量的史料文獻中可以找到證據,古代測量日影的工具“表”就是由人骨轉變而來,所以人骨在作為一個生物體的同時,在古代還曾充當過測定日影的工具。濮陽西水坡45號墓中的北斗圖,把腿骨、表和時間這三個方面聯繫起来,體現了古人通過立表測影和觀測北斗來測定時間這兩種方法的結合。在這個蚌殼梯形與脛骨的構圖中,脛骨的意義就是表示測定時間的工具。而北斗星也是古代中國人觀望天象,以此作為决定時間的標準星象。所以以脛骨作為這個構圖的長 柄,結合整個構圖,可以認定蚌殼梯形與脛骨構成的圖案就是北斗星。確定了北斗星,再聯繫整個圖象的布局和造型,那麼這副蚌殼擺塑的龍和虎就只能作為星象來解釋,這樣本來孤立的龍虎圖由于北斗的存在而被自然地聯繫成了整體,成為天上的星宿和星象,即四象中的蒼龍白虎。而那個制式奇特的墓穴,其形狀實際呈現了最原始的蓋天圖式,下半部的方形是大地,上半部的圓形是天穹,實則蕴藏著最原始的“天圓地方”觀念。

這個只有蚌殼作為随葬物品的墓穴中, 竟然隱藏著“天”的秘密,陪葬墓主人的居然是整個天上的星斗。而那個北斗星的斗魁用貝殼,表明斗魁在天、在上;斗柄用人的腿骨,表明斗柄指地、在下。在 天、在上,為、為;在地、在下,為、為。它實際反映著古人頂天立地的幻想,所體現的是蒼天與大地的配合或聯繫,是神、鬼、人的相互交往。 而且 6500 年前的古人對天象有如此精細的認識,說明他們的生活時時刻刻離不開對天象的觀察,不僅僅是觀象授時的實用層面上的應用,而如此虔誠的模擬,更說明他們的思想觀念和行為活動都受著“天”的無形制約。

在《馬太福音 25:29;》一文中,我們談到了『北極星』的不動與『太陽』之視運動,遠古之人就從觀察實踐中得出了『天圓地方』的『理念』,以及『天左旋,地右動』的『道理』。人們因著『觀測』天地事物,而能建立『理論』;追究『概念』的『緣由』以及『理則』之『依據』,所以創發『哲學』。因此在生活學習的道路上,其實是『事無古今,理無中外』,彼此『同異之間』的『匯通處』往往就是『基元』的『觀念』;『基元觀念』的不同『詮釋』成為相異的『學說體系』。事實上『字串改寫系統』、『圖靈機』與『 λ 運算』,說著『□□』的不同『側寫』,彼此之間可以用『○○』來對應『轉譯』,人們或說『』或講『』的各種『詮釋』就祇在其人的了!!

假使說給定了一個『 λ表達式(\lambda x. ((\lambda y. (x \ y)) \ \Box)  \ \bigcirc),有人『第一步』這樣作『 \beta 化約』︰

((\lambda y. ( \bigcirc \ y))  \ \Box )

,也有人『第一步』這樣作『 \beta 化約』︰

(\lambda x. ( (x \ \Box )   \ \bigcirc)

,這樣不同的『步驟選擇』是否會產生『不同結果』的呢?如果說再次繼續進行『 \beta 化約』,兩者都會得到︰

(\bigcirc \ \Box )

,於是我們就可以歸結的說『 \beta 化約』不管是用著怎麽樣的『步驟次序』,都一定能夠得到『相同結果』的嗎??

為了考察不同次序步驟的『化約策略』,首先讓我們定義『單步 \beta 化約』︰

A \equiv_{\beta^1}  B

是指表達式 B 是經由表達式 A 中的某一函式應用子表達式 C =_{df} ((\lambda x. M) N)\beta 化約』而得來。假使『約定』零步 \beta 化約是說 『A \equiv_{\beta^0}  A』,這樣我們就可以說『單步』或『多次單步』之『單步 \beta 化約』的『化約封閉性』︰

U \equiv_{\beta^*}  V

,是講存在一個『單步 \beta 化約』的『序列

U =_{df} S_1, S_2, S_3, \cdots, S_k, S_{k+1}, \cdots, S_n =_{df} V, \ S_k \equiv_{\beta^1} S_{k+1}, k=1\cdots n

。某一表達式 U 我們稱它是『 \beta 可化約\beta-redex 是指這個表達式還有『未化約』的子應用表達式 ((\lambda x. M) N) 。如果經過『有限的』化約序列,最終抵達一個『沒有未化約』的表達式 V,也就是說 V 中沒有 \beta-redex,這時我們將 V 稱之為『 \beta 正規元型』normal form。於是我們就可以問︰

各種不同的『化約序列』如果存在『 \beta 正規元型』,那它們是相同的嗎?

Church-Rosser 定理】說

如果 P \equiv_{\beta^*} Q 而且 P \equiv_{\beta^*} R;那麼就會存在一個 S, 使得 Q \equiv_{\beta^*} S 以及 R \equiv_{\beta^*} S

所以可以講不同的『化約序列』之『 \beta 正規元型』,除了其內函式中的『受約束變元』之『虛名』不同外 ── 可以作『 \alpha 變換』使之一樣 ──,都是『相同的』。這是一個非常重要的歸結,設想萬一它不是這樣,那所謂的『計算』不就成『笑話』了嗎!然而需要小心的是『 \beta 化約』是『單行道』,也就是說 A \equiv_{\beta} B 成立,並不代表 B \equiv_{\beta} A 正確。比方講 ((\lambda x. x) a) \equiv_{\beta} a,從結果變元 a 又要怎麼得回原來函式應用的呢?

那麼『 \beta 化約策略』Reduction Strategy 又是什麼呢?它是一個『函式RS,可以定義如下︰

一、『定義域』與『對應域』是『所有的 λ 表達式』構成的集合

二、如果 e 是一個『 \beta 正規元型』,RS(e) = e

三、假使 m 不是『 \beta 正規元型』,化約策略會依據特定方式選擇 m 中的某一『優先\beta-redex 子表達項 tRS(m) = t

這樣看來 RS 函式選擇了特定的『步驟次序』── 策略 ── 來作『單步 \beta 化約』,這也是『程式』之『最佳化』optimize 的源起。然而不是每種『化約策略』都能夠抵達存在的『 \beta 正規元型』。舉例說兩種簡單的『』和『』化約策略,它總是優先選擇表達式中的『最左』與『最右\beta-redex 子表達項 。

TIW

考慮用『左右』策略化約下面的表達式

(((\lambda x. (\lambda y. x)) (\lambda z. z)) (\lambda w. (w w)))

用『』策略會得到『上圖』,用『』策略會卡在 (\lambda w. (w w))

所謂的『正規策略』是說用這個策略能夠得到『所有可能存在的\beta 正規元型事實上從邏輯推理可以證明『最左優先』策略是一種『正則策略』,果真是『天左旋』的乎!!

最後讓我們談談『』的概念以及『等號 =』的使用,相等和『邏輯推導規則』有關︰

一、 \frac{}{X = X},無條件自反律

二、 \frac{X = Y}{Y = X}對稱律

三、 \frac{X = Y \wedge Y = Z}{X = Z}遷移律

此處的 \frac{Premises}{Conclusion} 是講,如果由『前提』Premises,我們可以邏輯上推導出『結論』Conclusion。也就是說這是廣義的『相等』關係的『內涵』。

此處雖然並不定義『 λ 運算』中所謂的『等式』到底是指什麼?只是從『基元』觀點下,就是說假設我們基本『知道』或者『同意』兩個表達式『A = B』所指的意義── 比方說指相同的計算結果 ──,於是我們可以提出下面的『 λ 理論』︰

一、 \frac{M = N}{(A M) = (A N)},『應用』於『等式』之『結果』相等

二、 \frac{M = N}{(M A) = (N A)},『等式』之『函式』的『應用』相等

三、 \frac{M = N}{(\lambda x. M) = (\lambda x.N)},『等式』之『函式抽象』相等

四、 \frac{}{((\lambda x. M) A) = M[x := A]},『應用』是無條件的『化約相等

五、 \eta 擴張, \frac{}{(\lambda x. (M x))  = M},『外延』相同的『函式』相等

漣漪

干涉

 

簡單的將『變元』、『函式』和『應用』結構起來形成的『 λ 運算』,彷彿是『概念』的『水滴』墜落『心湖』,激起『思想』的『浪花』。這些『浪花』彼此『碰撞』,掀起陣陣『漣漪』,最後『波光』點點,早就分不清哪兒是『始點』,哪兒又是『終點』!!

 

λ 運算︰概念導引之《補充》※登堂嚐鮮

工匠祖師爺

鲁班锁

曲尺

古代傘

禮記‧檀弓下

季康子之母死,公輸若方小,斂,般請以機封,將從之,公肩假曰:『不可!夫魯有初,公室視豐碑,三家視桓楹。般,爾以人之母嘗巧,則豈不得以?其母以嘗巧者乎?則病者乎?噫!』弗果從。

魯班的姓名古籍上載有公輸班、公輸盤及公輸般等等,是春秋末年的著名工匠,被後世尊為中國工匠祖師爺。傳聞魯班出生於魯國之世家『公輸』大家族,所以後來多以『魯國之班』稱之,因此成為『魯班』。歷史流傳著許多魯班所設計的『工具』與建造之『法規』,尤其他對『建築』和『木工』等行業具有巨大貢獻。

《墨子‧天志上》中說:輪匠執其規矩,以度天下之方圓。

這個『』就是『畫圓』的『圓規』。而這個『』就是『畫方』的『曲尺』。傳說曲尺是魯班所發明的,後世稱之為『魯班尺』。《事林廣記‧引集》卷六中講『魯班尺法』:其尺也,以官尺一尺二寸為準,均分為八寸,其文曰、曰、曰、曰、曰、曰、曰、曰;乃主北斗中七星與主輔星。用尺之法從財字量起,雖一丈、十丈不論,但於丈尺之內量取吉寸用之;遇吉星則吉,遇凶星則凶。恆古及今,公私造作,大小方直,皆本乎是。作門尤宜仔細。又有以官尺一尺一寸而分作長短寸者,或改吉字為本字者,其餘並同。

傳聞又說『魯班之妻』也是位出色的工匠,因為疼惜魯班經常得在戶外『風雨烈日』下工作,發明了『』── 行動『』子 ── ,使他能有個『驅避之所』。

在《加百利之號角!!》一文中,我們談過『學習工具箱』的重要性。俗話說︰工欲善其事,必先利其器,在此介紹一個可以放進工具箱裡收集的 JavaScript 的『 λ 計算器Lambda Calculator。這個軟體是美國 Hendrix 大學計算機科學教授 Carl Burch 所寫,目的是提供『學習』和『實驗』λ 運算的有用之『工具』,它包含了『應用』與『純粹』λ語言等等的『客製化』選項。

LambdaCalculator
圖一

LC關於
圖二

LC選項化約過程
圖三

LC基本用法
圖四

lcex1lcex2
圖五

LC字典定義
圖六

LC字典
圖七

LC字典用法
圖八

左圖一是剛進網頁時的主畫面。其中『LC簡介1』是存放『 λ 表達式』的『字典』;『LC簡介2』是客製化『選項』;『LC簡介3』是軟體線上『使用說明』。一般的操作是由『 λ 表達式輸入列LC簡介4』,以及『執行 LC簡介5』與『清空輸入列 LC簡介6』所完成的。它之『主要』選項預設的是︰

☆應用 λ語言
☆使用 \eta 變換

此處我們先用《之前》的例子

((\lambda z. (( \lambda y. y + 1) (( \lambda x. x^2)z)))3)

,給個用法之說明︰一、語法上『 λ 』用『 \ 』符號表示;二、使用『前綴的』四則運算函式。所以上式應當改成

((\ z. (( \y. (+ y 1)) (( \x. (* x x))z)))3)

。左圖五是輸入後執行的結果,通常不會顯示『運算過程』,只看得到圖五中的『上半部』;有一個 Show … Intermediate Steps 的按鍵,它可以用來顯示其間的『化約過程』,可見之於圖五中的『下半部』。如果我們從『數學』上因何定義一個『函數』的觀點來看,人們對一個函數的『興趣』,並不祇在『求值』而已,往往會包含它之『性質』的研究。要是自『程式』計算的角度來講,一般之所以會定義某個『函式』,也不會是僅為『一次』的使用,而是因為它『經常』被用到。為了能夠既『簡潔』又『容易』的建立『複雜』之表達式,這個軟體它提供了『 λ表達式』定義的引用『字典』,於是你可以將『常用』的表達式『命名縮寫』成為『標識符號』。比方說如何將上面的函數
(\ z. (( \y. (+ y 1)) (( \x. (* x x))z)))
命名為『MyFun』。如果你曾經注意到任何的『表達式』輸入後,假使按下『執行』鍵,畫面會出現『加入字典 LC簡介7』選項,這時你只需要將『MyFun 的命名』打入它的『輸入列』,然後按下『加入字典圖像 LC簡介8』就可以了,參見左圖六。

現在讓我們利用 MyFun 輸入下式︰

(/ (* (- (+ (MyFun 5) (MyFun 5)) (MyFun 5)) (MyFun 5)) (MyFun 5))

,對任何一個非零的數 a 來說, \frac {((a + a) - a) \times a}  {a} = a,所以上式的答案應該是『 (MyFun 5) = 26』。難道不該是這樣嗎?『確定的函式』與『相同的輸入』不是該產生『一樣的結果』的嗎?比方說一個傳回『當下時間』的函式『 date 』,你每次調用它的結果不會是相同的吧!在計算機科學中把 date  這類的函式稱為有『副作用』Side effect 的,然而並不是說有『副作用』就是『不好的』,date 函式的目的就是『那個副作用』。但是『副作用』有時又是『問題』的由來,設想出於不明的原因如果很多次『呼叫』call 『MyFun 5』後的傳回結果是『5, 6, 7, 8, …』,那麼上式的答案自然不一樣了,此時想要『除錯』可就『麻煩』的了!

那麼函式的『副作用』又是怎麼發生的呢? 設想用 x 變元代表『鍵盤輸入的數值』,這個表達式 ( MyFun \  x) 就是計算此時『 x 』的函數值。但是不管輸入是什麼樣的數,輸出又是怎麼樣的值,這個『表達式』都是『不變的』。也就是說因為 x 變元的值『』了,所以 ( MyFun \  x) 也就跟著『』了。然而所謂的『 x 變元之值』又指的是什麼呢?變元『記得』當下的『之值』,直到被『賦與』Assign 『新值』,從『圖靈機』的觀點來講,變元就是機器之『內部』與『外部』系統當下的『狀態』。假使說『純函式』Pure Function 是指函式在『相同的輸入』下,一定產生『一樣的結果』,那麼該函式必然是『沒副作用』的函式,而且『所有的變元』的狀態,在函式呼叫『前後』都該是一樣的。因此我們可以說 ( MyFun \  x) 是『純函式』,因為只要 x 變元的值是一樣的,計算結果就是相同的,而且計算過程中 MyFun 並不會更改 x 變元的狀態。『泛函式』functional 程式設計的『典範』paradigm 主要強調在於『純函式』的重要性,或許也是事出有因的啊!!

 

λ 運算︰概念導引《三》

Y

python-lambda-calculus-module-01

Lambda Animator

黃帝內經‧素問

黃帝坐明堂,始正天綱,臨觀八極,考建五常,請天師而問之曰:論言天地之動靜,神明為之紀,陰陽之升降,寒暑彰其兆。余聞五運之數於夫子,夫子之所言,正五氣之各主歲爾,首甲定運,余因論之。鬼臾區曰:土主甲己,金主乙庚,水主丙辛,木主丁壬,火主戊癸。子午之上,少陰主之。丑未之上,太陰主之。寅申之上, 少陽主之。卯酉之上,陽明主之。辰戌之上,太陽主之。巳亥之上,厥陰主之。不合陰陽,其故何也。歧伯曰:是明道也,此天地之陰陽也。夫數之可數者,人中之陰陽也,然所合數之可得者也。夫陰陽者,數之可十,推之可百,數之可千,推之可萬。天地陰陽者,不以數推以象之謂也。

金文素

金文學

禮記‧學記

善學者,師逸而功倍,又從而庸之;不善學者,師勤而功半,又從而怨之。善問者,如攻堅木,先其易者,後其節目,及其久也,相說以解;不善問者反此。善待問者,如撞鐘,叩之以小者則小鳴,叩之以大者則大鳴,待其從容,然後盡其聲;不善答問者反此。此皆進學之道也。

在《測不準原理》一文中,提到揚‧武卡謝維奇的『波蘭表示法』,它是一種四則運算的『前綴表示法』prefix。如果我們此處再將『 λ表達式』 視履考祥一番,由於一切都是以『函式』為中心,因此『二元運算』Binary operation  也將是用著『函式』來表達。因為『應用化約』的語法形式是『 ( M 視為函式  N 看作變元)』,如此的方式一般就會是用『前綴法』的了。比方說用著 ((ADD  a)  b) 表示二元運算函數 ADD (x, y) = x + y 的求值計算。然而一個  λ表達式並沒有規定它的文本長度,所以如果用著定義『標示符』identifier 來『表現』λ表達式,這就更像是在寫『 λ語言的程式』了。

於此再度回顧一下變元的『替換規則』的定義︰

E[x := M] 是指 E表達式』中所有『自由出現』的『 x 變元』,都使用 M表達項』來取代我們可以歸納的定義如下︰

x, y 是所指 E 表達式的任意變元
A, B. M, 是所指 E 表達式的任意構成項── 該式在建構過程中的各個合乎語法的子表達式 ──。

一、 x[x := M] \equiv M

二、 y[x := M] \equiv y,只要 y 變元不是 x 變元

三、 (A B)[x := M] \equiv (A[x := M] B[x := M])

四、 (\lambda x. A) [x := M] \equiv (\lambda x. A)

五、 (\lambda y. A) [x := M] \equiv (\lambda y. A[x := M] ),只要 y 變元不是 x 變元

假使有一個簡單的函式 (\lambda x. E),它不包含著其它『子函式』以及『函式應用』,當我們說『(\lambda x. E) \equiv_{\alpha} (\lambda y. E^{\alpha})』是指 E^{\alpha} 是由上面的變元『替換規則』從 E[x := y]  得到的。這時我們講 (\lambda y. E^{\alpha}) 是經由『\alpha 變換』從 (\lambda x. E) 變更『受約束變元 x』成為 『受約束變元 y』而得來。為什麼那一邊說著『自由的』,這一邊又講著『受約束』?是因為 E 表達式中 x 變元是『自由的』,『抽象封裝』成為『函式(\lambda x. E),這時那個  x 變元就成『受約束』的了。其次為何要先『限定簡單』的函式呢?如果看一看 (\lambda x. (y x)) 的表達式, 那麼我們又要如何替換它呢?人們之所以需要『重新命名』受約束變元,是因為『應用化約』可能產生的『命名衝突』,或許『直覺』上講又怎麽會去用了『\alpha 變換』以後,卻反而又製造了『新的衝突』的呢?因此與其將它『一碼歸一碼』的煩雜分解的說,不如就建立某些『不成文的規矩』,每當提到受約束的變元『重新命名』時,就是說使用從來『不曾出現』或者說『不起衝突』的新的變元名字的意思!這樣不管再複雜的表達式都可以用著『\alpha 變換』『一步一步』的『系統化』轉換成另一個同等的表達式,於是我們可以說︰

M \equiv_{\alpha} N

。再者,與『函式所約束之虛名變元』無關的『自由變元』一般都來自於『函式應用』 ── 比方 ((\lambda x. M) y) 的『輸入項y 變元 ──,通常除非為了表達清晰起見,人們不會『重新命名』輸入項。如果從『程式計算』的角度講,『計算資料』是程式外部來的,在程式裡當然要叫它什麼名字都可以。於是那個『系統化』的『更名』辦法,自然可以行使於任何『函式』或者『應用』的『子函式表達項』中,也許就不會再有『表達轉換』作法上彼此之歧見的了!!

假使再次細思『 λ 表達式』的歸納定義,最簡單的表達式『始於變元』,然後方在其上建立『函式』,之後才『應用』函式於『變元』之上。因此前面說的那個簡單的函式 (\lambda x. E) 的可能構成是極其有限的,比方說 E 中只能有一個變元,假使 E 有兩個以上的變元,那一定是由『函式應用』或者『多元函式』所產生的。所以它只可能像是 (\lambda x. x) 或者 (\lambda x. y) 這樣。也許有人會想難道它不能是像 (\lambda x. \ 2\times x) 或者 (\lambda x.  + x \ y) 的嗎?在某些『應用 λ語言』中,這種語法是合宜的;然而這裡用的卻是『純粹』Pure 的 λ語法,這個『語法集』中根本沒有『什麼是 \times+』,因此表達所需要用的一切都得在『基元』Primitive 上自己建立。複雜』與『難題』是兩種不同的『困難性』。許多『難題』表述起來很簡單── 比方說費瑪最後定理x^n + y^n = z^n, n \geq 3 沒有整數解 ──,想解決卻十分困難。而『複雜』是源於構成『部份』眾多或者『結構』縱橫多層,雖然基本『單元』並不『困難』,基礎結構『組件』也很『簡單』,由於『數大層多就是難』這就是 λ 表達式的『寫照』。這個『複雜性』或許也就是『 λ 語法』之所以『方言』崛起的緣故。

終於我們可以無歧義的說

((\lambda x. M) N) \equiv_{\beta} M[x :=N] \equiv_{\beta} M^{\beta}

,是講 M^{\beta} 是函式『 \beta 化約』的結果,它是由系統化的變元之替換規則所得來。簡約的講那些 N 中原有的『自由變元』在 M^{\beta} 裡依然還是『自由變元』,不會變成『受約束變元』。假使說函式用『抽象封裝』 λ表達式,函式應用『解封函式』產生『結果』的 λ表達式。然而從『字串改寫系統』來看,不管是『 \alpha 變換』或者是『 \beta 化約』都不過是一種字串的『改寫規則』,是將那一個『 λ表達式』的字串改寫成『同等計算』之這一個『 λ表達式』而已!!

現在讓我們談談『 \eta 變換』。假設 M 函式中沒有 x 變元,那麼 (\lambda x. (M x))M 除了『文本』不同,『計算結果』上能有什麼不同的嗎?對任何的輸入變元 z 來講,

((\lambda x. (M x)) z) \equiv_{\beta} (M z)

,這樣從函式的『對應域』或者說『值域』的考察『觀點』,就是『 \eta 變換』的由來,寫作︰

(\lambda x. (M x))  \equiv_{\eta} M

。然而這個『 \eta 擴張』卻有些『哲學上』的爭議,人們對於什麼是『函式等同』的定義與看法並不相同。比方講假設說『』是種『行為』函式,『』或『不愛』的結果取決於『』;那麼『愛物之心』與『』兩者是否會有差異呢?(λ物. (愛 物)) \equiv 愛 嗎??

 

─── 待續…… ───

 

λ 運算︰概念導引之《補充》※有名的組合子!!

墨子跂礄

裘褐为衣
跂礄為服

雲梯

墨子破雲梯

墨子‧公輸篇

公輸盤為楚造雲梯之械,成,將以攻宋。子墨子聞之,起於齊,行十日十夜而至於郢,見公輸盤。公輸盤曰:『夫子何命焉為?』子墨子曰:『北方有侮臣,願藉子殺之。』公輸盤不悅。子墨子曰:『請獻十金。』公輸盤曰:『吾義固不殺人。』子墨子起,再拜曰:『請說之。吾從北方,聞子為梯,將以攻宋。宋何罪之有?荊國有余於地,而不足於民。殺所不足,而爭所有余,不可謂智;宋無罪而攻之,不可謂仁。知而不爭,不可謂忠。爭而不得,不可謂強。義不殺少而殺眾,不可謂知類。』公輸盤服。子墨子曰:『然,胡不已乎?』公輸盤曰:『不可,吾既已言之王矣。』子墨子曰:『胡不見我於王?』公輸盤曰:『諾。』

子墨子見王,曰:『今有人於此,舍其文軒,鄰有敝輿而欲竊之;舍其錦繡,鄰有短褐,而欲竊之;舍其粱肉,鄰有穅糟,而欲竊之。此為何若人?』王曰: 『必為有竊疾矣。』子墨子曰:『荊之地,方五千里,宋之地,方五百里,此猶文軒之與敝輿也;荊有雲夢,犀兕麋鹿滿之,江漢之魚鱉黿鼉為天下富,宋所為無雉兔狐狸者也,此猶粱肉之與糠糟也;荊有長松、文梓、楩、枬、豫章,宋元長木,此猶錦繡之與短褐也。臣以王之攻宋也,為與此同類,臣見大王之必傷義而不得。』王曰:『善哉!雖然,公輸盤為我為雲梯,必取宋。』

於是見公輸盤,子墨子解帶為城,以牒為械,公輸盤九設攻城之機變,子墨子九距之。 公輸盤之攻械盡,子墨子之守圍有餘。公輸盤詘,而曰:『吾知所以距子矣,吾不言。』子墨子亦曰:『吾知子之所以距我,吾不言。』楚王問其故,子墨子曰: 『公輸子之意,不過欲殺臣。殺臣,宋莫能守,乃可攻也。然臣之弟子禽滑厘等三百人,已持臣守圉之器在宋城上而待楚寇矣。雖殺臣,不能絕也。』楚王曰:『善哉!吾請無攻宋矣。』

子墨子歸,過宋,天雨,庇其閭中,守閭者不內也。故曰:『治於神者,眾人不知其功,爭於明者,眾人知之。』

好一場墨子公輸盤的『帶城牒械』的『紙上談兵』,輸贏自能互見省卻多少生靈塗炭,此不可謂之『』乎??

λ 運算』的歷史說著︰凡事起頭難。自一八七九年弗雷格 Frege 寫『概念文字 ── 模仿算術純思維之形式語言』以來,有志之士風起雲湧想要打造『概念天梯』直通『真理之路』!然而過程中『怪題悖論』卻也不斷,前輩們上窮碧落下黃泉的『冥思苦想』,遺留下了一些『概念里程碑』,很值得玩味推敲他們又是從『何處得來』的呢??

就讓我們介紹一些『有名字』的組合子吧︰

恆等組合子

I =_{df} (\lambda x. x)

邱奇自然數

0 =_{df} (\lambda f. (\lambda x. x))
1 =_{df} (\lambda f. (\lambda x. (f x)))
2 =_{df} (\lambda f. (\lambda x. (f(f x))))
3 =_{df} (\lambda f. (\lambda x. (f(f(f x)))))
4 =_{df} (\lambda f. (\lambda x. (f(f(f(f x))))))

自然數後繼者

SUCC =_{df} (\lambda n. (\lambda f. (\lambda x. (f((n f) x)))))

組合邏輯

S =_{df} (\lambda x. (\lambda y. (\lambda z. ((xz)(yz)))))
K =_{df} (\lambda x. (\lambda y. x))
B =_{df} (\lambda x. (\lambda y. (\lambda z. (x (y z)))))
C =_{df} (\lambda x. (\lambda y. (\lambda z. ((x z) y ))))

邏輯真假

T =_{df} (\lambda  x. ( \lambda y. x))
F =_{df} (\lambda  x .( \lambda y. y))

自我應用

\omega =_{df} (\lambda x. (x x))
\Omega =_{df} (\omega \omega)

Curry之悖論組合子

Y =_{df} (\lambda f.( (\lambda x. (f (x x))) (\lambda x. (f (x x)))))

圖靈之定點組合子

\Theta =_{df} ((\lambda x. (\lambda f. (f ((x x) f)))) (\lambda x. (\lambda f. (f ((x x) f)))))

lispers.org-logo

Lispers
Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot.”
Eric Raymond, “How to Become a Hacker

人類的語言有眾多的『方言』是因為『鄉土』與『人文』的不同所造成的。然而『LISP』 是一個程式語言,卻有著各種方言,想來是每個人對『事物概念』的『理解』和『詮釋』不一樣才發生的。假使如『Lispers』所說的︰

Lisp 是用奧秘的『外星人』Alien 科技所製造的。

那麼『 λ語言』就是那個由人類創造的始原之『巴別塔』。