如何通过定义来证明?

时间:2019-03-23 17:36:27

标签: coq coqide

如果我这样定义乘法(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.之后要写些什么来完成证明?

3 个答案:

答案 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 = 0x = 1x = S (S x'))。因此,我能提供的最短的证据如下。

destruct x as [| [|] ]; reflexivity.