Применить функцию к обеим сторонам равенства в 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 завершит доказательство.

теперь, возможно, есть лучший способ доказать эту конкретную теорему (edit: есть, я сделал это по-другому), но поскольку это в целом кажется полезной вещью, как изменить цель равенства в Coq, применив функцию к обеим сторонам?

примечание: Я понимаю, что это не будет работать для любой произвольной функции: например, можно используйте его, чтобы доказать, что -1 = 1 С применением abs для обеих сторон. Однако это справедливо для любой инъективной функции (для которой f a = f b -> a = b), которая negb есть. Возможно, лучший вопрос, который нужно задать, тогда дается функция, которая работает на предложении (например, negb x = negb y -> x = y), как я могу использовать эту функцию для изменения текущей цели?

1 ответов


кажется, что вы просто хотите apply тактика. Если у вас есть Лемма negb_inj : forall b c, negb b = negb c -> b = c, doing apply negb_inj на своей цели даст вам именно это.