Мне было интересно, есть ли способ ввести совершенно новую переменную во время доказательства теоремы в Coq?
В качестве полного примера рассмотрим следующее свойство отсюда о равномерности длины списка.
Inductive ev_list {X:Type}: list X -> Prop :=
| el_nil : ev_list []
| el_cc : forall x y l, ev_list l -> ev_list (x :: y :: l).
Теперь я хочу доказать, что для любого списка l
, если его length
четный, то ev_list l
выполняется:
Lemma ev_length__ev_list': forall X (l : list X), ev (length l) -> ev_list l.
Proof.
intros X l H.
который дает:
1 subgoals
X : Type
l : list X
H : ev (length l)
______________________________________(1/1)
ev_list l
Теперь я хотел бы определить новую свободную переменную n
и гипотезу n = length l
. В рукописной математике, я думаю, мы можем это сделать, а затем провести индукцию около n
. Но есть ли способ сделать то же самое в Coq?
Примечание. Я спрашиваю по следующим причинам:
Я не хочу вводить это
n
искусственно в формулировку самой теоремы, как это сделано на странице, указанной ранее, что ИМХО неестественно.Я пробовал
induction H.
, но, похоже, не работает. Coq не смог провести анализ случаяlength l
ev
, и гипотеза индукции (IH) не была сформирована.
Спасибо.