如果我这样定义乘法(drugi_c
),如何证明例如X*0=0
?
(如何通过定义证明某些东西?)
Fixpoint drugi_c(x y: nat): nat:=
match x, y with
| _, O => O
| O, _ => O
| S O, _ => y
| _,S O => x
| S x', S y' => plus y (drugi_c x' y)
end.
Notation "x * y" := (drugi_c x y) (at level 40, left associativity).
每当我使用“简单”时。在证明而不是0 = 0中,我得到了结果的定义。
Lemma neka2 x:
x * 0 = 0.
Proof.
induction x.
-simpl. reflexivity.
-simpl. (*right here*)
Abort.
最后一个简化后的结果。
1 subgoal
x : nat
IHx : x * 0 = 0
______________________________________(1/1)
match x with
| 0 | _ => 0
end = 0
最后simpl.
之后要写些什么来完成证明?
答案 0 :(得分:2)
您的目标在x
上具有模式匹配项,但是无论x
是什么值,它都将返回0。要强制简化,可以destruct x
。
请注意,您在这里从不使用归纳假设,因此您可以在一开始就完成destruct x
而不是induction x
。
答案 1 :(得分:0)
这就是我最终得到的东西:
Lemma neka2 x:
x * 0 = 0.
Proof.
destruct x.
-simpl. reflexivity.
-simpl. (**)
Abort.
结果:
1 subgoal
x : nat
______________________________________(1/1)
x * 0 = 0
我想您必须通过归纳证明,因为当我尝试使用预定义的多重分解x时也会发生同样的事情。
这里是x * 0 = 0证明,但具有预定义的多重:
Theorem mult_0_r : forall n:nat,
n * 0 = 0.
Proof.
intros n.
induction n as [|n'].
Case "n = 0".
simpl.
reflexivity.
Case "n = S n'".
simpl.
rewrite -> IHn'.
reflexivity.
Qed.
答案 2 :(得分:0)
正如@ user138737所指出的,您不需要归纳法。研究三种情况就足够了:x = 0
,x = 1
和x = S (S x'))
。因此,我能提供的最短的证据如下。
destruct x as [| [|] ]; reflexivity.