有没有一种好方法可以阻止 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,如果你使用大量 let
s,这会导致定义时的指数爆炸。)
我用来隐藏 β-redexes 的解决方案比你的更轻量级;她在标准库中有 id : forall {A}, A -> A
,所以当我想阻止 β-reduction 时,我通常只是将我的 λs 包装在 id
中。
一个非常非常非常重量级的解决方案是使用像 RTac 这样的反射自动化,原则上它可以为您提供更细粒度的控制,或者推出您自己的 OCaml 策略库(或您自己的 rewrite
)不会盲目地减少它不涉及的子项。
一个不同权重的解决方案是在错误跟踪器上打开一个错误,rewrite
不应该在它不会触及的子项中进行 β-reduce,并让 Coq 开发人员为您解决问题.
假设你想证明 (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,如果你使用大量 let
s,这会导致定义时的指数爆炸。)
我用来隐藏 β-redexes 的解决方案比你的更轻量级;她在标准库中有 id : forall {A}, A -> A
,所以当我想阻止 β-reduction 时,我通常只是将我的 λs 包装在 id
中。
一个非常非常非常重量级的解决方案是使用像 RTac 这样的反射自动化,原则上它可以为您提供更细粒度的控制,或者推出您自己的 OCaml 策略库(或您自己的 rewrite
)不会盲目地减少它不涉及的子项。
一个不同权重的解决方案是在错误跟踪器上打开一个错误,rewrite
不应该在它不会触及的子项中进行 β-reduce,并让 Coq 开发人员为您解决问题.