reserve i,j,n,k,m for Nat,
     a,b,x,y,z for object,
     F,G for FinSequence-yielding FinSequence,
     f,g,p,q for FinSequence,
     X,Y for set,
     D for non empty set;
reserve
  B,A,M for BinOp of D,
  F,G for D* -valued FinSequence,
  f for FinSequence of D,
  d,d1,d2 for Element of D;
reserve
  F,G for non-empty non empty FinSequence of D*,
  f for non empty FinSequence of D;
reserve f,g for FinSequence of D,
        a,b,c for set,
        F,F1,F2 for finite set;

theorem
  A is having_a_unity commutative associative
implies
  for E1 be Enumeration of F1
  for CE1,CE2 be non-empty non empty FinSequence of D* st
    CE1 = SignGenOp(f,A,F1) * E1 & CE2 = SignGenOp(f^g,A,F1) * E1
  for S1 be Element of Fin dom App CE1
  for S2 be Element of Fin dom App CE2 st S1=S2 holds
    A $$ (S1,M "**" App CE1) = A $$ (S2,M "**" App CE2)
proof
  assume
A1: A is having_a_unity commutative associative;
  let E1 be Enumeration of F1;
  let CE1,CE2 be non-empty non empty FinSequence of D* such that
A2: CE1 = SignGenOp(f,A,F1) * E1 & CE2 = SignGenOp(f^g,A,F1) * E1;
  let S1 be Element of Fin dom App CE1;
  let S2 be Element of Fin dom App CE2 such that
A3: S1=S2;
A4: S1 c= dom App CE1 = dom (M "**" App CE1) by FINSUB_1:def 5,FUNCT_2:def 1;
A5: S2 c= dom App CE2 = dom (M "**" App CE2) by FINSUB_1:def 5,FUNCT_2:def 1;
  then
A6: dom ((M "**" App CE2) | S2) = S2 by RELAT_1:62;
  for x st x in dom ((M "**" App CE1) | S1) holds
    ((M "**" App CE1) | S1).x = ((M "**" App CE2) | S2).x
  proof
    let x such that
A7:   x in dom ((M "**" App CE1) | S1);
A8:   x in dom (App CE1) by A7,A4;
    reconsider x as FinSequence by A7;
A9:   x in dom (App CE2) by A7,A5,A3;
    len CE2 = len x = len CE1 by A8,A9,Th47;
    then
A10:  dom CE2 = dom x = dom CE1 by FINSEQ_3:30;
    len ((App CE1).x) = len x = len ((App CE2).x) by A8,A9,Def9;
    then
A11:  dom ((App CE1).x) = dom x = dom ((App CE2).x) by FINSEQ_3:30;
    for i st i in dom ((App CE1).x) holds ((App CE1).x).i = ((App CE2).x).i
    proof
      let i such that
A12:    i in dom ((App CE1).x);
      CE2.i.(x.i) = CE1.i.(x.i)
      proof
A13:      x.i in dom (CE1.i) & x.i in dom (CE2.i) by Th47,A8,A9,A11,A12;
A14:      CE1.i = SignGen(f, A,E1.i) by A2,A12,A10,A11,Th80;
A15:      CE2.i = SignGen(f^g,A,E1.i) by A2,A12,A10,A11,Th80;
A16:      x.i in dom f by Def11,A13,A14;
        per cases;
        suppose
A17:        x.i in E1.i;
          hence CE2.i.(x.i) = (the_inverseOp_wrt A).((f^g).(x.i))
             by A15,Def11,A13
          .= (the_inverseOp_wrt A).(f.(x.i)) by A16,FINSEQ_1:def 7
          .= CE1.i.(x.i) by A14,Def11,A13,A17;
        end;
        suppose
A18:        not x.i in E1.i;
          hence CE2.i.(x.i) = (f^g).(x.i) by A15,Def11,A13
          .= f.(x.i) by A16,FINSEQ_1:def 7
          .= CE1.i.(x.i) by A14,Def11,A13,A18;
        end;
      end;
      hence ((App CE1).x).i = CE2.i.(x.i) by A12,A11,A8,Def9
        .= ((App CE2).x).i by A12,A11,A9,Def9;
    end;
    then
A19:  (App CE1).x = (App CE2).x by A11;
    ((M "**" App CE1) | S1).x = (M "**" App CE1).x by A7,FUNCT_1:49
    .= M "**" ((App CE2).x) by A19,A7,A4,Def10
    .= (M "**" App CE2).x by A7,A5,A3,Def10
    .=((M "**" App CE2) | S2).x by A7,A3,FUNCT_1:49;
    hence thesis;
  end;
  then (M "**" App CE1) | S1 = (M "**" App CE2) |S2 by A3,A4,RELAT_1:62,A6;
  hence thesis by A1,A3,Th1;
end;
