reserve D for non empty set;
reserve f1,f2,f3,f4 for BinominativeFunction of D;
reserve p,q,r,t,w for PartialPredicate of D;
reserve d,v,v1 for object;
reserve V,A for set;
reserve z for Element of V;
reserve d1 for NonatomicND of V,A;
reserve f for SCBinominativeFunction of V,A;
reserve T for TypeSCNominativeData of V,A;
reserve loc for V-valued Function;
reserve val for Function;
reserve n0 for Nat;

theorem
  V is non empty & A is complex-containing & A is_without_nonatomicND_wrt V &
  loc/.1, loc/.2, loc/.3, loc/.4 are_mutually_distinct &
  loc,val are_compatible_wrt_4_locs &
  (for T holds loc/.1 is_a_value_on T & loc/.3 is_a_value_on T)
  implies
  <* valid_factorial_input(V,A,val,n0),
     factorial_program(A,loc,val,z),
     valid_factorial_output(A,z,n0) *>
  is SFHT of ND(V,A)
  proof
    set i = loc/.1, j = loc/.2, n = loc/.3, s = loc/.4;
    set i1 = val.1, j1 = val.2, n1 = val.3, s1 = val.4;
    set D = ND(V,A);
    set p = valid_factorial_input(V,A,val,n0);
    set f = factorial_main_part(A,loc,val);
    set g = SC_assignment(denaming(V,A,s),z);
    set q = valid_factorial_output(A,z,n0);
    set inv = factorial_inv(A,loc,n0);
    set E = Equality(A,i,n);
    assume that
A1: V is non empty & A is complex-containing & A is_without_nonatomicND_wrt V
    and
A2: i,j,n,s are_mutually_distinct and
A3: loc,val are_compatible_wrt_4_locs and
A4: for T holds i is_a_value_on T & n is_a_value_on T;
A5: <*p,f,PP_and(E,inv)*> is SFHT of D by A1,A3,A2,Th10;
A6: <*PP_and(E,inv),g,q*> is SFHT of D by A1,A4,Th12;
    <*PP_inversion(PP_and(E,inv)),g,q*> is SFHT of D by A4,Th13;
    hence thesis by A5,A6,NOMIN_3:25;
  end;
