形式陈述 ​
Elaboration 区分便于书写的 surface language 与规则精小的 core theory。可把核心接口写成两种带输出的判断:
前者从表面项
应用规则可先综合
完备性只能相对于明确的 surface 设计陈述:某些声明式可定型项需要用户注解、显式 motive 或搜索提示;高阶 unification 与实例搜索一般没有同时终止且完备的算法。Elaboration 失败也不等于核心命题不可证,只说明当前信息流和搜索策略未找到项。
直觉
表面语言允许人省略显然信息,核心语言要求机器把每个依赖关系写清。Elaborator 就像排版前的技术编辑:根据上下文补上宇宙层、隐式类型参数和强制运输,把模式子句重排成核心消去;最后由独立内核检查成稿,而不是要求用户信任编辑过程没有猜错。
依赖类型让这种补全具有反馈回路。选择一个隐式实参会改变后续参数的类型,后续显式实参又可能反过来确定先前的 metavariable。双向方向标记限制信息流,约束队列保存尚未确定的部分;二者共同把全局猜测缩小成可管理的局部求解,却不能消灭固有歧义。
例子与边界
设核心恒等函数为
表面项 id true 没写隐式
若期望类型已经是
调用 append xs ys 会从两个向量的类型恢复
边界例子是 λx. x 处在 synthesis 位置且没有注解:
推论与应用
Elaboration 把丰富语法与小可信内核分离。notation、type class、coercion、record projection 和 tactic 可以在不扩张核心证明规则的情况下加入,只要最终生成的项通过检查。这种架构还改善错误定位:约束记录了哪一个隐式选择导致类型冲突,编辑器可展示尚未解决洞的局部语境与目标。
分离也明确了信任边界。Elaborator 有 bug 时可能拒绝合法程序或生成错误项,但健全内核会拦下后者;若编译器绕过重检、让未解 metavariable 成为任意常量,可靠性便失效。性能优化如缓存规范形、增量约束求解和启发式实例搜索都必须保持最终 core judgment 不变。
参考资料
- Ulf Norell, Towards a Practical Programming Language Based on Dependent Type Theory, PhD thesis, Chalmers University of Technology, 2007,metavariables、dependent pattern matching 与 Agda elaboration。
- Jana Dunfield and Neel Krishnaswami, “Bidirectional Typing,” ACM Computing Surveys 54(5), 2021, Article 98,双向规则、注解与 elaboration 的可靠性/完备性框架。
- The Agda Team, Agda User Manual, “Implicit Arguments,” “Metavariables,” and “Coverage Checking” sections,现代依赖语言的 surface-to-core 机制,accessed 2026。