Coq:如何证明;a=b->;nat_比较a b=等式;?

Coq:如何证明;a=b->;nat_比较a b=等式;?,coq,theorem-proving,Coq,Theorem Proving,为了理解Coq的含义,我最终陷入了这样一种情况:我需要证明a=b->nat\u比较a=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. rewrit

为了理解Coq的含义,我最终陷入了这样一种情况:我需要证明
a=b->nat\u比较a=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.
第一点很简单:

foo < simpl. reflexivity.
我能行

foo < rewrite <- H.
(我也可以通过
siml
达到这一点,这似乎更有意义。)

现在,用笔和纸,我只能说这是我的归纳法证明


我是否以正确的方式来处理这个问题?我在哪里可以最好地学习如何正确地做到这一点?

我能够用

Theorem triv : forall a b, a = b -> nat_compare a b = Eq.
  intros; subst; induction b; auto.
Qed.

这里的诀窍是把归纳假设放在一边
destruct
是一种较弱的
归纳法
形式,它不会给你这个证明所需的归纳假设。

@jozefg它比较了两种NAT。它在coq标准库中定义为“
fixtpoint nat|u compare n m:=将n,m与| O,O=>Eq | O,S=>Lt | S |,O=>Gt | sn',S m'=>nat u compare n'm'end.
”。因为我是Coq的绝对初学者,在比较数字时使用这个函数可能是完全错误的,但是..谢谢!我之前确实尝试过
归纳法
,但当我用
重写H
代替
subst
时,失败了。如果我另外
清除
a的假设和引用
归纳法
适用于
重写
。为什么我需要先澄清这个假设?
foo < rewrite <- H.
1 subgoal

a : nat
b : nat
H : a = S b
============================
nat_compare a a = Eq
Theorem triv : forall a b, a = b -> nat_compare a b = Eq.
  intros; subst; induction b; auto.
Qed.