Ваш пример предполагает противоречивые гипотезы: они подразумевают, что length l + 2
равно length l + 1
.
Require Import Coq.Lists.List.
Require Import Omega.
Example foo : forall (X : Type) (x y z : X) (l j : list X),
x :: y :: l = z :: j ->
y :: l = x :: j ->
x = y.
Proof.
intros X x y z l j eq1 eq2.
apply (f_equal (@length _)) in eq1.
apply (f_equal (@length _)) in eq2.
simpl in *.
omega.
Qed.
По принципу взрыва неудивительно, что Coq способен вывести противоречивыеcontext.
Помимо этой небольшой странности, нет ничего плохого в том, что сгенерированные гипотезы противоречивы: такие контексты могут возникать, даже если исходные гипотезы непротиворечивы.Рассмотрим следующее (заведомо надуманное) доказательство:
Goal forall b c : bool, b = c -> c = b.
Proof.
intros b c e.
destruct b, c.
- reflexivity.
- discriminate.
- discriminate.
- reflexivity.
Qed.
Вторая и третья ветви имеют противоречивые гипотезы (true = false
и false = true
), даже если исходная гипотеза b = c
безвредна.Этот пример немного отличается от исходного, потому что противоречие не было получено путем объединения гипотез.Вместо этого, когда мы вызываем destruct
, мы обещаем Coq доказать заключение, рассматривая несколько подцелей, полученных в результате анализа случаев.Если некоторые из подзадач окажутся противоречивыми, даже лучше: там не будет никакой работы.