λ演算簡介及coq實現λ演算

λ演算簡介及coq實現λ演算

離散數學開課後感覺很多東西需要更深探索,老師也教授了一些coq證明系統的內容,感覺λ演算不太好理解,打算用這種方式加深自己的理解,第一篇博客,內容來自對網上一些解釋和老師講解內容的理解,隨後會推出自然推理系統和coq證明系統的基本使用方法。這裏的內容不會涉及很深的東西,如果以後有精力會盡量加深解讀。(藉助的一些資料會在文末貼鏈接)

什麼是λ演算

思想起源:證明過程機械化(比如圖靈機),讓一切事物都能通過機械的既定理論得以證明(貌似非常不可思議,但是現在很多領域以這種思想爲基礎派生出許多有趣的事物,讓人不得不欽佩當時圖靈一代人的創新思維)
實現目標:利用形式語言推算出大量定理(類似人工智能)

  1. λ演算是一種形式系統 ,相當於數學中利用符號描述世界的思想;
  2. 函數式編程,如果不明白其表達式的含義時,會覺得非常複雜,如:(λ x.x+2) 2.實際上這就是通過代入的方法計算2+2,λ演算規則很有限也很簡單,但是卻可以實現大部分的可計算問題。

λ的文法(語法和符號表示規則)

  1. 主導思想
    (1) everything is function.
    (2) every function must be anonymous.
  2. 歸納定義:
    (1) x,y,z,plus…(一些String),稱爲λ項
    (2) M N :application(M(N)),M,N是定義好的項,運算順序是左結合
    (3) λx.M:函數定義 anonymous.
  3. 基本結構:λ<變量>.<表達式>(注意不要忽略**.**)
    (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.
  4. 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. 一些函數實例
    (1)high order function:succ運算(見下一節)

有關λ表達式的一些運算

  1. complete binding:
    在(λx.x+y)中,x是binding的,y是free的(類似於全稱量詞中的free和bound)
  2. 運算的兩條基本法則 AlphaBeta
    (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
  3. 一些數字運算
    (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的組合形式)
(這裏我還沒有充分理解,隨後可能發文進行解釋,此處先略去加法定義)

  1. 布爾運算和選擇分支

形式化λ演算系統和計算(使用coq)

由於coq的基本知識還沒學完,這部分簡單略過,後期可能進行補充

  1. λ項的定義
  2. 符號化
  3. 運算的定義

先這些吧…感覺寫的有點亂,主要是老師講的越來越聽不懂了

拓展資料:church coding

參考資料:GitHub上關於lambda演算的講解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章