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

如何在定理证明中展开let表达式?解决unknown constant报错

局部let定义的函数无法用delta/unfold展开的原因及解决方法

问题根源

你用let在证明块内定义的F是局部绑定变量,并非全局命名空间下的常量。而delta和unfold这两个tactic的核心作用是展开全局定义的常量(比如用def在定理外声明的函数),它们会去_root_根命名空间查找对应的常量,但局部let的F根本没被注册到这里,所以会报unknown constant '_root_.F'的错误。

正确的处理方式

对于局部let绑定的变量,需要用能处理局部绑定的tactic来展开定义,常用的有:

  • dsimp [F]:简化局部绑定的表达式,直接展开F的定义
  • change 0 ≤ 1:手动替换F n为它的定义值(适合简单场景)
  • simp [F]:自动展开并完成后续简单证明

修正后的代码示例:

example : True := by
  let F : ℕ→ℕ := λ _ => 0
  have F_le_1 : ∀(n:ℕ), F n ≤ 1 := by
    intro n
    dsimp [F] -- 展开局部定义的F
    trivial -- 此时目标变为0 ≤ 1,直接完成证明
  trivial

补充差异说明

如果在定理外用def F : ℕ→ℕ := λ _ => 0定义,F会被注册为_root_.F全局常量,此时delta F就能正常找到并展开——这就是为什么全局定义不会报错的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:48:22