λ演算简介及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演算的讲解

发布了1 篇原创文章 · 获赞 3 · 访问量 62

猜你喜欢

转载自blog.csdn.net/komova0/article/details/105438965