|
楼主 |
发表于 2006-12-7 09:49:25
|
显示全部楼层
【 以下文字转载自 CompLang 讨论区 】
【 原文由 starfish 所发表 】
- 3. λ-演算的语法
- 【定义1】λ-演算的字母表由以下组成:
- ●变元集合:Δ = {v, v', v'', v''', …}, Δ无穷
- ●抽象算子:λ
- ●括号:(, )
- 【定义2】λ-项的集合Λ归纳定义为满足以下条件的最小集合:
- ● x ∈Δ → x ∈ Λ
- ● M, N ∈Λ → (MN) ∈ Λ
- ● M ∈Λ, x ∈Δ → (λx M) ∈ Λ
- 若用BNF(Backus Normal Form)表示,则有
- Δ ::= v | Δ'
- Λ ::= Δ | (ΛΛ) | (λΔΛ)
- 【定义3】我们做以下约定:
- ● x, y, z, … 表示任意变元;
- ● M, N, L, … 表示任意λ项;
- ● M ≡ N 表示M和N语法恒同;
- ● 通常采用以下省略括号表示法:
- (i) F M_1 M_2 … M_n ≡ (…((F M_1) M_2)…M_n) (左结合)
- (ii) λx_1x_2…x_n. M ≡ (λ x_1 (λ x_2 (…(λx_n M)…) ) )
- ● 设 P ≡ M N_1 N_2 … N_k (k ≥ 0),当k=0时,P ≡ M;
- 设 P ≡ λx_1x_2…x_k. M (k ≥ 0),当k=0时,P ≡ M。
- 【定义4】设M ∈ Λ,M的长度ρ(M)被定义为M中变元出现的次数,即
- ● ρ(x) = 1, x ∈Δ
- ● ρ(MN) = ρ(M) + ρ(N)
- ● ρ(λx. M) = ρ(M) + 1
- 以后我们说对M的结构作归纳是指对M的长度ρ(M)作归纳,这是自然数上的
- 归纳。
- 【定义5】设M∈Λ,对M的结构作归纳,定义M的子项集合Sub(M)如下:
- ● Sub(x) = {x} , x ∈Δ
- ● Sub(N_1 N_2) = Sub(N_1) ∪ Sub(N_2) ∪ { N_1N_2 }
- ● Sub(λx.N ) = Sub(N) ∪ {λx.N }
- 若N ∈ Sub(M),则称N为M的子项。
- 例如:y为 λx.yy 的子项,但是x不是 λx.yy 的子项。
- 【定义6】设M ∈Λ,
- ● M 的自由变元集合 FV(M) 归纳定义如下:
- FV(x) = {x}
- FV(N_1N_2) = FV(N1) ∪ FV(N_2)
- FV(λx.N ) = FV(N) - {x}
- ● 若x出现于M中,且x不属于FV(M),则称x是约束的。
- ● 若FV(M)为空集,则称M为闭λ-项(或组合子),且记全
- 体闭λ-项的集合为 Λ* 。
- 例如 M ≡ λx. yxy ,则其中x 是约束变元,y是自由变元。
- N ≡ λxy. yxy 是一个闭λ-项。
- 事实上约束变元和自由变元的概念在数学的其他领域也出现过,
- 例如在微积分中
- ∫(3xy+x-y) dx
- 这里dx其实就表明在3xy+x-y中x是约束变元。
- 【定义7】上下文(Contexts)
- λ上下文集合C[]定义为满足下列条件的最小集合:
- ● x ∈C[]
- ● [] ∈ C[]
- ● C_1[], C_2[] ∈ C[] → (C_1[]C_2[]) ∈ C[]
- ● C_1[] ∈ C[] → (λx. C_1[]) ∈ C[]
- 上下文中的空白用一个[]表示。引入上下文的概念是为了方便以后的讨论。
- 例如
- C_1[] = (λx. []x) M
-
- 则
- C_1[λy.y] = (λx. (λy.y) x) M
- 换句话说,C_1[N] 就是把 C_1[] 中的 [] 出现的地方都填入 N。这种填入
- 替换和前面说的 M[x:=N] 不同,M[x:=N] 要把M中所有自由出现的x替换成N,
- 并且N本身可能也会适当地改变。但是C_1[N]的替换则是把所有的[]都换成N,
- 且N不做任何改变。
- 另外需要注意的是,FV[M]中的变元在 C[M] 中可能会变成约束变元。
复制代码 |
|