Coq-在不丢失信息的情况下对函数进行归纳

Coq-在不丢失信息的情况下对函数进行归纳,coq,induction,Coq,Induction,当我试图对函数的结果(返回归纳类型)执行案例分析时,Coq遇到了一些问题。当使用通常的策略时,如elim,归纳法,销毁等,信息会丢失 我举个例子: 我们首先有这样一个函数: Definition f(n:nat): bool := (* definition *) 现在,假设我们在证明一个特定定理的这一步: n: nat H: f n = other_stuff ------ P (f n ) 当我应用一种策略时,比如说,归纳法(fn),会发生以下情况: Subgoal 1 n:nat H:

当我试图对函数的结果(返回归纳类型)执行案例分析时,Coq遇到了一些问题。当使用通常的策略时,如
elim
归纳法
销毁
等,信息会丢失

我举个例子:

我们首先有这样一个函数:

Definition f(n:nat): bool := (* definition *)
现在,假设我们在证明一个特定定理的这一步:

n: nat
H: f n = other_stuff
------
P (f n )
当我应用一种策略时,比如说,
归纳法(fn)
,会发生以下情况:

Subgoal 1
n:nat
H: true = other_stuff
------
P true

Subgoal 2
n:nat
H: false = other_stuff
------
P false
但是,我想要的是这样的:

Subgoal 1
n:nat
H: true = other_stuff
H1: f n = true
------
P true

Subgoal 2
n:nat
H: false = other_stuff
H1: f n = false 
------
P false
在它实际工作的过程中,我丢失了信息,特别是关于
fn
的任何信息。在我处理的问题中,我需要使用
fn=true
fn=false
的信息,以便与其他假设一起使用,等等。 有没有办法做第二个选择?
我尝试过使用像
cut(fn=false\/fn=true)
这样的东西,但它变得非常烦人,特别是当我连续使用了几个这样的“特殊”归纳法时。我想知道是否有一些东西基本上与上面的
cut
完全一样,但是使用较少的策略/证明

问题在于,你对一个构造的术语而不是一个变量执行
归纳
。事实证明,将信息保存在您的案例中是一个非常困难的问题

通常的解决方法是使用
记住
策略提取构造的术语。我现在还不知道确切的语法,但是你应该试试

remember (f n) as Fn. (* this introduces an equality HeqFn : Fn = f n *)
revert f n HeqFn. (* this is useful in many cases, but not mandatory *)
induction Fn; intros; subst in *.
希望有帮助,
V.

谢谢!它确实对我有用,但我必须这样做:
记住(Fn)为Fn。
然后是
归纳Fn。
它对Fn进行归纳(在这种情况下,一个子目标为
,一个子目标为
),但在HeqFn中保留了关于(Fn)的信息,要么
HeqFn:true=fn
要么
HeqFn:false=fn
。干杯(编辑:
revert f n HeqFn
对我来说是不必要的。不知道你是否应该把它保留在答案中)很高兴知道,在我的经历中,我总是不得不使用
revert
。很高兴收到其他用户的反馈:D谢谢!我试着还原,但那只是把“H |-G”改成了“|-H->G”(即介绍的反面)。不知道这在这种情况下有多有用:当你有一个比
fn
稍微复杂一点的术语时,PIt就变得有用了,例如,使用其他变量/参数。如果您需要归纳假设非常强大,您可能需要还原这些变量/参数(这也迫使您还原等式)。我只是意识到这是我的情况,因此我总是恢复平等。在这种情况下,我通常使用“case_eq”策略而不是“destruct”。