Основной ответ
Прежде чем начать доказательство своей теоремы, вы должны попытаться тщательно понять, что говорит ваша теорема. Ваша теорема просто неверна.
Контрпример: 2 :: [1;2] = rev [1;2] ++ [2]
, но [1;2]
не является палиндромом.
Полное доказательство:
Require Import List.
Import ListNotations.
Lemma reverse_append_false :
~(forall (T : Type) (h : T) (t : list T), h::t = rev(t) ++ [h] -> t = rev(t)).
Proof. intros H. specialize (H nat 2 [1;2] eq_refl). inversion H. Qed.
Незначительные проблемы
rev(t)
должно быть просто rev t
. Просто эстетический момент, но, вероятно, вам стоит познакомиться с написанием в стиле функционального программирования.
Обычно теоремы о списках доказываются с помощью индукции
Это довольно наивное утверждение, хотя и технически правильное. Есть так много способов индукции по значению, и выбор индукции, которая работает лучше всего, является критически важным навыком. Чтобы назвать несколько:
- Индукция в списке
- Индукция по длине списка
- возникает довольно часто при работе с
rev
и другими функциями, сохраняющими длину
- Если простая индукция не работает, рассмотрите собственную схему индукции