Wikipedia(維基百科全書)中關(guān)于lambda演算的解釋如下:
The lambda calculus is a formal system designed to investigate function definition, function application, and recursion. It was introduced by Alonzo Church and Stephen Cole Kleene in the 1930s; Church used the lambda calculus in 1936 to give a negative answer to the Entscheidungsproblem. The calculus can be used to cleanly define what a computable function is. The question of whether two lambda calculus expressions are equivalent cannot be solved by a general algorithm, and this was the first question, even before the halting problem, for which undecidability could be proved. Lambda calculus has greatly influenced functional programming languages, especially Lisp.
λ演算是一套用于研究函數(shù)定義、函數(shù)應(yīng)用和遞歸的形式系統(tǒng)。它由 Alonzo Church 和 Stephen Cole Kleene 在 20 世紀(jì)三十年代引入,Church 運用 lambda 演算在 1936 年給出 判定性問題 (Entscheidungsproblem) 的一個否定的答案。這種演算可以用來清晰地定義什么是一個可計算函數(shù)。關(guān)于兩個 lambda 演算表達(dá)式是否等價的命題無法通過一個通用的算法來解決,這是不可判定性能夠證明的頭一個問題,甚至還在停機(jī)問題之先。Lambda 演算對函數(shù)式編程有巨大的影響,特別是Lisp 語言。
同時,數(shù)理邏輯中對于lambda演算的介紹就簡單得多:
λ-演算可以說是最簡單、最小的一個形式系統(tǒng)。它是在二十世紀(jì)三十年代由Alonzo Church 和 Stephen Cole Kleene發(fā)明的。至今,在歐洲得到了廣泛的發(fā)展。可以說,歐洲的計算機(jī)科學(xué)是從λ-演算開始的,而現(xiàn)在仍然是歐洲計算機(jī)科學(xué)的基礎(chǔ),首先它是函數(shù)式程序理論的基礎(chǔ),而后,在λ-演算的基礎(chǔ)上,發(fā)展起來的π-演算、χ-演算,成為近年來的并發(fā)程序的理論工具之一,許多經(jīng)典的并發(fā)程序模型就是以π-演算為框架的。
Lambda 演算可以被稱為最小的通用程序設(shè)計語言。它包括一條變換規(guī)則 (變量替換) 和一條函數(shù)定義方式,Lambda 演算之通用在于,任何一個可計算函數(shù)都能用這種形式來表達(dá)和求值。因而,它是等價于圖靈機(jī)的。盡管如此,Lambda 演算強(qiáng)調(diào)的是變換規(guī)則的運用,而非實現(xiàn)它們的具體機(jī)器。可以認(rèn)為這是一種更接近軟件而非硬件的方式。 Lambda演算表達(dá)了兩個計算機(jī)計算中最基本的概念“代入”和“置換”。“代入”我們一般理解為函數(shù)調(diào)用,或者是用實參代替函數(shù)中的形參;“置換”我們一般理解為變量換名規(guī)則。后面會講到,“代入”就是用lambda演算中的β-歸約概念。而“替換”就是lambda演算中的α-變換。
目錄 |
最開始,Church 試圖創(chuàng)制一套完整的形式系統(tǒng)作為數(shù)學(xué)的基礎(chǔ),當(dāng)他發(fā)現(xiàn)這個系統(tǒng)易受羅素悖論的影響時,就把 lambda 演算單獨分離出來,用于研究可計算性,最終導(dǎo)致了他對判定性問題的否定回答。
在 lambda 演算中,每個表達(dá)式都代表一個只有單獨參數(shù)的函數(shù),這個函數(shù)的參數(shù)本身也是一個只有單一參數(shù)的函數(shù),同時,函數(shù)的值是又一個只有單一參數(shù)的函數(shù)。函數(shù)是通過 lambda 表達(dá)式匿名地定義的,這個表達(dá)式說明了此函數(shù)將對其參數(shù)進(jìn)行什么操作。例如,“加 2”函數(shù) f(x) = x + 2 可以用 lambda 演算表示為 λ x. x + 2 (λ y. y + 2 也是一樣的,參數(shù)的取名無關(guān)緊要) 而 f(3) 的值可以寫作 (λ x. x + 2) 3。函數(shù)的作用 (application) 是左結(jié)合的:f x y = (f x) y。考慮這么一個函數(shù):它把一個函數(shù)作為參數(shù),這個函數(shù)將被作用在 3 上:λ f. f 3。如果把這個 (用函數(shù)作參數(shù)的) 函數(shù)作用于我們先前的“加 2”函數(shù)上:(λ f. f 3) (λ x. x+2),則明顯地,下述三個表達(dá)式:
(λ f. f 3) (λ x. x+2) 與 (λ x. x + 2) 3 與 3 + 2
是等價的。有兩個參數(shù)的函數(shù)可以通過 lambda 演算這么表達(dá):一個單一參數(shù)的函數(shù)的返回值又是一個單一參數(shù)的函數(shù) (參見 Currying)。例如,函數(shù) f(x, y) = x - y 可以寫作 λ x. λ y. x - y。下述三個表達(dá)式:
(λ x. λ y. x - y) 7 2 與 (λ y. 7 - y) 2 與 7 - 2
也是等價的。然而這種 lambda 表達(dá)式之間的等價性無法找到一個通用的函數(shù)來判定。
并非所有的 lambda 表達(dá)式都可以規(guī)約至上述那樣的確定值,考慮
(λ x. x x) (λ x. x x)
或
(λ x. x x x) (λ x. x x x)
然后試圖把第一個函數(shù)作用在它的參數(shù)上。 (λ x. x x) 被稱為 ω 組合子,((λ x. x x) (λ x. x x)) 被稱為 Ω,而 ((λ x. x x x) (λ x. x x x)) 被稱為 Ω2,以此類推。
若僅形式化函數(shù)作用的概念而不允許 lambda 表達(dá)式,就得到了組合子邏輯。
lambda演算系統(tǒng)中合法的字符如下:
1. 標(biāo)識符 (identifier) 的可數(shù)無窮集合:{ x1,x2,x3,…}變元(變元的數(shù)量是無窮的,不能在有限步驟內(nèi)窮舉,這個很重要,后面有定理是根據(jù)這一點證明的)
2. à 歸約
3. 等價
4. λ,(,) (輔助工具符號,一共有三個,λ和左括號右括號)
λ-項在一些文章中也稱為λ表達(dá)式(lambda expression),它是由上面字母表中的合法字符組成的表達(dá)式,合法的表達(dá)式組成規(guī)則如下:
1. 任一個變元是一個項
2. 若M,N是項,則(MN)也是一個項 (function application,函數(shù)應(yīng)用)
3. 若M是一個項,而x是一個變元,則(λx.M)也是一個項 (function abstraction,函數(shù)抽象)
4. 僅僅由以上規(guī)則歸納定義得到的符號串是項
則所有的 lambda 表達(dá)式可以通過下述以 BNF 范式表達(dá)的上下文無關(guān)文法描述:
說明1:通常,lambda 抽象 (規(guī)則 2) 和函數(shù)作用 (規(guī)則 3) 中的括號在不會產(chǎn)生歧義的情況下可以省略。如下假定保證了不會產(chǎn)生歧義:
(1) 函數(shù)的作用是左結(jié)合的。
(2) lambda 操作符被綁定到它后面的整個表達(dá)式。
例如,表達(dá)式 ((λ x. (x x)) (λ y. y)) 可以簡寫成 (λ x. x x) λ y.y。
說明2:(λx.M)這樣的λ-項被稱為函數(shù)抽象,原因是它常常就是一個函數(shù)的定義,函數(shù)的參數(shù)就是變量x,函數(shù)體就是M,而函數(shù)名稱則是匿名的。用一個不恰當(dāng)?shù)谋扔鱽碚f,我們通常認(rèn)為的函數(shù)f(x)=x+2,可以被表達(dá)為λx.x+2。因為+是未定義的,所以這個比喻只是為了方便理解而已。
說明3:MN這樣的λ-項被稱為函數(shù)應(yīng)用,原因是它表達(dá)了將M這個函數(shù)應(yīng)用到N這個概念。沿用上面的例子f(x)=x+2,那么f(2)=2+2;同樣的λx.x+2表達(dá)了f(x)的概念,那么(λx.x+2)2表達(dá)了f(2)的概念。其中M=λx.x+2,N=2,所以MN=(λx.x+2)2。
說明4:注意說明3只是為了方便理解,但是還存在很多與直觀理解不符合的地方。例如xy也是一個合法的λ-項,它們也是MN形式的,不過x和y都僅僅是一個變量而已,談不上函數(shù)代入。
說明4:這里的另一難點就是要區(qū)分變量和元變量,如:M=λx.x,這里x為變量,是我們在語法系統(tǒng)中定義了的,而M為元變量,沒有在語法系統(tǒng)中定義,是我們用來表示的助記符。我們必須根據(jù)上下文來區(qū)分誰是變量,誰是元變量。
上面是λ-項的形式化定義,有一些是可以與函數(shù)理論直觀聯(lián)系的,而另一些只是說明這個λ-項是合法的,不一定有直觀的字面意義。
若M,N是λ-項,則MàN,M N是公式。
類似 λ x. (x y) 這樣的 lambda 表達(dá)式并未定義一個函數(shù),因為變量 y 的出現(xiàn)是自由的,即它并沒有被綁定到表達(dá)式中的任何一個 λ 上。在一個λ-項中,變量要么是自由出現(xiàn)的,要么是被一個λ符號綁定的。還是以函數(shù)的方式來理解變量的自由出現(xiàn)和綁定。例如f(x)=xy這個函數(shù),我們知道x是和函數(shù)f相關(guān)的,因為它是f的形參,而y則是和f無關(guān)的。那么在λx.xy這個λ-項中,x就是被λ綁定的,而y則是自由出現(xiàn)的變量。
直觀的理解,被綁定的變量就是作為某個函數(shù)形參的變量,而自由變量則是不作為任何函數(shù)形參的變量。
Lambda變量綁定規(guī)則:
1. 在表達(dá)式x中,如果x本身就是一個變量,那么x就是一個單獨的自由出現(xiàn)。
2. 在表達(dá)式λ x. E中,自由出現(xiàn)就是E中所有的除了x的自由出現(xiàn)。這種情況下在E中所有x的出現(xiàn)都稱為被表達(dá)式中x前面的那個λ所綁定。
3. 在表達(dá)式(MN )中,變量的自由出現(xiàn)就是M和N中所有變量的自由出現(xiàn)。
另一種關(guān)于變量的自由出現(xiàn)的規(guī)則也許更直接:
1. free(x) = x
2. free(MN) = free(M) 萛\nfree(N)
3. free(lx " M) = free(M) – {x}
為什么要花大力氣來給出變量自由出現(xiàn)的規(guī)則,是因為后面的很多地方要用到變量的自由出現(xiàn)的概念。例如α-變換和β-歸約。
例子:分析λf.λx.fx中變量的自由出現(xiàn)和綁定狀況。
λf.λx.fx =λf.E, E=λx.fx
E=λx.A, A=A1A2, A1=f, A2=x
所以在A中f和x都是自由出現(xiàn)的,
所以E中x是綁定λ x
所以整個公式中f是綁定第一個λ f的。
一個不含自由變量的項稱為封閉項;封閉項也稱為組合子。最簡單的組合子,稱為恒等函數(shù):id=λx.x
來看兩個λ-項,λx.xx和λx.(xx)有何不同?根據(jù)左結(jié)合的法則,λx.xx=(λx.x)x,其中第一個x是被λ綁定的,而第二個x則是自由出現(xiàn)的。而λx.(xx)中兩個x都是被λ綁定的。這表明了兩個λ-項中λx的控制域是不同的。
α-變換規(guī)則表達(dá)的是,被綁定變量的名稱是不重要的。比如說 λx.x 和 λy.y 是同一個函數(shù)。因此,將某個函數(shù)中的所有約束變量全部換名是可以的。盡管如此,這條規(guī)則并非像它看起來這么簡單,關(guān)于被綁定的變量能否由另一個替換有一系列的限制需要遵循。
首先是一個說明:如果M,N是λ-項,x在M中有自由出現(xiàn),若以N置換M中所有x的自由出現(xiàn)(M中可能含有x的約束出現(xiàn)),我們得到另一個λ-項,記為M[x/N]。
α-變換規(guī)則如下:
λx.M≌λy.M[x/y] 如果y沒有在M中自由出現(xiàn),并且只要y替換M中的x,都不會被M中的一個λ綁定。即:替換的變元不能在M中自由出現(xiàn),并且也只替換M中的自由變元
這條規(guī)則告訴我們,例如 λ x. (λ x. x) x 這樣的表達(dá)式和 λ y. (λ x. x) y 是一樣的。
注意:M[x/N]定義出來只是一種記號,它不等于α-變換。既M!≌ M[x/y]
例子:λx.( λx.x)x≌λy.(λx.x)y 但是 ( λx.x)x!≌(λx.x)y
α-變換主要用來表達(dá)函數(shù)中的變量換名規(guī)則,需要注意的是被換名的只能是M(函數(shù)體)中變量的自由出現(xiàn)。
β-歸約表達(dá)的是函數(shù)應(yīng)用或者函數(shù)代入的概念。前面提到MN是合法的λ-項,那么MN的含義是將M應(yīng)用到N,通俗的說是將N作為實參代替M中的約束變量,也就是形參。β-歸約的規(guī)則如下:
(λx.M)N à M[x/N] 如果N中所有變量的自由出現(xiàn)都在M[x/N]中保持自由出現(xiàn)
注意: (lx. ly.(y x))y ?ly.(y y)是錯的,應(yīng)為y在ly.(y x)中不自由出現(xiàn),這時要歸約就應(yīng)該先用α-變換把ly.(y x)中的y換成其他變元
β-歸約是λ演算中最重要的概念和規(guī)則,它是函數(shù)代入這個概念的形式化表示。
一些例子如下:
(lx.ly.y x)(lz.u) ?ly.y(lz.u)
(lx. x x)(lz.u) ?(lz.u) (lz.u)
(ly.y a)((lx. x)(lz.(lu.u) z)) ?(ly.y a)(lz.(lu.u) z)
(ly.y a)((lx. x)(lz.(lu.u) z)) ?(ly.y a)((lx. x)(lz. z))
(ly.y a)((lx. x)(lz.(lu.u) z)) ?((lx. x)(lz.(lu.u) z)) a
需要多加練習(xí)才能習(xí)慣這種歸約。
4.3 等價關(guān)系
在 lambda 表達(dá)式的集合上定義了一個等價關(guān)系 (在此用 標(biāo)注),“兩個表達(dá)式其實表示的是同一個函數(shù)”這樣的直覺性判斷即由此表述,這種等價關(guān)系是通過所謂的“alpha-變換規(guī)則”和“beta-歸約規(guī)則”得到的。
f g:當(dāng)且僅當(dāng)(1)g≌f ;(2)g甪 or f甮 ;(3)存在h,f h且h g之一成立。
關(guān)系被定義為滿足上述規(guī)則的最小等價關(guān)系 (即在這個等價關(guān)系中減去任何一個映射,它將不再是一個等價關(guān)系)。
前兩條規(guī)則之后,還可以加入第三條規(guī)則,η-變換,來形成一個新的等價關(guān)系。η-變換表達(dá)的是外延性的概念,在這里外延性指的是,兩個函數(shù)對于所有的參數(shù)得到的結(jié)果都一致,當(dāng)且僅當(dāng)它們是同一個函數(shù)。
η-變換:λ x . f x f,只要 x 不是 f 中的自由出現(xiàn)。
f 與 g 外延的等價:對任意lambda 表達(dá)式 a,如果有f a g a成立,則f g也成立。
下面說明了為何這條規(guī)則和外延性是等價的:(即由η-變換可以證明外延等價,相反由外延等價也可以證明η-變換)
f a g a 對所有的 lambda 表達(dá)式 a 成立,則當(dāng)取 a 為在 f 中不是自由出現(xiàn)的變量 x 時,我們有 f x g x,因此 λ x . f x λ x . g x,由 η-變換 f g。所以只要 η-變換是有效的,會得到外延性也是有效的。
相反地,若外延性是有效的,則由β-歸約,對所有的 y 有 (λ x . f x) y f y,可得 λ x . f x f,即 η-變換也是有效的
如果一個λ-項M中不含有任何形為((λx.N1)N2)的子項,則稱M是一個范式,簡記為n.f.。如果一個λ-項M通過有窮步β-歸約后,得到一個范式,則稱M有n.f.,沒有n.f.的λ-項稱為n.n.f.。
通俗的說法是,將一個λ-項進(jìn)行β-歸約,也就是進(jìn)行實參代入形參的過程,如果通過有窮步代入,可以得到一個不能夠再進(jìn)行代入的λ-項,那么這就是它的范式。如果無論怎樣代入,總存在可以繼續(xù)代入的子項,那么它就沒有范式。
例子
M = λx.(x((λy.y)x))y,則Mà y((λy.y)y) à yy。M有一個n.f.。
例子
M =λx.(xx) λx.(xx),則Màλx.(xx) λx.(xx)=M。注意到M的歸約只有唯一的一個可能路徑,所以M不可能歸約到n.f.。所以M是n.n.f.。
注意這個λx.(xx) λx.(xx)在λ演算的協(xié)調(diào)性研究中是一個比較經(jīng)典的項。((λ x. x x) (λ x. x x))被稱為Ω, ((λ x. x x x) (λ x. x x x))被稱為 Ω2。
一般的把一個λ-項規(guī)約為范式的過程稱為求值,范式也叫做值。在《類型和程序設(shè)計語言》一書中,作者給出了λ-演算中的幾種不同的求值策略。每個策略確定一個項在下一步求值中激活哪一個約式或幾個約式。
注意到在求值的過程中是左結(jié)合,并且當(dāng)且僅當(dāng)左邊以是值了才能對右邊的項進(jìn)一步求值
這一段來自《數(shù)理邏輯與集合論》(第二版 清華大學(xué)出版社)。
1. (λx.M)N à M[x/N] 如果N中所有變量的自由出現(xiàn)都在M[x/N]中保持自由出現(xiàn)
2. MàM
3. MàN, NàL => MàL
4. MàM’=>ZMàZM’
5. MàM’=>MZàM’Z
6. MàM’=>λx. M àλx. M’
7. MàM’=>M M’
8. M M’=>M’ M
9. M N,N L=>M L
10. M M’ => ZM ZM’
11. M M’ => MZ M’Z
12. M M’ =>λx. M λx. M’
13.M≌N => MàN 如果y沒有在M中自由出現(xiàn),并且只要y替換M中的x,都不會被M中的一個λ綁定。
如果某一公式MàN或者M(jìn) N可以用以上的公理推出,則記為λ├MàN和λ├M N。
規(guī)則13可以加也可以不要,要了表示是考慮α-變換的系統(tǒng)
Λ表示所有的λ-項組成的集合。
定理:對于每一個F∈Λ,存在M∈Λ,使得λ├FM=M。
證明:定義w=λx.F(xx),又令M=ww,則有λ├M=ww=(λx.F(xx))w=F(ww)=FM。
證明是非常巧妙的,對于每個F,構(gòu)造出的這個ww剛好是可以通過一次β-歸約得到F(ww)=FM,如果再歸約一次就得到F(FM),這樣可以無限次的歸約下去得到F(F(F(F…(FM)…)))。
這兩個定理告訴我們這樣一個事實:如果M有一個n.f.,則這個n.f.是唯一的,任何β-歸約的路徑都將終止,并且終止到這個n.f.。
Church-Rosser定理:如果λ├M N,則對某一個Z,λ├MàZ并且λ├NàZ。
與之等價的定理如下,
Diamond Property定理:如果MàN1,MàN2,則存在某一Z,使得N1àZ,N2àZ。(規(guī)約的合流性)
推論:MàN1,MàN2 且N1,N2都是范式 則N1≌N2 (范式在α-變換下的唯一性)
關(guān)系被定義為滿足上述兩條規(guī)則的最小等價關(guān)系 (即在這個等價關(guān)系中減去任何一個映射,它將不再是一個等價關(guān)系)。
對上述等價關(guān)系的一個更具操作性的定義可以這樣獲得:只允許從左至右來應(yīng)用規(guī)則。不允許任何 beta 歸約的 lambda 表達(dá)式被稱為范式。并非所有的 lambda 表達(dá)式都存在與之等價的范式,若存在,則對于相同的形式參數(shù)命名而言是唯一的。此外,有一個算法用來計算范式,不斷地把最左邊的形式參數(shù)替換為實際參數(shù),直到無法再作任何可能的規(guī)約為止。這個算法當(dāng)且僅當(dāng) lambda 表達(dá)式存在一個范式時才會停止。Church-Rosser 定理 說明了,當(dāng)且僅當(dāng)兩個表達(dá)式等價時,它們會在形式參數(shù)換名后得到同一個范式。
在 lambda 演算中有許多方式都可以定義自然數(shù),但最常見的還是邱奇數(shù),下面是它們的定義:
0 = λ s. λ z. z
1 =λ s. λ z.. s z
2 =λ s. λ z. s (s z)
3 =λ s. λ z. s (s (s z))
以此類推。直觀地說,lambda 演算中的數(shù)字 n 就是一個把函數(shù) f 作為參數(shù)并以 f 的 n 次冪為返回值的函數(shù)。換句話說,Church 整數(shù)是一個高階函數(shù) -- 以單一參數(shù)函數(shù) f 為參數(shù),返回另一個單一參數(shù)的函數(shù)。
(注意在 Church 原來的 lambda 演算中,lambda 表達(dá)式的形式參數(shù)在函數(shù)體中至少出現(xiàn)一次,這使得我們無法像上面那樣定義 0) 在 Church 整數(shù)定義的基礎(chǔ)上,我們可以定義一個后繼函數(shù),它以 n 為參數(shù),返回 n + 1:
SUCC1 = λ n. λ s. λ z. s(n s z)
SUCC2 = λ n. λ s. λ z. n s(s z)
加法是這樣定義的:
PLUS = λ m. λ n. λ s. λ z. m s (n s z)
PLUS 可以被看作以兩個自然數(shù)為參數(shù)的函數(shù),它返回的也是一個自然數(shù)。你可以試驗證
PLUS 2 3 與 5
是否等價。乘法可以這樣定義:
MULT = λ m. λ n. m (PLUS n) 0,
MULT2 =λ m. λ n. λ s. λ z. m (n s) z
即 m 乘以 n 等于在零的基礎(chǔ)上 n 次加 m。更簡潔的一種方式是
MULT3 = λ m. λ n. λ s. m (n s)
冪的定義:
POWER1 = λ m. λ n. m (MULT n) 1
POWER2 = λ m. λ n. m n (可能有點問題,我驗證了好象不正確)
正整數(shù) n 的前驅(qū)元 (predecessesor) PRED n = n - 1 要復(fù)雜一些:
PRED = λ n. λ f. λ x. n (λ g. λ h. h (g f)) (λ u. x) (λ u. u)
或者
PRED = λ n. n (λ g. λ k. (g 1) (λ u. PLUS (g k) 1) k) (λ l. 0) 0
注意 (g 1) (λ u. PLUS (g k) 1) k 表示的是,當(dāng) g(1) 是零時,表達(dá)式的值是 k,否則是 g(k) + 1。
在《類型和程序設(shè)計語言》一書中作者對于數(shù)和各種運算的編碼描述得比較清晰,強(qiáng)烈建議看以下,并且作者還介紹了直接基于原始的布爾類型和數(shù)型的系統(tǒng),簡稱為λNB,并給出了這兩套系統(tǒng)之間的轉(zhuǎn)換。
習(xí)慣上,下述兩個定義 (稱為 Church 布爾值) 被用作 TRUE 和 FALSE 這樣的布爾值:
tru = λ u. λ v. u
fls = λ u. λ v. v
這樣我們可以定義一個組合式test=λl.λm.λ n.lmn,使得b為tru時,test b v w規(guī)約為v,而當(dāng)b為fls時,test b v w規(guī)約為w。
并且我們還可以定義邏輯連接詞:
and = λb. λc. b c fls
or =λb. λc. b c tru
not =λb. b fls tru
斷言是指返回布爾值的函數(shù)。最基本的一個斷言 ISZERO,當(dāng)且僅當(dāng)其參數(shù)為零時返回真:
ISZERO = λ n. n (λ x. fls) tru
斷言的運用與上述 TRUE 和 FALSE 的定義,使得 "if-then-else" 這類語句很容易用 lambda 演算寫出。
遞歸是一種以函數(shù)自身迭代自身變元的算法,一般是通過函數(shù)自身來定義函數(shù)的方式實現(xiàn)。表面看來 lambda 演算不允許遞歸,其實這是一種對遞歸的誤解。考慮階乘函數(shù) f(n) 一般這樣遞歸地定義:
f(n) = 1, 若 n = 0; n·f(n-1), 若 n>0.
λ語言:
FACT = λ n. n (λ u. MULT n (FACT (PRED n))) 1
用 Y-組合子 在 λ語言 中合法地定義:
FACT = Y (λ g. λ n. n (λ u. MULT n (g (PRED n))) 1)
Y = λ f. ((λ x. f (x x)) (λ x. f (x x)))
這一節(jié)我也沒分析透徹,只能原本引用,并且以上的內(nèi)容也只能當(dāng)作一個不嚴(yán)格的了解,暫時還不知道其有沒有錯,不過一點可以肯定的是上面定義的Y-組合子只能用于按名調(diào)用的情況,在按值調(diào)用的形式中是無用的,因為對任何g,表達(dá)式Y(jié)g發(fā)散。想要深入理解還是參看一下《類型和程序設(shè)計語言》這本書,不過書中也沒深入的具體分析按值和按名調(diào)用的作用方式。其實這涉及到不同的操作語義的定義。想要在這里弄透還得找找論文看看。
8 參考文獻(xiàn)和外部連接