有没有一种很好的方法来阻止目标中自动发生的β减少?

时间:2017-10-07 17:11:15

标签: 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缩减,您将不再使用(fun x => false)(fun x => true)作为可以使用H重写的子句。

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

1 个答案:

答案 0 :(得分:2)

  

我想知道是否有更好的方法来避免这些问题

在很多情况下,coq盲目地降低β,并且没有好的方法告诉它不要。 (更糟糕的是,在我看来,Coq假设它总是ζ-减少,如果你使用了很多let s,这可能导致在定义时间呈指数性爆炸。)

我用来隐藏β重新索引的解决方案比你的重量轻一点;她在标准库中有id : forall {A}, A -> A,所以当我想阻止β减少时,我通常只将{λ= 1}包裹起来。

更多,更重要的解决方案是使用反射式自动化,如RTac,原则上可以为您提供更细粒度的控制,或者滚动您自己的OCaml战术库(或您自己的id)在子宫中盲目地减少β-减少它不会接触。

一个不同权重的解决方案是在错误跟踪器上打开一个错误,rewrite不应该在它没有触及的子类中减少错误,并让Coq dev为你解决问题。< / p>