有没有一种好方法可以阻止 beta 减少自动出现在目标中?

Is there a good way to block beta-reduction from automatically occurring in goals?

假设你想证明 (fun (x : unit) => false) <> (fun (x : unit) => true)。证明这一点的明显方法是 intro 一些 H : (fun _ : unit => false) = (fun _ : unit => true) 并使用 H 进行重写以证明 false = (fun x => false) tt = (fun x => true) tt = true)。但是,如果您尝试这样做,Coq 将自动进行 beta reduce,并且您将不再有 (fun x => false)(fun x => true) 作为可以用 H.

重写的子项

我解决此类问题的方法是定义类似 app{X Y}(f : X -> Y)(x : X) := f x 的内容,然后使用 app 来阻止 beta 缩减。然而,这感觉有点老套,所以我想知道是否有更好的方法来避免这类问题。

I'm wondering if there's a nicer way to avoid these sorts of issues

Coq 在很多情况下会盲目地减少 β 值,而且没有什么好办法告诉它不要这样做。 (更糟糕的是,在我看来,Coq 假设它总是可以 ζ-reduce,如果你使用大量 lets,这会导致定义时的指数爆炸。)

我用来隐藏 β-redexes 的解决方案比你的更轻量级;她在标准库中有 id : forall {A}, A -> A,所以当我想阻止 β-reduction 时,我通常只是将我的 λs 包装在 id 中。

一个非常非常非常重量级的解决方案是使用像 RTac 这样的反射自动化,原则上它可以为您提供更细粒度的控制,或者推出您自己的 OCaml 策略库(或您自己的 rewrite)不会盲目地减少它不涉及的子项。

一个不同权重的解决方案是在错误跟踪器上打开一个错误,rewrite 不应该在它不会触及的子项中进行 β-reduce,并让 Coq 开发人员为您解决问题.