Lambda Calculus

Lambda Calculus是非经典逻辑中的一种,形式比图灵机模型和一阶谓词逻辑等简洁优雅许多,是函数式编程语言的理论支柱,本文主要简单梳理了untyped Lambda Calculus以及Church数的构造。

Functional Programming Languages

  • Properties
    • based-on lambda calculus
    • closure(functor) and high-order function
    • lazy evaluation
    • recursion
    • reference transparently
    • no side-effects
    • expression

Lambda Calculus

  • Four core components

    • expression
    • variable(value)
    • function
    • application
  • Grammar
    • (expression) := (variable) | (function) | (application)
    • (function) := lambda (variable).(expression)
    • (application) := (expression)(expression)
    • examples
      • function definition : lambda x.x ==> Identity function I
      • function application : (lambda x.x)(y) = y
  • free and bound variables
    • lambda x.xy ==> x bound but y free
  • substitution and reduction
    • alpha substitution
    • beta reduction
  • numbers definition(Church numbers)
    • S : lambda wyx.y(wyx) (Successor function)
    • 0 : lambda sz.z
    • 1 : lambda sz.s(z)
      • S(0) = (lambda wyx.y(wyx))(lambda sz.z)
        = lambda yx.y((lambda sz.z)(y)x)
        = lambda yx.y(x) = 1
    • 2 : lambda sz.s(s(z))
      • S(1) = (lambda wyx.y(wyx))(lambda sz.s(z))
        = lambda yx.y((lambda sz.s(z))yx)
        = lambda yx.y((lambda z.y(z))x)
        = lambda yx.y(y(x)) = 2
    • 3 : lambda sz.s(s(s(z)))
    • 3(Func)(var) ==> apply 3 Func times on var
  • addition
    • ’+’ : lambda wyx.y(wyx) (successor function)
    • 1 + 2 = 1S(2)
    • (lambda sz.s(z)) (lambda wyx.y(wyx)) (lambda ab.a(a(b))) = (lambda z.(lambda wyx.y(wyx))(z)) (2)
      = (lambda zyx.y(zyx))(2) = S(2)
    • 2 + 2 = 2S(2)
    • (lambda sz.s(s(z))) (lambda wyx.y(wyx)) (2) = (lambda z.S(S(z)))(2) = S(S(2))
  • multiplication
    • ’*’ : lambda xyz.x(yz)
    • 1*2 = (lambda abc.a(bc))(1,2) = (lambda bc.1(bc))(2)
      = (lambda c.1(2(c)))
      = (lambda c.(lambda sz.s(z))(lambda sz.s(s(z)))(c))
      = lambda c.(lambda cz.c(c(z))) = 2
  • Condition
    • T : lambda xy.x
    • F : lambda xy.y
  • logic operation
    • && : lambda xy.xyF

      • &&(T,T) = (lambda x1y1.x1)(lambda x2y2.x2)(lambda xy.y) = lambda x2y2.x2 = T
      • &&(F,Any) = (lambda x1y1.y1)(Any)(lambda xy.y) = lambda xy.y = F
    • | : lambda xy.xTy
      • |(F,F) = (lambda x1y1.y1)(lambda xy.x)(lambda x2y2.y2) = lambda x2y2.y2 = F
      • |(T,Any) = (lambda x1y1.x1)(lambda xy.x)(Any) = lambda xy.x = T
    • ~ : lambda x.xFT
      • ~(F) = (lambda xy.y)(lambda x1y1.y1)(lambda x2y2.x2) = lambda x2y2.x2 = T
      • ~(T) = (lambda xy.x)(lambda x1y1.y1)(lambda x2y2.x2) = lambda x1y1.y1 = F
  • conditional test
    • Z : lambda x.xF~F ==> T if x==0 else F
    • Z(0) = 0F(~F) = (lambda sz.z)F~F = ~F = T
    • Z(1) = (lambda sz.s(z))F~F = F(~)F = (lambda xy.y)(~)(F) = IF = F
  • predecessor
    • p : lambda zxy.xy ==> a pair (x,y)
    • Inc : lambda pz.z(S(pT))(pT) ==> increase each element of one pair (x,x-1) -> (x+1,x)
    • P : (lambda n.n(In(lambda z.z00)))F
    • nP(0) = 0
  • equality and inequality
    • >= : lambda xy.Z(xPy) [if x>=y return True else False]
    • <= : lambda xy.Z(yPx) [if x<=y return True else False]
    • = : lambda xy.^(Z(xPy))(Z(yPx))
  • recursion
    • Y combinator : Y = lambda f.(lambda x.f(xx))(lambda x.f(xx))
      = f((lambda x.f(xx))(lambda x.f(xx)))
    • Yf = f(Yf) [Yf ==> recursion of f]
    • example 1+2+3…+n : f = lambda rn.(Zn)(0)(nS(r(Pn)))
    • Yf = f(Yf) = lambda Yfn.(Zn)(0)(nS(Yf(Pn))) ==> Yf recursion

    ref:《A Tutorial Introduction to the Lambda Calculus》

