在Coq中将一个函数应用于相等的两边?

时间:2014-11-21 20:09:17

标签: coq

我在Coq试图证明

Theorem evenb_n__oddb_Sn : ∀n : nat,
  evenb n = negb (evenb (S n)).

我在n上使用归纳法。基本案例是微不足道的,所以我在归纳案例中,我的目标看起来像:

k : nat
IHk : evenb k = negb (evenb (S k))
============================
 evenb (S k) = negb (evenb (S (S k)))

现在当然存在断言

的函数的基本公理
a = b -> f a = f b

适用于所有功能f : A -> B。所以我可以将negb应用于双方,这会给我

k : nat
IHk : evenb k = negb (evenb (S k))
============================
 negb (evenb (S k)) = negb (negb (evenb (S (S k))))

哪个让我从右到左使用我的归纳假设,右边的否定会相互抵消,evenb的定义将完成证明。

现在,可能有更好的方法来证明这个特定的定理(编辑:有,我做了另一种方式),但是因为这通常看起来是一件有用的事情,所以通往通过向双方应用函数来修改Coq中的相等目标?

注意:我意识到这对任何任意函数都不起作用:例如,您可以通过将-1 = 1应用于双方来证明abs。但是,它适用于任何内射函数(f a = f b -> a = b),negb。或许,更好的问题是,给出一个对命题进行操作的函数(例如,negb x = negb y -> x = y),我该如何使用该函数来修改当前目标?

1 个答案:

答案 0 :(得分:2)

您似乎只想要apply策略。如果您有一个引理negb_inj : forall b c, negb b = negb c -> b = c,那么对您的目标执行apply negb_inj会给您一个确切的结果。