当我尝试对函数的结果(返回归纳类型)执行案例分析时,我在Coq中遇到了一些麻烦。使用常规策略时,如elim
,induction
,destroy
等,信息会丢失。
我举一个例子:
我们首先有这样的功能:
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 = true
或f n = false
的信息,与其他假设一起使用等。
有没有办法做第二个选项?
我尝试使用像cut(f n = false \/ f n = true)
这样的东西,但它变得非常无聊,特别是当我连续几次“特殊”导入时。我想知道是否有一些基本上与上面cut
完全相同的东西,但是战术/证据更少
答案 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 *.
希望它有所帮助, 诉