时间: 2024-08-30 13:13:46

Lambda Calculus的相关文章

C# 委托,事件和Lambda表达式

关于这个论题,Delegates, Events, and Lambda Expressions 对此有比较深入的分析,可以参考.C# vs C++之一:委托 vs 函数指针 比较了委托和C++指针的区别. .NET 中的委托确实和C/C++的函数指针非常相似.它是一个值类型,它包装了一个指向方法的引用.它的作用也是为了能够将方法和变量一样作为参数传递.委托的典型应用是控件的事件处理方法.很显然,一个控件在设计的时候没有办法知道当特定事件发生的时候,需要什么方法来处理,这就需要将方法作为参数传递

java8 新特性之 Lambda 讲解教程

什么是Lambda Lambda 是个新的特性添加到java的jdk中,说明了java对其它语言的支持,吸收其它语言先进的方法.Lambda 表达在java中提供了类型的引用,方法的引用,和默认方法. 对于Lambda的解释在wiki百科看到了就不做翻译保留原味(看看大家的理解,有不同的看法欢迎探讨)Lambda (programming), a function (or a subroutine) defined, and possibly called, without being boun

一起谈.NET技术,C# 委托,事件和Lambda表达式

关于这个论题,Delegates, Events, and Lambda Expressions 对此有比较深入的分析,可以参考.C# vs C++之一:委托 vs 函数指针 比较了委托和C++指针的区别. .NET 中的委托确实和C/C++的函数指针非常相似.它是一个值类型,它包装了一个指向方法的引用.它的作用也是为了能够将方法和变量一样作为参数传递.委托的典型应用是控件的事件处理方法.很显然,一个控件在设计的时候没有办法知道当特定事件发生的时候,需要什么方法来处理,这就需要将方法作为参数传递

F#学习之路(1)什么是函数式编程

对于什么是函数式编程,这个是人云亦云.本文并不打算对此进行定义,而是希望与园子里的朋友们共同探讨这个话题,抛砖只为引玉. 1.维基百科给出的定义是: 函数式编程是种编程范式,它将电脑运算视为函数的计算.函数编程语言最重要的基础是λ 演算(lambda calculus). 而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值). 2.函数应该是高阶函数,可柯里化 从维基百科定义可以看出,大家对函数式编程语言中,函数是一等公民(first class)这个概念是没有异议的. 函数应该享受值的

编程语言的一些概念

编程语言分类 编程语言的常见分类是按照类型来分的,比如强类型语言,弱类型语言,静态类型语言,动态类型语言等,要理清编程语言的分类,必须首先弄清楚什么是类型. 和类型相关的一些概念 Latent typing是一种你不需要在源码中的明确的声明你的变量的类型的类型系统.而与之相反的是manifest typing,它需要你在源码中明确的声明你的变量的类型. Static typing(静态类型)类型系统指的是你的源码中的任何独立的表达式都必须有类型,不管它的类型是直接写在源码中,或者是通过编译器来推

函数式编程初探

诞生50多年之后,函数式编程(functional programming)开始获得越来越多的关注. 不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言层出不穷,比如Erlang.clojure.Scala.F#等等.目前最当红的Python.Ruby.Javascript,对函数式编程的支持都很强,就连老牌的面向对象的Java.面向过程的PHP,都忙不迭地加入对匿名函数的支持.越来越多的迹象表明,函数式编程已经不再是学术界的最爱,开始大踏步地在业界投入实用. 也许继"面向对象编程&qu

用 Javascript 编写λ演算解释器

本文讲的是用 Javascript 编写λ演算解释器, 最近,我在推特上对λ演算非常着迷,它是如此简单和强大. 当然我之前听说过λ演算,但是直到我读了这本书 Types and Programming Languages 我才真正了解了它的美丽之处. 有许多其他的编译器.剖析器.解释器的教程,但是它们大多不会指导你遍览语言的全部实现,因为编程语言的实现需要进行大量的工作,然而λ演算是如此简单以至于我们可以完全讲解. 首先,什么是λ演算?这里是一个 Wikipedia 的描述: λ演算(英语:la

Y Combinator

由于匿名函数(通常成为lambda函数但是跟lambda calculus不同)在递归时无法获得函数名,从而导致一些问题,而Y Combinator能很好地解决这个问题.利用不动点的原理,可以利用一般的函数来辅助得到匿名函数的递归形式,从而间接调用无法表达的真正的匿名函数.下面以一个阶乘的递归来说明. #Python版本,后面会加上C++版本 #F(f) = f def F(f,n): return 1 if n==0 else n*f(n-1) #或者用lambda #F = lambda f

Kotlin函数与函数式编程浅析

如果你对Kotlin语法一无所知,推荐先阅读官方文档或者中文站(https://www.kotlincn.net/docs/reference/)之后再看这篇文章会有更深刻的理解.本篇文章主要介绍Kotlin函数的用法,以及自己对函数式编程的一些理解.并且会和Python,C++做一些比较. 下面是维基百科上对于函数式编程的定义: 函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态