Как заставить coq упростить выражения внутри гипотезы импликации
Я пытаюсь доказать следующую лемму:
Inductive even : nat → Prop :=
| ev_0 : even 0
| ev_SS (n : nat) (H : even n) : even (S (S n)).
Lemma even_Sn_not_even_n : forall n,
even (S n) <-> not (even n).
Proof.
intros n. split.
+ intros H. unfold not. intros H1. induction H1 as [|n' E' IHn].
- inversion H.
- inversion_clear H. apply IHn in H0. apply H0.
+ unfold not. intros H. induction n as [|n' E' IHn].
-
Qed.
Вот что я получил в конце:
1 subgoal (ID 173)
H : even 0 -> False
============================
even 1
Я хочу, чтобы coq оценил "четные 0" в true и "даже 1" в false. Я старался simpl
, apply ev_0 in H.
но они дают ошибку. Что делать?
1 ответ
Решение
Ответ на заголовок
simpl in H.
Реальный ответ
Приведенный выше код не будет работать.
Определение even
из книги "Логические основы" есть:
Inductive even : nat → Prop :=
| ev_0 : even 0
| ev_SS (n : nat) (H : even n) : even (S (S n)).
even 0
это опора, а не бул. Похоже, вы смешиваете типы True
а также False
и логические значения true
а также false
, Это совершенно разные вещи, и они не взаимозаменяемы по логике Кока. Короче, even 0
не упрощает true
или же True
или что-нибудь. Просто even 0
, Если вы хотите показать even 0
логически верно, вы должны построить значение этого типа.
Я не помню, какая тактика доступна в тот момент в LF, но вот некоторые возможности:
(* Since you know `ev_0` is a value of type `even 0`,
construct `False` from H and destruct it.
This is an example of forward proof. *)
set (contra := H ev_0). destruct contra.
(* ... or, in one step: *)
destruct (H ev_0).
(* We all know `even 1` is logically false,
so change the goal to `False` and work from there.
This is an example of backward proof. *)
exfalso. apply H. apply ev_0.