当前位置:
文档之家› 形式语义学-Lambda演算
形式语义学-Lambda演算
2020/3/1
21
表达式 (11)– 替换例子
x.xy b.xy [a.ab/y]
= x.xy [a.ab/y] b.xy[a.ab/y] S4
= x.xa.ab z.xy[z/b][a.ab/y] S6;S8
= x.xa.ab z.xy [a.ab/y]
变换:设 (x.E)和E0为表达式,则称下 面变换为β变换(称β变换规则的左部表达 式为β基)
(x.E)E0 E[E0/x]
2020/3/1
18
表达式 (10)– 替换
E y.E’, xy,
E0中没有y的自由出现,那么直接对E’进行替换 S6:如果yFV(E0),则
(y. E’)[E0/x] = y. (E’ [E0/x]) (y. E’)中的y和E0中的y是不同的;
E’中没有x的自由出现,则表示E’没有可替换
= {y} ( FV(y (x. x y ) )-{x,y}) {z} ( FV (x x) - {x})
= {y, z}
2020/3/1
16
表达式 (9)
封闭型表达式:
如果一个表达式E不包含自由变量, 即 FV(E) = , 则称E为闭型表达式;
开型表达式:
如果一个表达式E包含自由变量, 即 FV(E) , 则称E为开型表达式;
合法的变换 X.(ZX) Y.(ZY)
X.((Y.YX)X) Z.((Y.YZ)Z)
非法的变换 X.(Z(Y.X)) Y.(Z(Y.Y )) X.(ZY) Y.(ZY)
2020/3/1
27
Lambda演算的变换系统 3 -- 变换
自由变量集合:用FV(E)表示E的自由变量集合,则其 具体定义为:
E x , FV(x) = {x} ;
E E1 E2 ,FV(E1 E2 ) = FV(E1) FV(E2) ;
E x. E’,FV(x. E’) = FV(E’) – {x} ;
E (E’), FV((E’)) = FV(E’)
y (x y. y (x. x y ) ) (z (x. x x) )
自由 出现
约束 约束 出现 出现
自由 出现
约束 出现
2020/3/1
14
表达式 (7)– 自由变量
自由变量:称x为表达式E的自由变量,如果E中至少
包含一个x的自由出现;
需要区分的概念:
变量:<变量名,含义>,定义点确定 变量名:标识符 变量的出现:<变量名,位置>
= x1. x2. … xn. ( E1 E2 E3 … Em )
2020/3/1
11
表达式 (4)—子表达式
子表达式(针对不同的表达式形式)
设E是一个表达式,则E的子表达式可以定义为: E x ,x就是E的子表达式; E E1 E2 , E1和E2以及它们的子表达式都是E的
S8:如果yFV(E0) xFV(E’),则 (y. E’)[ E0/x] = z.((E’ z/y])[E0/x]), zFV(E0), z y
只有自由出现的变量才允许被替换,而且替换不应 该把变量的自由出现变为约束出现。
要避免出现 ( y. x+y) [y/x] = ( y. y+y),
McCarthy)设计的。
2020/3/1
6
2.2 Lambda演算
主要内容
2.2.1 Lambda演算介绍
表达式 自由变量 free variables(FV) 替换 substitution 变换规则 conversion rules 归约 reduction
2.2.2 Lambda演算作为计算模型 2.2.3 Lambda演算系统的扩充
2020/3/1
13
表达式 (6)—自由出现
在表达式中相同的变量名,可以出现在表达式的不
同的位置,它们的含义可能不同;
自由出现/约束出现:表达式E中变量名x的一次出现
称为自由出现,如果E中任何一个形如x. E’的子表
达式不包含该出现;如果存在一个x. E’的子表达式
包含该出现,称为约束出现;
实际上给出了一种计算规则; 不同的Lambda演算系统有不同的变换规则; 变换规则是保结构和保值的; 变换系统定义了Lambda演算的语义;
2020/3/1
25
Lambda演算的变换系统2 -- 变换
变换:设E是表达式,x是变量,则称下面变换为 α变换(其中y不在 FV( x.E )中)
运算的并行性:运算分量,函数实参表达式都可并 行计算;
引用透明性:
计算的延迟性:
支持模式和模式匹配;
函数式语言具有比命令式语言更高的数学抽象力,
2020/3/1因此在描述某些算法的时候更精炼和严格;
4
引言
函数式语言不仅可用于程序设计,还可 用于算法、编译器、解释器的抽象描述 ,以及指称语义的定义等方面。
形式语义学
Formal Semantics of Programming Languages
2011.09
第二章 函数式抽象描述方法
2.1 论域理论基础 2.2 Lambda演算 2.3 函数式抽象语言 2.4 函数式抽象语言的应用
2020/3/1
2
第二章 函数式抽象描述方法
2.2 Lambda演算( calculus)
2.2.1 Lambda演算介绍 2.2.2 Lambda演算作为计算模型 2.2.3 Lambda演算系统的扩充
2020/3/1
3
引言
欧美等大学大都将函数式语言作为第一 门程序设计语言
函数式语言与过程式语言的区别
强调值的概念:有什么类型就有什么值,高阶值;
2020/3/1
23
Lambda演算通常包括两个部分:
合法表达式(表达式)的形式系统 (语法)
语法结构; 自由变量; 替换
变换规则的形式系统 (语义)
2020/3/1
24
Lambda演算的变换系统 1
变换系统给出了如何从一个表达式转换成 和其等价的另外一个表达式;
施用型表达式(APPLY):
E1 E2 -- 函数调用,E1是函数定义, E1是实参
抽象型表达式(Abstraction) :
x .E --- 无名函数定义,x对应形参,E是函数体
举例:
x x;
x.xy ;
x (y.xy ) ;
x.y.x ;
2020/3/1
x. E表达式中x.部分可以看作是变量x的定义点, 在 E 中x的定义域中出现变量x为其使用点;
举例:
表达式:y (x y. y (x. x y ) ) (z (x. x x) )
x 的作用域是 y; y的作用域是 y (x. x y ) ;
x 的作用域是 x y ;x的作用域是 x x;
2020/3/1
15
表达式(8)-计算自由变量集合例子
表达式E = y (x y. y (x. x y ) ) (z (x. x x) )
FV(E)
= FV(y (x y. y (x. x y ) ) ) FV ((z (x. x x) ))
= FV(y) FV( (x y. y (x. x y ) ) ) FV (z) FV ((x. x x) )
S7:如果xFV(E’) ,则
(y.E’)[E0/x] = y.(E’ [E0/x]) = y.E’
2020/3/1
19
表达式 (10)– 替换
E y. E’, xy,
E0中有y的自由出现,E’中有可替换的x,则需要对y进行改 名,改变后的变量名z是不同于y的E0的非自由出现。
2020/3/1
7
2.2.1 Lambda演算介绍
Lambda演算可看作是一个简单的语义 清楚的形式语言;可以用来解释复杂的 程序设计语言或者计算模型;
Lambda演算通常包括两个部分:
合法表达式(表达式 )的形式系统 (语法) 变换规则的形式系统 (语义)
2020/3/1
8
表达式 (1)—定义
2020/3/1
17
表达式 (10)— 替换
替换:设E和E0是表达式,x是变量名, 替换E[E0/x]是表示把E中所有x的自由出现替换成E0。
Substitution,代换(替换),表示形式有多种:
[E0/x]E ; [E0/x,E]; [xE0,E]; E[E0 /x]
E[E0/x]的计算规则为:
S7
= x.xa.ab z.x a.ab
S6
2020/3/1
22
已经介绍
Lambda演算的语法 – 表达式形式定义 相关的一些概念
子表达式 作用域规则 自由变量 替换:是Lambda演算中最重要的一个概念;
后面定义的转换系统都是基于替换的;
正确的替换,自动改名:( y. x+y) [y/x] = z. y+z
2020/3/1
20
表达式 (11)– 替换例子
x [xy/x] = xy
y [M/x] =y
x.xy [E/x] = x.xy
x.xz [w/y] = x.xz
S1 S2 S3;S5 S7
S1: E x , x[E0 /x] = E0 ; S2: E y , y[E0 /x] = y ,x y ; S3: E (E’), (E’) [ E0 /x] = E’ [ E0 /x] S4: E E1 E2,E1E2[E0/x] = (E1[E0/x]) (E2[E0/x]); S5: E x. E’, x. E’[E0/x] = x.E’ ;