Lemma rev_firstn : forall (x : list bool) (n : nat),
rev (firstn n x) = firstn n (rev x).
Я потратил немало времени на это.Я начинаю с разумной цели, но всегда заканчиваю целью, которую невозможно доказать.
Вот мой нынешний подход:
Proof.
intros. generalize dependent x. induction n.
+ easy.
+ induction x.
- easy.
-
В моем контексте у меня теперь есть:
IHn : forall x : list bool, rev (firstn n x) = firstn n (rev x)
IHx : rev (firstn (S n) x) = firstn (S n) (rev x)
и моя цель:
rev (firstn (S n) (a :: x)) = firstn (S n) (rev (a :: x))
Есть ли способ обобщить x в IHx, чтобы я мог специализировать его на (a :: x)?Поскольку я не знаю правильной тактики для этого, я пробую следующее и в конечном итоге получаю ранее упомянутую невозможную цель.
Proof.
intros. generalize dependent x. induction n.
+ easy.
+ induction x.
- easy.
- assert (rev_cons : forall (b : bool) (l : list bool),
rev (b :: l) = rev l ++ [b]).
{ easy. } rewrite firstn_cons.
rewrite rev_cons. rewrite rev_cons. specialize (@IHn x).
rewrite IHn.
Goal: firstn n (rev x) ++ [a] = firstn (S n) (rev x ++ [a])
Эта цель невозможна, потому что для n = 0 и rev x =h :: t, цель уменьшается до [a] = List.hd (rev (h :: t)) ++ [a]
.
Эта лемма на самом деле несостоятельна или я просто упускаю какую-то тактику?