The proof you need is below.

It could probably be tidied up further.

I used definitions of row, column and dotprod to delay the introduction of the sum constant. (Of course, it's possible that I also thus managed to break the definition of matrix_prod.) In this way, I could eliminate some uses of FCP, without having to worry about the way FCP might interact with sum. Then, I needed some lemmas about sum which allowed me to move them around.

The proof assumes the repository version of HOL. In particular, the %% infix operator has been replaced by ' (apostrophe).

Michael

--
open bossLib fcpTheory listTheory wordsLib realTheory realLib
             simpLib boolTheory boolLib mesonLib Parse fcpLib;

 val _ = type_abbrev ("matrix", ``:(real ** 'a) ** 'b``);

val dotprod_def = Define`
dotprod (u : real[??]) (v: real[??]) = sum (0,dimindex(:??)) (??i. u ' i * v ' i)
`;

val dotprod_FCP = prove(
``(dotprod ($FCP f : real[??]) v = sum (0,dimindex(:??)) (??i. f i * v ' i)) ?? (dotprod u ($FCP f : real[??]) = sum (0,dimindex(:??)) (??i. u ' i * f i))``,
  SRW_TAC [fcpLib.FCP_ss][dotprod_def, SUM_EQ]);

val row_def = Define`
  row (A:real[??][??]) i = A ' i : real[??]
`

val row_FCP = prove(
  ``k < dimindex(:??) ==>
     (row ((FCP i j. f i j):real[??][??]) k = FCP j. f k j)``,
  SRW_TAC [fcpLib.FCP_ss][row_def]);


val column_def = Define`
  column (A:real[??][??]) k = (FCP i. A ' i ' k):real[??]
`;

val column_FCP = prove(
  ``k < dimindex (:??) ==>
      (column ((FCP i j. f i j):real[??][??]) k = FCP i. f i k)``,
  SRW_TAC [fcpLib.FCP_ss][column_def]);

val matrix_prod_def = Define`
  matrix_prod (A:('p , 'm) matrix) (B:('n, 'p) matrix) =
     (FCP i j. dotprod (row A i) (column B j)): ('n , 'm) matrix`;

val _ = overload_on ("**",``matrix_prod``)

val SUM_MULT_L = prove(
  ``sum (m,n) (\i. f i) * c = sum (m,n) (\i. f i * c)``,
  Induct_on `n` THEN SRW_TAC [][sum, REAL_RDISTRIB]);

val SUM_MULT_R = prove(
  ``c * sum (m,n) (\i. f i) = sum (m,n) (\i. c * f i)``,
  Induct_on `n` THEN SRW_TAC [][sum, REAL_LDISTRIB]);

val SUM_PLUS = prove(
  ``sum (m,n) f + sum (m,n) g = sum (m,n) (\i. f i + g i)``,
  Induct_on `n` THEN SRW_TAC [][sum] THEN
  POP_ASSUM (fn th => ONCE_REWRITE_TAC [SYM th]) THEN
  SRW_TAC [][AC REAL_ADD_ASSOC REAL_ADD_COMM]);

val SUM_SUM = prove(
  ``sum (m,n) (\i. sum (k,l) (\j. f i j)) =
    sum (k,l) (\j. sum (m,n) (\i. f i j))``,
  Induct_on `n` THEN SRW_TAC [][sum] THEN1
    (Induct_on `l` THEN SRW_TAC [][sum]) THEN
  SRW_TAC [][SUM_PLUS]);

val matrix_prod_assoc = prove(
  ``A ** (B ** C) = (A ** B) ** C``,
  SRW_TAC [fcpLib.FCP_ss][matrix_prod_def, row_FCP, column_FCP,
                          dotprod_FCP] THEN
  SRW_TAC [][dotprod_def, SUM_MULT_L, SUM_MULT_R] THEN
  SRW_TAC [][SimpLHS, Once SUM_SUM] THEN
  MATCH_MP_TAC SUM_EQ THEN SRW_TAC [][] THEN
  MATCH_MP_TAC SUM_EQ THEN SRW_TAC [][] THEN
  SRW_TAC [fcpLib.FCP_ss][row_def, column_def,
                          AC REAL_MUL_COMM REAL_MUL_ASSOC])



------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
hol-info mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/hol-info

Reply via email to