reserve v for object;
reserve V,A for set;
reserve f for SCBinominativeFunction of V,A;
reserve d for TypeSCNominativeData of V,A;
reserve d1 for NonatomicND of V,A;
reserve a,b,c,z for Element of V;
reserve x,y for object;
reserve p,q,r,s for SCPartialNominativePredicate of V,A;
reserve x0,y0 for Nat;

theorem Th25:
  V is non empty & A is_without_nonatomicND_wrt V &
  (for d holds a is_a_value_on d) & (for d holds b is_a_value_on d) implies
  <* PP_and(Equality(A,a,b),gcd_inv(V,A,a,b,x0,y0)),
     SC_assignment(denaming(V,A,a),z),
     valid_gcd_output(V,A,z,x0,y0) *> is SFHT of ND(V,A)
  proof
    assume that
A1: V is non empty and
A2: A is_without_nonatomicND_wrt V and
A3: (for d holds a is_a_value_on d) & (for d holds b is_a_value_on d);
    set Da = denaming(V,A,a);
    set Db = denaming(V,A,b);
    set Dz = denaming(V,A,z);
    set q = PP_and(Equality(A,a,b),gcd_inv(V,A,a,b,x0,y0));
    set r = valid_gcd_output(V,A,z,x0,y0);
    set g = SC_assignment(Da,z);
    set E = Equality(A);
    set sp = SC_Psuperpos(r,Da,z);
A4: <*sp,g,r*> is SFHT of ND(V,A) by NOMIN_3:29;
    q ||= sp
    proof
      let d be Element of ND(V,A);
      assume
A5:   d in dom q & q.d = TRUE;
      reconsider dd = d as TypeSCNominativeData of V,A by NOMIN_1:39;
      set X = {d where d is TypeSCNominativeData of V,A:
      d in dom Equality(A,a,b) & Equality(A,a,b).d = FALSE
      or d in dom gcd_inv(V,A,a,b,x0,y0) & gcd_inv(V,A,a,b,x0,y0).d = FALSE
      or d in dom Equality(A,a,b) & Equality(A,a,b).d = TRUE &
      d in dom gcd_inv(V,A,a,b,x0,y0) & gcd_inv(V,A,a,b,x0,y0).d = TRUE};
      d in X by A5,NOMIN_2:17;
      then
A6:   ex d1 being TypeSCNominativeData of V,A st d=d1 &
      (d1 in dom Equality(A,a,b) & Equality(A,a,b).d1 = FALSE or
      d1 in dom gcd_inv(V,A,a,b,x0,y0) & gcd_inv(V,A,a,b,x0,y0).d1 = FALSE
      or d1 in dom Equality(A,a,b) & Equality(A,a,b).d1 = TRUE &
      d1 in dom gcd_inv(V,A,a,b,x0,y0) & gcd_inv(V,A,a,b,x0,y0).d1 = TRUE);
A7:   dom Da = {d where d is NonatomicND of V,A: a in dom d} by NOMIN_1:def 18;
A8:   d in dom Da
      proof
        dom Equality(A,a,b) = dom Da /\ dom Db by Th11,A3;
        hence d in dom Da by A5,A6,PARTPR_1:19,XBOOLE_0:def 4;
      end;
      consider D being NonatomicND of V,A such that
A9:   d = D and a in dom D by A8,A7;
A10:  dom r = {d where d is TypeSCNominativeData of V,A: d in dom Dz} by Def26;
A11:  Da.d is TypeSCNominativeData of V,A
      proof
        Da.d in ND(V,A) by PARTFUN1:4,A8;
        then ex d1 being TypeSCNominativeData of V,A st Da.d = d1;
        hence thesis;
      end;
A12:  local_overlapping(V,A,d,Da.d,z) in dom Dz ::lemma
      proof
        ex d2 being NonatomicND of V,A st d2 = d & a in dom d2 by A8,A7;
        hence thesis by A1,A2,Th6,A11;
      end;
      then
A13:  local_overlapping(V,A,d,Da.d,z) in dom r by A10;
      thus
A14:  d in dom sp
      proof
        dd in {d where d is TypeSCNominativeData of V,A:
        local_overlapping(V,A,d,Da.d,z) in dom r & d in dom Da} by A8,A13;
        hence thesis by NOMIN_2:def 11;
      end;
      thus sp.d = TRUE
      proof
        set dlo = local_overlapping(V,A,D,Da.d,z);
A15:    sp.dd = r.dlo & dd in dom Da by A9,A14,NOMIN_2:35;
        valid_gcd_output_pred V,A,z,x0,y0,dlo
        proof
          gcd_inv_pred V,A,a,b,x0,y0,d by A5,A6,PARTPR_1:19,Def28;
          then consider d2 being NonatomicND of V,A such that
A16:      d = d2 & a in dom d2 &
          b in dom d2 & ex x,y being Nat st x = d2.a & y = d2.b &
          x gcd y = x0 gcd y0;
          consider X,Y being Nat such that
A17:      X = d2.a & Y = d2.b & X gcd Y = x0 gcd y0 by A16;
A18:      Da.d in A
          proof
            a is_a_value_on dd by A3;
            hence thesis;
          end;
A19:      d in dom Db
          proof
            dom Equality(A,a,b) = dom Da /\ dom Db by Th11,A3;
            hence thesis by A5,A6,PARTPR_1:19,XBOOLE_0:def 4;
          end;
A20:      Db.d in A
          proof
            b is_a_value_on dd by A3;
            hence thesis;
          end;
          dom <:Da,Db:> = dom Da /\ dom Db by FUNCT_3:def 7;
          then
A21:      d in dom <:Da,Db:> by XBOOLE_0:def 4,A8,A19;
A22:      Da.d = denaming(a,d2) by A8,A16,NOMIN_1:def 18
          .= d2.a by A16,NOMIN_1:def 12;
A23:      Db.d = denaming(b,d2) by A19,A16,NOMIN_1:def 18
          .= d2.b by A16,NOMIN_1:def 12;
          TRUE = E.(<:Da,Db:>.d) by A5,A6,A21,FUNCT_1:13,PARTPR_1:19
          .= E.(Da.d, Db.d) by FUNCT_3:def 7,A21;
          then
A24:      Da.d = Db.d by A18,A20,Def9;
A25:      X gcd Y = |.X.| by A24,A22,A23,A17,NEWTON02:3;
          reconsider d1 = dlo as NonatomicND of V,A by NOMIN_2:9;
A26:      z in dom d1
          proof
            d1 in {d where d is NonatomicND of V,A: z in dom d}
            by A9,A12,NOMIN_1:def 18;
            then ex dd1 being NonatomicND of V,A st d1 = dd1 & z in dom dd1;
            hence z in dom d1;
          end;
          d1.z = x0 gcd y0 by A1,A11,A22,A17,A25,NOMIN_2:10;
          hence thesis by A26;
        end;
        hence thesis by A15,A9,Def26,A13;
      end;
    end;
    hence thesis by A4,NOMIN_3:15;
  end;
