Вот индуктивные и вычислительные определения четности натуральных чисел.
Inductive ev : nat -> Prop :=
| ev_0 : ev O
| ev_SS : forall n:nat, ev n -> ev (S (S n)).
Definition even (n:nat) : Prop :=
evenb n = true.
И доказательство того, что одно влечет за собой другое.
Theorem ev__even : forall n,
ev n -> even n.
intros n E.
induction E as [ | n' E' ].
reflexivity. apply IHE'. Qed.
Сначала я не особо задумывался об этом доказательстве, но при более внимательном рассмотрении обнаружил, что кое-что беспокоит. Проблема в том, что после шага reflexivity
я ожидаю увидеть контекст
1 subgoal
n' : nat
E : ev (S (S n'))
E' : ev n'
IHE' : ev n' -> even n'
====================================================================== (1/1)
even (S (S n'))
Но вместо этого я получаю
1 subgoal
n' : nat
E' : ev n'
IHE' : even n'
====================================================================== (1/1)
even (S (S n'))
Хотя теорема все еще доказуема как есть, тревожно видеть, как гипотезы таинственным образом исчезают. Я хотел бы знать, как получить контекст, на который я изначально рассчитывал. Из веб-поиска я понял, что это общая проблема индукции по построенным терминам в Coq. Одно из предлагаемых решений для SO предлагает использовать remember
тактику для проверки гипотез. хранится. Но когда я пробую это в доказательстве,
Theorem ev__even : forall n,
ev n -> even n.
intros n E.
remember E.
induction E as [ | n' E' ].
На шаге induction
появляется следующее сообщение об ошибке.
Error: Abstracting over the term "n" leads to a term
"fun n : nat => forall e : ev n, e = E -> even n" which is ill-typed.
Что я не очень понимаю. Я думаю, что проблема в том, что E
имеет свободную переменную, но в этом случае я бы застрял, поскольку невозможно ввести E
, не вводя также n
. (generalize dependent n
обобщил бы E
этим)
Есть ли способ получить изначально ожидаемый контекст?
E : ev (S (S n'))
иIHE' : ev n' -> even n'
- person Konstantin Weitz   schedule 28.06.2014forall P, P 0 -> P 1 -> (forall n, P n -> P (S (S n))) -> forall n, P n
, тогдаev
будет встречаться в гипотезе индукции, как вы и ожидали. Принцип индукции дляev
-ev_ind
, который имеет типforall P, P 0 -> (forall n, ev n -> P n -> P (S (S n))) -> forall n, ev n -> P n
. При выполнении индукции дляev
вы не должны ожидать, чтоev
будет предпосылкой гипотезы индукции, точно так же, как при выполнении индукции дляnat
вы не должны ожидать, чтоnat
будет универсально определен количественно в гипотезе индукции. - person   schedule 29.06.2014