2014-08-25 16:04:39 +00:00
|
|
|
import logic
|
|
|
|
|
2014-10-02 23:20:52 +00:00
|
|
|
constant matrix.{l} : Type.{l} → Type.{l}
|
|
|
|
constant same_dim {A : Type} : matrix A → matrix A → Prop
|
|
|
|
constant add {A : Type} (m1 m2 : matrix A) {H : same_dim m1 m2} : matrix A
|
2014-08-25 16:04:39 +00:00
|
|
|
|
|
|
|
theorem same_dim_irrel {A : Type} {m1 m2 : matrix A} {H1 H2 : same_dim m1 m2} : @add A m1 m2 H1 = @add A m1 m2 H2 :=
|
2014-08-25 16:27:19 +00:00
|
|
|
rfl
|
2014-09-05 01:41:06 +00:00
|
|
|
open eq
|
2014-08-25 16:04:39 +00:00
|
|
|
theorem same_dim_eq_args {A : Type} {m1 m2 m1' m2' : matrix A} (H1 : m1 = m1') (H2 : m2 = m2') (H : same_dim m1 m2) : same_dim m1' m2' :=
|
|
|
|
subst H1 (subst H2 H)
|
|
|
|
|
|
|
|
theorem add_congr {A : Type} (m1 m2 m1' m2' : matrix A) (H1 : m1 = m1') (H2 : m2 = m2') (H : same_dim m1 m2) : @add A m1 m2 H = @add A m1' m2' (same_dim_eq_args H1 H2 H) :=
|
2014-09-04 22:03:59 +00:00
|
|
|
have base : ∀ (H1 : m1 = m1) (H2 : m2 = m2), @add A m1 m2 H = @add A m1 m2 (eq.rec (eq.rec H H1) H2), from
|
2014-08-25 16:04:39 +00:00
|
|
|
assume H1 H2, rfl,
|
2014-09-04 22:03:59 +00:00
|
|
|
have general : ∀ (H1 : m1 = m1') (H2 : m2 = m2'), @add A m1 m2 H = @add A m1' m2' (eq.rec (eq.rec H H1) H2), from
|
2014-08-25 16:04:39 +00:00
|
|
|
subst H1 (subst H2 base),
|
2014-09-04 22:03:59 +00:00
|
|
|
calc @add A m1 m2 H = @add A m1' m2' (eq.rec (eq.rec H H1) H2) : general H1 H2
|
2014-08-25 16:04:39 +00:00
|
|
|
... = @add A m1' m2' (same_dim_eq_args H1 H2 H) : same_dim_irrel
|