Coq:如何证明“a = b - > nat_compare a b = Eq。”?

时间:2013-10-30 13:04:41

标签: coq theorem-proving

为了弄清楚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到达这一点,这似乎更有意义。)

现在,用纸笔,我只是声称这是我的归纳证据。

我是否以正确的方式接近这一点?哪里可以最好地学习如何正确地做到这一点?

1 个答案:

答案 0 :(得分:2)

我能用

来证明这一点
Theorem triv : forall a b, a = b -> nat_compare a b = Eq.
  intros; subst; induction b; auto.
Qed.

这里的诀窍是让诱导性假设存在。 destruct是一种较弱的induction形式,它不会为您提供此证明所需的归纳假设。