Coq - 功能感应而不会丢失信息

时间:2013-12-12 21:20:57

标签: coq induction

当我尝试对函数的结果(返回归纳类型)执行案例分析时,我在Coq中遇到了一些麻烦。使用常规策略时,如eliminductiondestroy等,信息会丢失。

我举一个例子:

我们首先有这样的功能:

Definition f(n:nat): bool := (* definition *)

现在,想象一下我们在特定定理的证明中的这一步:

n: nat
H: f n = other_stuff
------
P (f n )

当我应用一种策略时,比如说induction (f n),就会发生这种情况:

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

在它实际运作的方式上,我丢失了信息,特别是我丢失了有关f n的任何信息。在我使用的问题中,我需要使用f n = truef n = false的信息,与其他假设一起使用等。 有没有办法做第二个选项? 我尝试使用像cut(f n = false \/ f n = true)这样的东西,但它变得非常无聊,特别是当我连续几次“特殊”导入时。我想知道是否有一些基本上与上面cut完全相同的东西,但是战术/证据更少

1 个答案:

答案 0 :(得分:3)

问题是您对构造的术语执行induction,而不是单个变量。事实证明,保存信息是一个非常困难的问题。

通常的解决方法是使用remember策略抽象构造的术语。我现在没有确切的语法,但你应该尝试像

这样的东西
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 *.

希望它有所帮助, 诉