假设您想证明(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缩减,您将不再使用(fun x => false)
和(fun x => true)
作为可以使用H
重写的子句。
我解决这类问题的方法是定义类似app{X Y}(f : X -> Y)(x : X) := f x
的内容,然后使用app
来阻止beta减少。然而,这感觉有点hacky所以我想知道是否有更好的方法来避免这些问题。
答案 0 :(得分:2)
在很多情况下,coq盲目地降低β,并且没有好的方法告诉它不要。 (更糟糕的是,在我看来,Coq假设它总是ζ-减少,如果你使用了很多我想知道是否有更好的方法来避免这些问题
let
s,这可能导致在定义时间呈指数性爆炸。)
我用来隐藏β重新索引的解决方案比你的重量轻一点;她在标准库中有id : forall {A}, A -> A
,所以当我想阻止β减少时,我通常只将{λ= 1}包裹起来。
更多,更重要的解决方案是使用反射式自动化,如RTac,原则上可以为您提供更细粒度的控制,或者滚动您自己的OCaml战术库(或您自己的id
)在子宫中盲目地减少β-减少它不会接触。
一个不同权重的解决方案是在错误跟踪器上打开一个错误,rewrite
不应该在它没有触及的子类中减少错误,并让Coq dev为你解决问题。< / p>