Coq-在不丢失信息的情况下对函数进行归纳
当我试图对函数的结果(返回归纳类型)执行案例分析时,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:
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”。