Для простого индуктивного типа, такого как натуральные числа nat
, легко доказать, что два конструктора (ноль и преемник) дают все возможные натуральные числа,
Lemma nat_destruct (n : nat) : n = O \/ exists m : nat, n = S m.
Proof.
destruct n. left. reflexivity. right. exists n. reflexivity.
Qed.
Однако я слышал, что этоне все так просто для доказательства равенства.Существует только один конструктор равенства, eq_refl
, но Coq не может доказать, что
eq_destruct : forall (A : Type) (x : A) (prEq : x = x), prEq = eq_refl
Что именно блокирует это доказательство?Вероятно, первая проблема заключается в том, что равенство - это не просто тип, а семейство типов eq : forall A : Type, A -> A -> Prop
.Есть ли семейство более простых типов, где такое доказательство невозможно?С 1 или 2 аргументами вместо 3, может быть?