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

如何对有限类型间的函数进行分情况证明?(Lean新手求助)

证明Bool→Bool函数的迭代性质

在Lean中,无法直接对函数f : Bool → Bool使用cases,因为cases仅适用于归纳类型的值,而函数本身是依赖于输入的映射,不属于归纳构造子。不过Bool是有限类型(仅包含false和true两个值),我们可以通过枚举f在所有输入上的输出,来覆盖所有可能的函数情况。

方法1:用<;>串联多轮cases

利用<;>将分支策略批量应用到所有子目标,一步到位覆盖所有情况:

example (f : Bool -> Bool) : (∀ x : Bool, f (f (f x)) = f x) := by
  intro x
  -- 先拆分x的两种情况,再枚举f false和f true的所有组合,最后用rfl验证
  cases x <;> cases f false <;> cases f true <;> rfl
  • cases x:拆分x为false和true两个分支
  • <;> cases f false:对每个x的分支,再拆分f false的两种可能
  • <;> cases f true:对每个子分支,继续拆分f true的两种可能
  • <;> rfl:在所有最底层分支中,Lean会自动计算f(f(f x))和f x的结果,确认两者相等,rfl直接完成证明

方法2:用match枚举所有组合

更直观地列出所有可能的x、f false、f true组合,逐个验证:

example (f : Bool -> Bool) : (∀ x : Bool, f (f (f x)) = f x) := by
  intro x
  match x, f false, f true with
  | false, false, false => rfl
  | false, false, true => rfl
  | false, true, false => rfl
  | false, true, true => rfl
  | true, false, false => rfl
  | true, false, true => rfl
  | true, true, false => rfl
  | true, true, true => rfl

这种写法清晰展示了所有8种可能的场景(2种x × 2种f(false) × 2种f(true)),每个场景下函数的行为完全确定,rfl可直接验证等式成立。

核心思路

对于有限类型A → B的函数,只要枚举函数在A的所有元素上的输出值,就唯一确定了整个函数的行为。之后在每个枚举分支中,Lean可以直接计算函数迭代的结果,完成性质验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:55:18