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