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