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

Coq 有没有一种好方法可以阻止beta减少自动发生在目标中?,coq,Coq,假设您希望证明(fun(x:unit)=>错误)(fun(x:unit)=>正确)。证明这一点的明显方法是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重写这些子项 我解决这类问题的方法是定义类似于ap

假设您希望证明
(fun(x:unit)=>错误)(fun(x:unit)=>正确)
。证明这一点的明显方法是
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{xy}(f:X->Y)(X:X):=fx
,然后使用
app
阻止beta减少。然而,这感觉有点不舒服,所以我想知道是否有更好的方法来避免这些问题

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

在许多情况下,Coq盲目地降低β,并且没有好的方法告诉它不要这样做。(更糟糕的是,在我看来,Coq假设它总是ζ-reduce,如果使用大量的
let
s,这可能会导致定义时的指数膨胀。)

我用来隐藏β-redex的解决方案比你的要轻一点;她在标准库中有
id:forall{A},A->A
,所以当我想要阻止β-归约时,我通常只在
id
中包装我的λs

一个非常、非常、非常重要的解决方案是使用反射式自动化,如RTac,它原则上为您提供更细粒度的控制,或者使用您自己的OCaml策略库(或您自己的
rewrite
),它不会盲目减少不涉及的子项中的β-减少

另一个不同的权重解决方案是在bug跟踪器上打开一个bug,
rewrite
不应该在它没有触及的子项中β-减少,然后让Coq开发人员为您解决这个问题

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

在许多情况下,Coq盲目地降低β,并且没有好的方法告诉它不要这样做。(更糟糕的是,在我看来,Coq假设它总是ζ-reduce,如果使用大量的
let
s,这可能会导致定义时的指数膨胀。)

我用来隐藏β-redex的解决方案比你的要轻一点;她在标准库中有
id:forall{A},A->A
,所以当我想要阻止β-归约时,我通常只在
id
中包装我的λs

一个非常、非常、非常重要的解决方案是使用反射式自动化,如RTac,它原则上为您提供更细粒度的控制,或者使用您自己的OCaml策略库(或您自己的
rewrite
),它不会盲目减少不涉及的子项中的β-减少


另一个不同的权重解决方案是在bug跟踪器上打开一个bug,该bug不应该在它没有触及的子项中进行β-减少,然后找一个Coq dev来为您解决这个问题。

我只会使用一个辅助引理
引理eq_f A B(f g:A->B):f=g->forall x,fx=gx.
解决这个特殊问题的另一种方法是在H中应用(f_equal(fun f=>ftt))?我不能重现你的问题——一切对我来说都很好。我只会使用一个辅助引理
引理eq\f A B(fg:A->B):f=g->forall x,fx=gx。
解决这个特殊问题的另一种方法是在H中应用(f\u equal(fun f=>ftt))。你的证明脚本是什么样的?我无法重现你的问题——我觉得一切都很好。