let K be Field; :: thesis: for A, B, C being Matrix of K st width A = len B & width B = len C holds
(A * B) * C = A * (B * C)

let A, B, C be Matrix of K; :: thesis: ( width A = len B & width B = len C implies (A * B) * C = A * (B * C) )
assume that
A1: width A = len B and
A2: width B = len C ; :: thesis: (A * B) * C = A * (B * C)
A3: len (B * C) = width A by A1, A2, Def4;
A4: width (B * C) = width C by A2, Def4;
then A5: width (A * (B * C)) = width C by A3, Def4;
dom (B * C) = dom B by A1, A3, FINSEQ_3:31;
then A6: Indices (B * C) = [:(dom B),(Seg (width C)):] by A4;
A7: Seg (len B) = dom B by FINSEQ_1:def 3;
A8: len (A * (B * C)) = len A by A3, Def4;
then dom (A * (B * C)) = dom A by FINSEQ_3:31;
then A9: Indices (A * (B * C)) = [:(dom A),(Seg (width C)):] by A5;
0. K is_a_unity_wrt the addF of K by FVSUM_1:8;
then A10: the addF of K is having_a_unity by SETWISEO:def 2;
A11: width (A * B) = len C by A1, A2, Def4;
then A12: width ((A * B) * C) = width C by Def4;
A13: len (A * B) = len A by A1, Def4;
then dom (A * B) = dom A by FINSEQ_3:31;
then A14: Indices (A * B) = [:(dom A),(Seg (width B)):] by A2, A11;
A15: len ((A * B) * C) = len A by A13, A11, Def4;
then A16: dom ((A * B) * C) = dom A by FINSEQ_3:31;
then A17: Indices ((A * B) * C) = [:(dom A),(Seg (width C)):] by A12;
A18: Indices ((A * B) * C) = [:(dom A),(Seg (width C)):] by A12, A16;
now
reconsider Y = findom B as Element of Fin NAT ;
reconsider X = findom C as Element of Fin NAT ;
let i, j be Nat; :: thesis: ( [i,j] in Indices ((A * B) * C) implies ((A * B) * C) * (i,j) = (A * (B * C)) * (i,j) )
deffunc H1( Element of NAT , Element of NAT ) -> Element of the carrier of K = ((A * (i,$2)) * (B * ($2,$1))) * (C * ($1,j));
consider f being Function of [:NAT,NAT:], the carrier of K such that
A19: for k1, k2 being Element of NAT holds f . (k1,k2) = H1(k1,k2) from BINOP_1:sch 4();
A20: for k being Element of NAT st k in NAT holds
((curry f) . k) | (dom B) = (C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k))))
proof
let k be Element of NAT ; :: thesis: ( k in NAT implies ((curry f) . k) | (dom B) = (C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k)))) )
assume k in NAT ; :: thesis: ((curry f) . k) | (dom B) = (C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k))))
A21: {k} c= NAT by ZFMISC_1:37;
reconsider a = C * (k,j) as Element of K ;
A22: dom (curry f) = NAT by FUNCT_2:def 1;
dom f = [:NAT,NAT:] by FUNCT_2:def 1;
then A23: dom ((curry f) . k) = proj2 ([:NAT,NAT:] /\ [:{k},(proj2 [:NAT,NAT:]):]) by A22, FUNCT_5:38
.= proj2 ([:{k},NAT:] /\ [:NAT,NAT:]) by FUNCT_5:11
.= proj2 [:{k},NAT:] by A21, ZFMISC_1:124
.= NAT by FUNCT_5:11 ;
then A24: dom (((curry f) . k) | (dom B)) = NAT /\ (dom B) by RELAT_1:90
.= dom B by XBOOLE_1:28 ;
reconsider p = mlt ((Line (A,i)),(Col (B,k))) as FinSequence of K ;
A25: len (mlt ((Line (A,i)),(Col (B,k)))) = len ( the multF of K .: ((Line (A,i)),(Col (B,k)))) by FVSUM_1:def 7;
len (Line (A,i)) = len B by A1, MATRIX_1:def 8
.= len (Col (B,k)) by MATRIX_1:def 9 ;
then A26: len ( the multF of K .: ((Line (A,i)),(Col (B,k)))) = len (Line (A,i)) by FINSEQ_2:86
.= len B by A1, MATRIX_1:def 8 ;
dom (a multfield) = the carrier of K by FUNCT_2:def 1;
then ( a * p = (a multfield) * p & rng p c= dom (a multfield) ) by FINSEQ_1:def 4, FVSUM_1:def 6;
then A27: dom (a * p) = dom p by RELAT_1:46;
A28: dom ( the multF of K .: ((Line (A,i)),(Col (B,k)))) = Seg (len ( the multF of K .: ((Line (A,i)),(Col (B,k))))) by FINSEQ_1:def 3;
A29: now
let l be set ; :: thesis: ( l in dom B implies (((curry f) . k) | (dom B)) . l = ((C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k))))) . l )
assume A30: l in dom B ; :: thesis: (((curry f) . k) | (dom B)) . l = ((C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k))))) . l
then reconsider l9 = l as Element of NAT ;
A31: l in dom (a * p) by A25, A26, A27, A30, FINSEQ_3:31;
l9 in dom p by A25, A26, A30, FINSEQ_3:31;
then reconsider b = p . l9 as Element of K by FINSEQ_2:13;
A32: l9 in dom ( the multF of K .: ((Line (A,i)),(Col (B,k)))) by A26, A28, A30, FINSEQ_1:def 3;
thus (((curry f) . k) | (dom B)) . l = ((curry f) . k) . l9 by A30, FUNCT_1:72
.= f . (k,l9) by A22, A23, FUNCT_5:38
.= ((A * (i,l9)) * (B * (l9,k))) * (C * (k,j)) by A19
.= the multF of K . (( the multF of K . (((Line (A,i)) . l9),(B * (l9,k)))),(C * (k,j))) by A1, A7, A30, MATRIX_1:def 8
.= the multF of K . (( the multF of K . (((Line (A,i)) . l9),((Col (B,k)) . l9))),(C * (k,j))) by A30, MATRIX_1:def 9
.= the multF of K . ((( the multF of K .: ((Line (A,i)),(Col (B,k)))) . l9),(C * (k,j))) by A32, FUNCOP_1:28
.= b * a by FVSUM_1:def 7
.= ((C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k))))) . l by A31, FVSUM_1:62 ; :: thesis: verum
end;
dom ((C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k))))) = dom B by A25, A26, A27, FINSEQ_3:31;
hence ((curry f) . k) | (dom B) = (C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k)))) by A24, A29, FUNCT_1:9; :: thesis: verum
end;
A33: 0. K = the_unity_wrt the addF of K by FVSUM_1:9;
deffunc H2( Element of NAT ) -> Element of the carrier of K = the addF of K $$ (X,((curry' f) . $1));
deffunc H3( Element of NAT ) -> Element of the carrier of K = the addF of K $$ (Y,((curry f) . $1));
consider g being Function of NAT, the carrier of K such that
A34: for k being Element of NAT holds g . k = H3(k) from FUNCT_2:sch 4();
A35: dom (g | (dom C)) = (dom g) /\ (dom C) by RELAT_1:90
.= NAT /\ (dom C) by FUNCT_2:def 1
.= dom C by XBOOLE_1:28 ;
len (Line ((A * B),i)) = width (A * B) by MATRIX_1:def 8
.= len C by A1, A2, Def4
.= len (Col (C,j)) by MATRIX_1:def 9 ;
then A36: len ( the multF of K .: ((Line ((A * B),i)),(Col (C,j)))) = len (Col (C,j)) by FINSEQ_2:86
.= len C by MATRIX_1:def 9 ;
assume A37: [i,j] in Indices ((A * B) * C) ; :: thesis: ((A * B) * C) * (i,j) = (A * (B * C)) * (i,j)
then A38: i in dom A by A17, ZFMISC_1:106;
A39: now
let k9 be set ; :: thesis: ( k9 in dom C implies (g | (dom C)) . k9 = (mlt ((Line ((A * B),i)),(Col (C,j)))) . k9 )
assume A40: k9 in dom C ; :: thesis: (g | (dom C)) . k9 = (mlt ((Line ((A * B),i)),(Col (C,j)))) . k9
then reconsider k = k9 as Element of NAT ;
A41: k in dom ( the multF of K .: ((Line ((A * B),i)),(Col (C,j)))) by A36, A40, FINSEQ_3:31;
reconsider p = mlt ((Line (A,i)),(Col (B,k))) as FinSequence of K ;
reconsider a = C * (k,j) as Element of K ;
dom (a multfield) = the carrier of K by FUNCT_2:def 1;
then ( a * p = (a multfield) * p & rng p c= dom (a multfield) ) by FINSEQ_1:def 4, FVSUM_1:def 6;
then A42: dom (a * p) = dom p by RELAT_1:46;
len (Line (A,i)) = len B by A1, MATRIX_1:def 8
.= len (Col (B,k)) by MATRIX_1:def 9 ;
then len ( the multF of K .: ((Line (A,i)),(Col (B,k)))) = len (Line (A,i)) by FINSEQ_2:86
.= len B by A1, MATRIX_1:def 8 ;
then len B = len p by FVSUM_1:def 7;
then A43: dom ((C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k))))) = dom B by A42, FINSEQ_3:31;
then ([#] (((C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k))))),(0. K))) | (dom B) = (C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k)))) by SETWOP_2:23;
then A44: ([#] (((C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k))))),(0. K))) | (dom B) = ((curry f) . k) | (dom B) by A20;
k in Seg (width B) by A2, A40, FINSEQ_1:def 3;
then A45: [i,k] in Indices (A * B) by A14, A38, ZFMISC_1:106;
A46: k in Seg (width (A * B)) by A11, A40, FINSEQ_1:def 3;
thus (g | (dom C)) . k9 = g . k by A35, A40, FUNCT_1:70
.= the addF of K $$ (Y,((curry f) . k)) by A34
.= the addF of K $$ (Y,([#] (((C * (k,j)) * (mlt ((Line (A,i)),(Col (B,k))))),(0. K)))) by A44, FVSUM_1:10, SETWOP_2:9
.= the addF of K $$ (a * p) by A10, A33, A43, SETWOP_2:def 2
.= Sum (a * p) by FVSUM_1:def 8
.= (C * (k,j)) * (Sum (mlt ((Line (A,i)),(Col (B,k))))) by FVSUM_1:92
.= (C * (k,j)) * ((Line (A,i)) "*" (Col (B,k))) by FVSUM_1:def 10
.= ((A * B) * (i,k)) * (C * (k,j)) by A1, A45, Def4
.= the multF of K . (((Line ((A * B),i)) . k),(C * (k,j))) by A46, MATRIX_1:def 8
.= the multF of K . (((Line ((A * B),i)) . k),((Col (C,j)) . k)) by A40, MATRIX_1:def 9
.= ( the multF of K .: ((Line ((A * B),i)),(Col (C,j)))) . k by A41, FUNCOP_1:28
.= (mlt ((Line ((A * B),i)),(Col (C,j)))) . k9 by FVSUM_1:def 7 ; :: thesis: verum
end;
A47: len ( the multF of K .: ((Line ((A * B),i)),(Col (C,j)))) = len (mlt ((Line ((A * B),i)),(Col (C,j)))) by FVSUM_1:def 7;
then A48: dom C = dom (mlt ((Line ((A * B),i)),(Col (C,j)))) by A36, FINSEQ_3:31;
dom (mlt ((Line ((A * B),i)),(Col (C,j)))) = dom C by A36, A47, FINSEQ_3:31;
then A49: ([#] ((mlt ((Line ((A * B),i)),(Col (C,j)))),(0. K))) | (dom C) = mlt ((Line ((A * B),i)),(Col (C,j))) by SETWOP_2:23;
len (Col ((B * C),j)) = len (B * C) by MATRIX_1:def 9
.= width A by A1, A2, Def4
.= len (Line (A,i)) by MATRIX_1:def 8 ;
then A50: len ( the multF of K .: ((Line (A,i)),(Col ((B * C),j)))) = len (Line (A,i)) by FINSEQ_2:86
.= width A by MATRIX_1:def 8 ;
A51: len ( the multF of K .: ((Line (A,i)),(Col ((B * C),j)))) = len (mlt ((Line (A,i)),(Col ((B * C),j)))) by FVSUM_1:def 7;
then A52: dom (mlt ((Line (A,i)),(Col ((B * C),j)))) = Y by A1, A50, FINSEQ_3:31;
dom (mlt ((Line (A,i)),(Col ((B * C),j)))) = dom B by A1, A50, A51, FINSEQ_3:31;
then A53: ([#] ((mlt ((Line (A,i)),(Col ((B * C),j)))),(0. K))) | (dom B) = mlt ((Line (A,i)),(Col ((B * C),j))) by SETWOP_2:23;
consider h being Function of NAT, the carrier of K such that
A54: for k being Element of NAT holds h . k = H2(k) from FUNCT_2:sch 4();
A55: dom (h | (dom B)) = (dom h) /\ (dom B) by RELAT_1:90
.= NAT /\ (dom B) by FUNCT_2:def 1
.= dom B by XBOOLE_1:28 ;
A56: j in Seg (width C) by A17, A37, ZFMISC_1:106;
A57: now
let k9 be set ; :: thesis: ( k9 in dom B implies (h | (dom B)) . k9 = (mlt ((Line (A,i)),(Col ((B * C),j)))) . k9 )
assume A58: k9 in dom B ; :: thesis: (h | (dom B)) . k9 = (mlt ((Line (A,i)),(Col ((B * C),j)))) . k9
then reconsider k = k9 as Element of NAT ;
A59: k in Seg (width A) by A1, A58, FINSEQ_1:def 3;
A60: k in dom (B * C) by A1, A3, A58, FINSEQ_3:31;
A61: [k,j] in Indices (B * C) by A6, A56, A58, ZFMISC_1:106;
reconsider p = mlt ((Line (B,k)),(Col (C,j))) as FinSequence of K ;
reconsider a = A * (i,k) as Element of K ;
A62: len (mlt ((Line (B,k)),(Col (C,j)))) = len ( the multF of K .: ((Line (B,k)),(Col (C,j)))) by FVSUM_1:def 7;
dom f = [:NAT,NAT:] by FUNCT_2:def 1;
then A63: ex G being Function st
( G = (curry' f) . k & dom G = NAT & rng G c= rng f & ( for x being set st x in NAT holds
G . x = f . (x,k) ) ) by FUNCT_5:39;
then A64: dom (((curry' f) . k) | (dom C)) = NAT /\ (dom C) by RELAT_1:90
.= dom C by XBOOLE_1:28 ;
A65: k in dom ( the multF of K .: ((Line (A,i)),(Col ((B * C),j)))) by A1, A50, A58, FINSEQ_3:31;
len (Line (B,k)) = len C by A2, MATRIX_1:def 8
.= len (Col (C,j)) by MATRIX_1:def 9 ;
then A66: len ( the multF of K .: ((Line (B,k)),(Col (C,j)))) = len (Line (B,k)) by FINSEQ_2:86
.= len C by A2, MATRIX_1:def 8 ;
dom (a multfield) = the carrier of K by FUNCT_2:def 1;
then ( a * p = (a multfield) * p & rng p c= dom (a multfield) ) by FINSEQ_1:def 4, FVSUM_1:def 6;
then A67: dom (a * p) = dom p by RELAT_1:46;
then A68: dom ((A * (i,k)) * (mlt ((Line (B,k)),(Col (C,j))))) = dom C by A62, A66, FINSEQ_3:31;
A69: now
let l be set ; :: thesis: ( l in dom C implies (((curry' f) . k) | (dom C)) . l = ((A * (i,k)) * (mlt ((Line (B,k)),(Col (C,j))))) . l )
assume A70: l in dom C ; :: thesis: (((curry' f) . k) | (dom C)) . l = ((A * (i,k)) * (mlt ((Line (B,k)),(Col (C,j))))) . l
then reconsider l9 = l as Element of NAT ;
A71: l9 in dom ( the multF of K .: ((Line (B,k)),(Col (C,j)))) by A66, A70, FINSEQ_3:31;
l9 in dom p by A62, A66, A70, FINSEQ_3:31;
then reconsider b = p . l9 as Element of K by FINSEQ_2:13;
A72: l9 in Seg (width B) by A2, A70, FINSEQ_1:def 3;
A73: l in dom (a * p) by A62, A66, A67, A70, FINSEQ_3:31;
thus (((curry' f) . k) | (dom C)) . l = ((curry' f) . k) . l9 by A70, FUNCT_1:72
.= f . (l9,k) by A63
.= ((A * (i,k)) * (B * (k,l9))) * (C * (l9,j)) by A19
.= (A * (i,k)) * ((B * (k,l9)) * (C * (l9,j))) by GROUP_1:def 4
.= the multF of K . ((A * (i,k)),( the multF of K . (((Line (B,k)) . l9),(C * (l9,j))))) by A72, MATRIX_1:def 8
.= the multF of K . ((A * (i,k)),( the multF of K . (((Line (B,k)) . l9),((Col (C,j)) . l9)))) by A70, MATRIX_1:def 9
.= the multF of K . ((A * (i,k)),(( the multF of K .: ((Line (B,k)),(Col (C,j)))) . l9)) by A71, FUNCOP_1:28
.= a * b by FVSUM_1:def 7
.= ((A * (i,k)) * (mlt ((Line (B,k)),(Col (C,j))))) . l by A73, FVSUM_1:62 ; :: thesis: verum
end;
([#] (((A * (i,k)) * (mlt ((Line (B,k)),(Col (C,j))))),(0. K))) | (dom C) = (A * (i,k)) * (mlt ((Line (B,k)),(Col (C,j)))) by A68, SETWOP_2:23;
then A74: ([#] (((A * (i,k)) * (mlt ((Line (B,k)),(Col (C,j))))),(0. K))) | (dom C) = ((curry' f) . k) | (dom C) by A64, A68, A69, FUNCT_1:9;
thus (h | (dom B)) . k9 = h . k by A55, A58, FUNCT_1:70
.= the addF of K $$ (X,((curry' f) . k)) by A54
.= the addF of K $$ (X,([#] (((A * (i,k)) * (mlt ((Line (B,k)),(Col (C,j))))),(0. K)))) by A74, FVSUM_1:10, SETWOP_2:9
.= the addF of K $$ (a * p) by A10, A33, A68, SETWOP_2:def 2
.= Sum (a * p) by FVSUM_1:def 8
.= (A * (i,k)) * (Sum (mlt ((Line (B,k)),(Col (C,j))))) by FVSUM_1:92
.= (A * (i,k)) * ((Line (B,k)) "*" (Col (C,j))) by FVSUM_1:def 10
.= (A * (i,k)) * ((B * C) * (k,j)) by A2, A61, Def4
.= the multF of K . (((Line (A,i)) . k),((B * C) * (k,j))) by A59, MATRIX_1:def 8
.= the multF of K . (((Line (A,i)) . k),((Col ((B * C),j)) . k)) by A60, MATRIX_1:def 9
.= ( the multF of K .: ((Line (A,i)),(Col ((B * C),j)))) . k by A65, FUNCOP_1:28
.= (mlt ((Line (A,i)),(Col ((B * C),j)))) . k9 by FVSUM_1:def 7 ; :: thesis: verum
end;
dom (mlt ((Line (A,i)),(Col ((B * C),j)))) = dom B by A1, A50, A51, FINSEQ_3:31;
then A75: h | (dom B) = mlt ((Line (A,i)),(Col ((B * C),j))) by A55, A57, FUNCT_1:9;
dom (mlt ((Line ((A * B),i)),(Col (C,j)))) = dom C by A36, A47, FINSEQ_3:31;
then A76: g | (dom C) = mlt ((Line ((A * B),i)),(Col (C,j))) by A35, A39, FUNCT_1:9;
thus ((A * B) * C) * (i,j) = (Line ((A * B),i)) "*" (Col (C,j)) by A11, A37, Def4
.= Sum (mlt ((Line ((A * B),i)),(Col (C,j)))) by FVSUM_1:def 10
.= the addF of K $$ (mlt ((Line ((A * B),i)),(Col (C,j)))) by FVSUM_1:def 8
.= the addF of K $$ ((findom C),([#] ((mlt ((Line ((A * B),i)),(Col (C,j)))),(0. K)))) by A10, A33, A48, SETWOP_2:def 2
.= the addF of K $$ (X,g) by A10, A49, A76, SETWOP_2:9
.= the addF of K $$ ([:X,Y:],f) by A10, A34, Th32
.= the addF of K $$ (Y,h) by A10, A54, Th34
.= the addF of K $$ ((findom (mlt ((Line (A,i)),(Col ((B * C),j))))),([#] ((mlt ((Line (A,i)),(Col ((B * C),j)))),(the_unity_wrt the addF of K)))) by A10, A33, A53, A75, A52, SETWOP_2:9
.= the addF of K $$ (mlt ((Line (A,i)),(Col ((B * C),j)))) by A10, SETWOP_2:def 2
.= Sum (mlt ((Line (A,i)),(Col ((B * C),j)))) by FVSUM_1:def 8
.= (Line (A,i)) "*" (Col ((B * C),j)) by FVSUM_1:def 10
.= (A * (B * C)) * (i,j) by A3, A9, A18, A37, Def4 ; :: thesis: verum
end;
hence (A * B) * C = A * (B * C) by A8, A5, A15, A12, MATRIX_1:21; :: thesis: verum