You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

熟用Agda的Lean用户困惑:等式类型rfl失效的类型不匹配问题

Lean里rfl突然失效?核心是这俩相等的区别

你熟Agda,转Lean碰到的rfl时灵时不灵,本质是定义相等和命题相等的差异——Agda里refl能覆盖的场景,Lean里rfl只认最严格的定义相等。

你的HashSet例子为啥rfl用不了?

FV (Λ.var "x") == HashSet.ofList ["x"]求值返回true,是因为HashSet的==是外延相等:只要两个集合的元素完全一样,就判定相等。但rfl要求的是定义相等——两个表达式经过Lean的归约规则(β/ι/δ)后,底层结构完全一致。

Lean的HashSet是哈希表实现的,ofList ["x"]生成的集合,和FV (Λ.var "x")输出的集合,哪怕元素相同,底层的哈希桶分布、存储结构可能不一样,所以它们不是定义相等,rfl自然证不了。

该怎么证明这种相等?

别死磕rfl,用Lean给集合相等准备的工具:

  • 用HashSet.ext引理:它的逻辑是“两个HashSet相等,当且仅当任意元素属于左边的同时也属于右边”
  • 举个具体写法:
    theorem fv_var_x : FV (Λ.var "x") = HashSet.ofList ["x"] :=
    HashSet.ext (fun s => by
      simp [FV, Λ.var] -- 展开FV和var的定义,让Lean自动判断元素归属的等价性
    )
    
  • 如果FV的定义就是直接生成包含变量的集合,甚至直接用simp就能把两边归约到可证明的状态,不用手动写太多。

最后补个Lean和Agda的相等差异

Agda的refl能通过rewrite、同余规则处理不少非定义相等的情况,但Lean的rfl是纯定义相等的判定工具,命题相等(=)大多需要靠引理、simp、rewrite这些手段来证明。

内容的提问来源于stack exchange,提问作者Joris KBos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:58:16