我有一个Matrix
记录类型,由两个自然数(矩阵维度)索引。在操作矩阵表达式时,我得到了包含大量eq_rect
调用的子表达式,用于在具有可转换维度的矩阵类型之间进行转换(例如a*b
和b*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.
答案 0 :(得分:1)
我的第一个想法是你应该避免陷入如此复杂的表达。
你可以通过使用一些隐式参数使你的代码更具可读性,但即便如此,我建议你研究一些成熟的矩阵库,如matrix.v,一旦你对它们感到满意,你就重新做一遍你的例子。希望这会避免一些演员。
[提示:你的引理中不应该出现一个eq_rect
,最多只有几个铸件]
您想要证明的主要陈述是什么?