简单类型化λ演算Skill simply-typed-lambda-calculus

这个技能用于实现简单类型化λ演算(STLC),包括函数类型、积类型、和类型和单位类型。它适用于学习类型系统、构建编程语言解释器、进行形式化验证和语言原型设计。关键词:类型系统、λ演算、解释器、形式化验证、编程语言理论、健全性证明。

其他 0 次安装 0 次浏览 更新于 3/13/2026

name: simply-typed-lambda-calculus description: ‘实现带有积、和和单位类型的简单类型化λ演算。使用场景:(1) 学习类型系统,(2) 构建解释器,(3) 形式化语言。’ version: 1.0.0 tags:

  • 类型系统
  • λ演算
  • stlc
  • 基础 difficulty: 初学者 languages:
  • python
  • ocaml
  • haskell dependencies:
  • lambda-calculus-interpreter

简单类型化λ演算

实现简单类型化λ演算(STLC)及其扩展。

何时使用

  • 学习类型系统
  • 构建解释器
  • 形式化验证
  • 语言原型设计

这个技能做什么

  1. 实现基础STLC - 函数、变量
  2. 添加积类型 - 对、投影
  3. 添加和类型 - 标记联合
  4. 证明健全性 - 进展 + 保持

如何使用

  1. 定义类型和项的语法
  2. 实现类型判断 Γ ⊢ e : τ
  3. 实现小步评估
  4. 为每个归约规则证明进展和保持

关键概念

概念 描述
函数类型 τ₁ → τ₂(箭头)
积类型 τ₁ × τ₂(对)
和类型 τ₁ + τ₂(标记联合)
单位 终端对象
健全性 进展 + 保持

扩展

扩展 描述
多态性 类型变量(系统F)
递归 不动点组合子
引用 可变状态
子类型 宽度/深度子类型

提示

  • 从基础STLC开始
  • 一次添加一个特性
  • 增量证明健全性
  • 使用德布鲁因索引进行绑定

经典参考文献

参考 为何重要
Barendregt, “The Lambda Calculus” λ演算变体的权威参考
Pierce, “Types and Programming Languages”, Ch. 5-9 带有积、和、递归类型的STLC
Girard, Lafont, Taylor, “Proofs and Types” 系统F和类型理论基础
Mitchell, “Foundations for Programming Languages” 全面的类型系统覆盖

相关技能

  • lambda-calculus-interpreter - 无类型λ演算
  • type-checker-generator - 类型检查器
  • dependent-type-implementer - 依赖类型理论

研究工具与工件

形式化STLC的证明辅助工具:

形式化 证明辅助工具 学习内容
TAPL in Coq Coq 完整的健全性证明
Software Foundations Coq 教学性开发
Homotopy Type Theory Agda 高阶归纳类型
PFPL Coq Pierce的形式化

关键实现

  • OCaml的类型系统 - 工业级STLC带扩展
  • GHC Core - STLC带let浮动优化
  • STLC in Lean - 类型理论的元编程

研究前沿

1. 规范化

  • 目标:证明评估总是终止
  • 技术:逻辑关系、可约候选
  • 论文:Girard, Lafont & Taylor “Proofs and Types”(第4-6章);Tait方法
  • 应用:证明辅助工具、终止检查

2. 项的表征

  • 目标:在STLC中可定义的函数是什么?
  • 关键结果:STLC项是强规范化的(没有递归/不动点时不图灵完备)
  • 论文:“The Church-Rosser Property”(Curry & Feys)
  • 技术:可约候选

3. 语义回读

  • 目标:从正规形式重构项
  • 技术:通过评估进行规范化(NbE)
  • 论文:“Normalization by Evaluation”(Berger & Schwichtenberg)
  • 应用:具体化、证明提取

实现陷阱

陷阱 症状 解决方案
缺少箭头类型情况 未检查的函数类型崩溃 在所有情况下处理TFun
错误的环境作用域 闭包捕获错误的值 深拷贝或逃逸分析
替换顺序 Alpha重命名冲突 使用德布鲁因索引
保持证明缺口 归约后类型变化 为每个规则证明引理

“类型保持非显然”的教训

每个评估规则都需要一个保持证明:

# 对于App:如果 ⊢ e1 : A→B 且 ⊢ e2 : A
#          且 e1 e2 → e'[e2/x]
#          则 ⊢ e'[e2/x] : B

# 需要替换引理:
# 如果 Γ, x:A ⊢ e : B 且 Γ ⊢ v : A
# 则 Γ ⊢ e[x↦v] : B

这就是为什么STLC健全性需要努力证明!