eq_rect和natrual类型索引

时间:2016-05-14 01:01:40

标签: equality coq

我有一个Matrix记录类型,由两个自然数(矩阵维度)索引。在操作矩阵表达式时,我得到了包含大量eq_rect调用的子表达式,用于在具有可转换维度的矩阵类型之间进行转换(例如a*bb*a)。什么是一个很好的策略来证明如下所示的引理?我不是在寻找确切的证据,而是寻求有关处理此类证明的一般技巧的建议。例如,我看到嵌套的eq_refl调用。这些可以合并吗?我可以使用异类平等来简化表达式吗?请指教。例如:

Require Export Utf8_core.
Require Import Coq.Arith.Arith.

Record Matrix (m n : nat).

Definition kp {m n p q: nat} (A: Matrix m n) (B: Matrix p q):
  Matrix (m*p) (n*q). Admitted.
Definition mp {m n p: nat} (A: Matrix n m) (B: Matrix m p):
  Matrix n p. Admitted.

Notation "x ⊗ y" := (kp x y) (at level 50, left associativity) : matrix_scope.
Notation "x * y" := (mp x y) : matrix_scope.

Definition D (n:nat) : Matrix n n. Admitted.
Definition I (n:nat): Matrix n n. Admitted.
Definition T (m n:nat): Matrix m m. Admitted.
Definition L (m n:nat): Matrix m m. Admitted.

Local Open Scope matrix_scope.

Lemma Foo:
  forall (m0 n0 v : nat) (eqH : (m0 * v * n0 * v)%nat = (m0 * v * (n0 * v))%nat)
    (eqH0 : (m0 * (n0 * v) * v)%nat = (m0 * v * (n0 * v))%nat)
    (eqH1 : (m0 * (n0 * v * v))%nat = (m0 * v * (n0 * v))%nat)
    (eqH2 : (n0 * (v * v))%nat = (n0 * v * v)%nat)
    (eqH3 : (m0 * (n0 * v) * v)%nat = (m0 * (n0 * v * v))%nat)
    (eqH4 : (m0 * n0 * v * v)%nat = (m0 * v * (n0 * v))%nat)
    (eqH5 : (m0 * v * (n0 * v))%nat = (m0 * v * n0 * v)%nat)
    (eqH6 : (n0 * v * v)%nat = (n0 * (v * v))%nat)
    (eqH7 : (m0 * n0 * v * v)%nat = (m0 * (n0 * v * v))%nat),

    eq_rect (m0 * v * n0 * v)%nat (fun (n:nat) => Matrix (m0 * v * (n0 * v)) n)
            (eq_rect (m0 * v * n0 * v)%nat (λ m : nat, Matrix m (m0 * v * n0 * v))
                     (D (m0 * v) ⊗ I n0 ⊗ I v) (m0 * v * (n0 * v))%nat eqH)
            (m0 * v * (n0 * v))%nat eqH * T (m0 * v * (n0 * v)) (n0 * v) *
    eq_rect (m0 * (n0 * v) * v)%nat (λ n : nat, Matrix (m0 * v * (n0 * v)) n)
            (eq_rect (m0 * (n0 * v * v))%nat (λ m : nat, Matrix m (m0 * (n0 * v) * v))
                     ((I m0
                         ⊗ eq_rect (n0 * (v * v))%nat (λ n : nat, Matrix (n0 * v * v) n)
                         ((L (n0 * v) v ⊗ I v) *
                          eq_rect (n0 * (v * v))%nat (λ m : nat, Matrix m (n0 * (v * v)))
                                  (I n0 ⊗ L (v * v) v) (n0 * v * v)%nat eqH2)
                         (n0 * v * v)%nat eqH2 * (D (n0 * v) ⊗ I v)) *
                      eq_rect (m0 * (n0 * v) * v)%nat (λ m : nat, Matrix m (m0 * (n0 * v) * v))
                              (L (m0 * (n0 * v)) m0 ⊗ I v) (m0 * (n0 * v * v))%nat eqH3)
                     (m0 * v * (n0 * v))%nat eqH1) (m0 * v * (n0 * v))%nat eqH0 =
    eq_rect (m0 * n0 * v * v)%nat (λ n : nat, Matrix (m0 * v * (n0 * v)) n)
            (eq_rect (m0 * v * n0 * v)%nat (λ m : nat, Matrix m (m0 * n0 * v * v))
                     ((D (m0 * v) ⊗ I n0 ⊗ I v) *
                      eq_rect (m0 * v * (n0 * v))%nat (λ m : nat, Matrix m (m0 * v * (n0 * v)))
                              (T (m0 * v * (n0 * v)) (n0 * v)) (m0 * v * n0 * v)%nat eqH5 *
                      eq_rect (m0 * (n0 * v * v))%nat (λ m : nat, Matrix m (m0 * (n0 * v * v)))
                              (I m0
                                 ⊗ (L (n0 * v) v ⊗ I v) *
                               eq_rect (n0 * (v * v))%nat (λ m : nat, Matrix m (n0 * (v * v)))
                                       (I n0 ⊗ L (v * v) v) (n0 * v * v)%nat eqH2 *
                               eq_rect (n0 * v * v)%nat (λ m : nat, Matrix m (n0 * v * v))
                                       (D (n0 * v) ⊗ I v) (n0 * (v * v))%nat eqH6)
                              (m0 * v * (n0 * v))%nat eqH1 *
                      eq_rect (m0 * n0 * v * v)%nat (λ m : nat, Matrix m (m0 * n0 * v * v))
                              (L (m0 * n0 * v) m0 ⊗ I v) (m0 * (n0 * v * v))%nat eqH7)
                     (m0 * v * (n0 * v))%nat eqH) (m0 * v * (n0 * v))%nat eqH4.

1 个答案:

答案 0 :(得分:1)

我的第一个想法是你应该避免陷入如此复杂的表达。

你可以通过使用一些隐式参数使你的代码更具可读性,但即便如此,我建议你研究一些成熟的矩阵库,如matrix.v,一旦你对它们感到满意,你就重新做一遍你的例子。希望这会避免一些演员。

[提示:你的引理中不应该出现一个eq_rect,最多只有几个铸件]

您想要证明的主要陈述是什么?