Пытаясь понять, что такое Coq, я оказался в ситуации, когда мне по сути нужно доказать, что a=b -> nat_compare a b = Eq
.
Я могу получить удобное начало, выполнив:
Coq < Theorem foo: forall (a:nat) (b:nat), a=b->nat_compare a b=Eq.
1 subgoal
============================
forall a b : nat, a = b -> nat_compare a b = Eq
foo < intros. rewrite H. destruct b.
что дает мне:
2 subgoals
a : nat
H : a = 0
============================
nat_compare 0 0 = Eq
subgoal 2 is:
nat_compare (S b) (S b) = Eq
Первый банален:
foo < simpl. reflexivity.
Но следующая цель ставит меня в тупик:
1 subgoal
a : nat
b : nat
H : a = S b
============================
nat_compare (S b) (S b) = Eq
я могу сделать
foo < rewrite <- H.
который дает:
1 subgoal
a : nat
b : nat
H : a = S b
============================
nat_compare a a = Eq
(Я также могу добраться до этой точной точки через simpl
, что кажется более логичным.)
Теперь, с ручкой на бумаге, я бы просто заявил, что вот мое доказательство по индукции.
Правильно ли я подхожу к этому? Где мне лучше всего научиться делать это правильно?
Fixpoint nat_compare n m := match n, m with | O, O => Eq | O, S _ => Lt | S _, O => Gt | S n', S m' => nat_compare n' m' end.
. Поскольку я абсолютный новичок в Coq, эта функция может быть совершенно неправильной для использования при сравнении чисел, но... - person aleator   schedule 30.10.2013