reserve C for CategoryStr;
reserve f,f1,f2,f3 for morphism of C;
reserve g1,g2 for morphism of C opp;
reserve C,D,E for with_identities CategoryStr;
reserve F for Functor of C,D;
reserve G for Functor of D,E;
reserve f for morphism of C;

theorem
  F is covariant & G is covariant implies G (*) F is covariant
  proof
    assume
A1: F is covariant;
    assume
A2: G is covariant;
    set GF = G (*) F;
    for f being morphism of C st f is identity holds GF.f is identity
    proof
      let f be morphism of C;
      assume
A3:   f is identity;
      per cases;
      suppose
A4:     C is non empty;
A7:     F.f is identity by A1,A3,Def22;
        (G(*)F).f = G.(F.f) by A1,A2,Th34,A4;
        hence GF.f is identity by A2,A7,Def22;
      end;
      suppose
A8:     C is empty;
        per cases;
        suppose
A9:       E is non empty;
          GF.f = the Object of E by A8,Def21;
          hence GF.f is identity by A9,Th22;
        end;
        suppose E is empty; hence GF.f is identity by Th10; end;
      end;
    end;
    then
A10: GF is identity-preserving;
    for f1,f2 being morphism of C st f1 |> f2 holds
    GF.f1 |> GF.f2 & GF.(f1 (*) f2) = (GF.f1) (*) (GF.f2)
    proof
      let f1,f2 be morphism of C;
      assume
A11:   f1 |> f2;
      then
A12:   C is non empty;
A15:   GF.f1 = G.(F.f1) by A12,A1,A2,Th34;
A16:   G is multiplicative by A2;
      F is multiplicative by A1;
      then
A17:   F.f1 |> F.f2 & F.(f1 (*) f2) = (F.f1) (*) (F.f2) by A11;
      then G.(F.f1) |> G.(F.f2) &
      G.((F.f1) (*) (F.f2)) = (G.(F.f1)) (*) (G.(F.f2)) by A16;
      hence GF.f1 |> GF.f2 by A15,A12,A1,A2,Th34;
      thus GF.(f1 (*) f2) = G.(F.(f1 (*) f2)) by A12,A1,A2,Th34
      .= (G.(F.f1)) (*) (G.(F.f2)) by A17,A16
      .= (GF.f1) (*) (GF.f2) by A15,A12,A1,A2,Th34;
    end;
    hence G (*) F is covariant by A10,Def23;
  end;
