openlang

partial def 下 #eval 得到 111,但 rfl 和 decide 都失败。有没有不依赖 ofReduceBool 的可检查路径?

我有个小的审计工具,toolchain 是 leanprover/lean4:v4.15.0。步数计数器是个 partial def,因为没人有终止性证明。

partial def collatzSteps (n : Nat) (acc : Nat := 0) : Nat :=
  if n ≤ 1 then acc
  else if n % 2 == 0 then collatzSteps (n / 2) (acc + 1)
  else collatzSteps (3 * n + 1) (acc + 1)

def withinBudget (n : Nat) : Bool :=
  decide (collatzSteps n ≤ budget)

lake build 没有问题,#eval Audit.collatzSteps 27 得到 111。但在另一个单独的文件里是这样。

example : collatzSteps 6 = 8 := by rfl
theorem w27 : withinBudget 27 = true := by decide

两个都被拒绝了。报错说该项无法归约到预期的值。我怀疑过是默认参数和 Inhabited 实例的问题。显式写出 acc 并加上实例都没有任何变化。

native_decide 两个都能通过,但这时 #print axioms 会显示 Lean.ofReduceBool,这个我不接受。

我有两个问题。

  1. 为什么编译后的代码能算出这个,而内核和 decide 不行?
  2. 除了重写(比如改成带 fuel 的版本)之外,有没有办法得到一个经内核检查的、关于这个函数的结论?
从英语翻译查看原文

后续讨论 2

顺着彼此的依据读下去
  1. 固定链接

    就我所知,partial def 会被编译成一个不透明常量,所以内核没有东西可以展开。这就是为什么 #eval 能跑编译后的代码,而 rfl 和 decide 却失败。我记得参考手册里有讲这个 https://lean-lang.org/doc/reference/latest/

    要不写个 fuel 版本,证明它的性质,然后给它加上 @[extern],让编译后的代码用快的那个?你试过吗?

    从英语翻译查看原文

同一个问题的其他角度

  1. -race 报了 DATA RACE,可 ack 明明是无缓冲接收,是 time.After 的锅吗?

    会不会是竞态检测器在这里判断错了,还是我对 ack 提供的保证理解有误?这是 pushgate,一个小服务,给我的移动应用校验推送通知用的设备令牌上的 HMAC 签名。调用方在无缓冲的 channel 上发送一个 Request,worker 填好…

    回复 4最近活动 go
  2. 仅有一个 webhook 的 HMAC 不匹配(名字里带重音符号的那个)

    我写了个小的 Node 检查器(纯 JS,不需要构建步骤),用来重放保存下来的 webhook 投递,并在下游信任它们之前校验 HMAC-SHA256。三个里有两个能过。来自 billing-partner 的 evt_2044 失败了,但同一个合作…

    回复 7最近活动 typescriptjavascript
  3. memset 在 free 之前调用,默认编译选项下通过,OPT=-O2 时失败

    我在写一个叫 vault 的小型 C 凭据存储库,在 WSL 里构建。vault_release() 的作用是先擦除密钥再释放,代码如下 测试文件 tests/wipe_check.c 会先保存密钥指针,调用 vault_release(),然后从第…

    回复 6最近活动 c