如何在平等证明中进行推理?

时间:2019-07-31 17:45:34

标签: coq

说我对加法的定义略有不同,向量附加的定义也略有不同:

From Coq Require Import Vector.

Definition myAddNat a b := nat_rect _ b (fun _ p => S p) a.

Theorem rewrite_myAddNat a b : myAddNat a b = (a + b)%nat.
Proof.
  induction a.
  { reflexivity. }
  {
    simpl.
    congruence.
  }
Defined.

Definition myAppend T m n : Vector.t T m -> Vector.t T n -> Vector.t T (myAddNat m n).
  rewrite rewrite_myAddNat.
  apply Vector.append.
Defined.

我希望能够证明以下内容:


Theorem myAppend_cons_1 T m n h a b :
    myAppend T (S m) n (cons T h m a) b =
    cons T h (myAddNat m n) (myAppend T m n a b).
Proof.
  induction a.
  { reflexivity. }
  {
    simpl.
    unfold myAppend.
    (* stuck! *)
  }
Abort.

我最终陷入了彼此非常接近的两个术语上,除了他们每个人都拥有平等的立场而又不确定如何处理。

我已经考虑过将定理声明更改为:

Theorem myAppend_cons T m n h a b :
    existT _ _ (myAppend T (S m) n (cons T h m a) b) =
    existT _ _ (cons T h (myAddNat m n) (myAppend T m n a b)).

以便能够暂时使方程的两边具有不同的类型,但不能在证明上取得更大的进步。

所以:

1)是否有证明这两个定理的好方法

2)我应该用其他方式写myAppend来简化我的生活吗?

1 个答案:

答案 0 :(得分:2)

这是一个快速答案:

Theorem myAppend_cons_1 T m n h a b :
    myAppend T (S m) n (cons T h m a) b =
    cons T h (myAddNat m n) (myAppend T m n a b).
Proof.
  unfold myAppend, eq_rect_r; simpl.
  rewrite !eq_trans_refl_l, !eq_sym_map_distr.
  now destruct (eq_sym _).
Qed.