为了弄清楚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
到达这一点,这似乎更有意义。)
现在,用纸笔,我只是声称这是我的归纳证据。
我是否以正确的方式接近这一点?哪里可以最好地学习如何正确地做到这一点?
答案 0 :(得分:2)
我能用
来证明这一点Theorem triv : forall a b, a = b -> nat_compare a b = Eq.
intros; subst; induction b; auto.
Qed.
这里的诀窍是让诱导性假设存在。 destruct
是一种较弱的induction
形式,它不会为您提供此证明所需的归纳假设。