λ演算簡介及coq實現λ演算
離散數學開課後感覺很多東西需要更深探索,老師也教授了一些coq證明系統的內容,感覺λ演算不太好理解,打算用這種方式加深自己的理解,第一篇博客,內容來自對網上一些解釋和老師講解內容的理解,隨後會推出自然推理系統和coq證明系統的基本使用方法。這裏的內容不會涉及很深的東西,如果以後有精力會盡量加深解讀。(藉助的一些資料會在文末貼鏈接)
什麼是λ演算
思想起源:證明過程機械化(比如圖靈機),讓一切事物都能通過機械的既定理論得以證明(貌似非常不可思議,但是現在很多領域以這種思想爲基礎派生出許多有趣的事物,讓人不得不欽佩當時圖靈一代人的創新思維)
實現目標:利用形式語言推算出大量定理(類似人工智能)
- λ演算是一種形式系統 ,相當於數學中利用符號描述世界的思想;
- 函數式編程,如果不明白其表達式的含義時,會覺得非常複雜,如:(λ x.x+2) 2.實際上這就是通過代入的方法計算2+2,λ演算規則很有限也很簡單,但是卻可以實現大部分的可計算問題。
λ的文法(語法和符號表示規則)
- 主導思想:
(1) everything is function.
(2) every function must be anonymous. - 歸納定義:
(1) x,y,z,plus…(一些String),稱爲λ項
(2) M N :application(M(N)),M,N是定義好的項,運算順序是左結合
(3) λx.M:函數定義 anonymous. - 基本結構:λ<變量>.<表達式>(注意不要忽略**.**)
(1).這種結構明確地表示了函數關係,如:f(x)=x,能明確知道y是x的函數,若表示成y=x,可能會認爲y是x+1的函數(y=(x+1)-1);
(2).需要計算具體的值時,只需將常量放在括號外:(λx.x+2)2,其中(x+2)相當於是函數的返回值
(3).涉及到多個變量,需要按順序進行傳遞(感覺很像高級編程語言裏形參和實參的單向傳遞)如:((λx.λy.2*x+y)1)2)代表x=1,y=2. - coq中的λ演算:λx.M<=>fun x =>M
一些coq代碼實例:
Coq < Compute (fun x=>x+2)2.
= 4
: nat
Coq < Compute (fun x=>plus x 2)2.
= 4
: nat
- 一些函數實例
(1)high order function:succ運算(見下一節)
有關λ表達式的一些運算
- complete binding:
在(λx.x+y)中,x是binding的,y是free的(類似於全稱量詞中的free和bound) - 運算的兩條基本法則 Alpha和Beta
(1)alpha轉換:改變函數參數名稱,同時修改函數體內對它的自由引用
(2)beta規約:將標識符代入函數的參數中,但不能影響約束性
如:(λx.x+2)2 ,將2代入x的過程就是規約
(λx.x+2)(x+2),這裏x+2是free,不受λx的約束,需要先使用換名,再進行代入
如不換名:計算結果:x+x+2
如換名:(λx.x+2)(x+2)變爲(λx.x+2)(y+2),計算結果爲:y+x+2 - 一些數字運算
(1) 在介紹利用lambda演算進行計算之前,先引入些syntactic sugar命名函數
全局函數:使用let表達式
lambda文法表達:
let m=lambda x.x^2
命名了一個名爲“m”的全局函數,如果計算"m 2",返回結果是4
coq代碼表示:
Compute let m:=fun x=>x+2 in m 3.
(2)數字的表示
前面我們說明了lambda演算中一切都是函數,那麼數字也是通過函數定義的。稱爲函數的數字化(“Church Numerals")
coq中的自然數定義
3=S(S(S(O)))
0=O
lambda演算中的自然數定義
z相當於對零值的命名
0<=>λs.λz.z
1<=>λs.λz.s(z)
2<=>λs.λz.s(s(z))
…
coq代碼實例:
Definition compose := fun (f: nat -> nat)
=> fun (g : nat -> nat)
=> fun x => g (f x).
Check compose.
Compute compose S S 0.
Compute compose (plus 2) (plus 3) 3.
Compute compose (fun x => x + 3) (plus 2) 4.
(*sugar:fun x move to the left*)
Definition compose' (f: nat -> nat) (g: nat -> nat) x := g (f x).
(*coq:type can be argument*)
Definition compose'' {A B C : Set} (f: A -> B) (g : B ->C) (x:A) :=
g ( f x).
Check compose''.
Compute compose S S 2.
①加法的實現
如果我們要實現加法,實際上需要四個參數:兩個加數,s和z。
那麼我們要實現兩個步驟:
a.接受兩個參數
b.正則化(即將參數表示爲s,z的組合形式)
(這裏我還沒有充分理解,隨後可能發文進行解釋,此處先略去加法定義)
- 布爾運算和選擇分支
形式化λ演算系統和計算(使用coq)
由於coq的基本知識還沒學完,這部分簡單略過,後期可能進行補充
- λ項的定義
- 符號化
- 運算的定義
先這些吧…感覺寫的有點亂,主要是老師講的越來越聽不懂了
拓展資料:church coding
參考資料:GitHub上關於lambda演算的講解