AOFA_000

index · ← COMPUT_1 · MATROID0 →
:: Mizar Analysis of Algorithms: Preliminaries
::  by Grzegorz Bancerek
::
:: Received July 9, 2007
:: Copyright (c) 2007-2026 Association of Mizar Users
::           (Stowarzyszenie Uzytkownikow Mizara, Bialystok, Poland).
:: This code can be distributed under the GNU General Public Licence
:: version 3.0 or later, or the Creative Commons Attribution-ShareAlike
:: License version 3.0 or later, subject to the binding interpretation
:: detailed in file COPYING.interpretation.
:: See COPYING.GPL and COPYING.CC-BY-SA for the full text of these
:: licenses, or see http://www.gnu.org/licenses/gpl.html and
:: http://creativecommons.org/licenses/by-sa/3.0/.

environ

 vocabularies NUMBERS, FUNCT_1, TARSKI, RELAT_1, XBOOLE_0, FINSEQ_1, ORDINAL4,
      UNIALG_1, BINOP_1, GROUP_1, FINSEQ_2, SUBSET_1, FUNCOP_1, PARTFUN1,
      NAT_1, FUNCT_2, CARD_1, COMPUT_1, TREES_3, TREES_4, FINSET_1, TREES_1,
      MEMBERED, XXREAL_0, ARYTM_3, FUNCT_4, FUNCT_7, STRUCT_0, INCPROJ, CARD_3,
      FREEALG, DTCONSTR, TREES_2, LANG1, TDGROUP, MSUALG_1, ORDINAL1, MSAFREE,
      NEWTON, ZFMISC_1, UNIALG_2, PRELAMB, CQC_SIM1, MSUALG_3, WELLORD1,
      MCART_1, SUPINF_1, ARYTM_1, SUPINF_2, MESFUNC1, FUNCT_5, SETFAM_1,
      AOFA_000;
 notations TARSKI, XBOOLE_0, ZFMISC_1, SUBSET_1, ENUMSET1, SETFAM_1, ORDINAL1,
      MEMBERED, RELAT_1, FUNCT_1, RELSET_1, PARTFUN1, FUNCT_2, FINSET_1, LANG1,
      BINOP_1, CARD_1, CARD_3, FINSEQ_1, FINSEQ_2, XXREAL_2, NUMBERS,
      XXREAL_3, XCMPLX_0,
      XXREAL_0, TREES_1, TREES_2, TREES_3, NAT_1, NAT_D, SUPINF_1, MESFUNC1,
      FUNCOP_1, FUNCT_4, FUNCT_5, FUNCT_7, ABIAN, MARGREL1, STRUCT_0, UNIALG_1,
      UNIALG_2, ALG_1, FREEALG, PUA2MSS1, COMPUT_1, SUPINF_2, TREES_4,
      DTCONSTR, FINSEQ_4, RECDEF_1;
 constructors PUA2MSS1, COMPUT_1, BORSUK_1, SUPINF_2, FINSEQ_4, FACIRC_1,
      ALG_1, FREEALG, FINSEQOP, WELLORD2, CAT_2, ABIAN, RECDEF_1, MESFUNC1,
      SUPINF_1, NAT_D, MARGREL1, FUNCT_5, XTUPLE_0;
 registrations FUNCT_1, FINSEQ_2, FUNCT_2, FINSEQ_1, UNIALG_1, NAT_1, STRUCT_0,
      PUA2MSS1, DTCONSTR, FREEALG, FUNCT_7, SUBSET_1, XXREAL_0, XREAL_0,
      TREES_2, TREES_3, MEMBERED, XBOOLE_0, FINSET_1, TREES_1, FACIRC_1,
      RELAT_1, VALUED_0, CARD_1, XXREAL_2, RELSET_1, FINSEQ_3, MARGREL1,
      XTUPLE_0, ORDINAL1;
 requirements BOOLE, SUBSET, NUMERALS, ARITHM, REAL;
 definitions MEMBERED, TARSKI, FUNCT_1, FREEALG, RELAT_1, FINSEQ_1, UNIALG_1,
      UNIALG_2, COMPUT_1, XBOOLE_0, MARGREL1;
 equalities SUBSET_1, TREES_4, PUA2MSS1, FREEALG, RELAT_1, FINSEQ_1, UNIALG_2,
      BINOP_1, SUPINF_2;
 expansions TARSKI, FUNCT_1, UNIALG_2, COMPUT_1, MARGREL1;
 theorems XBOOLE_1, ZFMISC_1, RELAT_1, RELSET_1, FUNCT_2, FUNCOP_1, COMPUT_1,
      UNIALG_1, FINSEQ_1, FINSEQ_2, TARSKI, XBOOLE_0, FINSEQ_3, XREAL_1,
      FUNCT_7, NAT_1, ORDINAL1, PARTFUN1, FUNCT_3, DTCONSTR, FUNCT_4, FREEALG,
      TREES_4, FUNCT_1, LANG1, CARD_1, CARD_5, TREES_3, ENUMSET1, FINSEQ_5,
      WELLORD2, UNIALG_2, FINSET_1, STIRL2_1, FUNCT_5, FUNCT_6, MSUALG_1,
      ALG_1, XREAL_0, XXREAL_0, SETFAM_1, MSUALG_8, XXREAL_2, NAT_D, XXREAL_3,
      MARGREL1, XTUPLE_0, SUBSET_1;
 schemes NAT_1, FUNCT_1, RECDEF_1, FINSEQ_2, CIRCCMB3, PRE_CIRC, XBOOLE_0,
      CLASSES1, ALTCAT_2, FINSEQ_1;

begin :: Binary operations, orbits, and iterations

notation
  let x be object,y be set;
  antonym x nin y for x in y;
end;

theorem Th1:
  for f,g,h being Function
  for A being set st A c= dom f & A c= dom g & rng h c= A &
  for x being set st x in A holds f.x = g.x holds f*h = g*h
proof
  let f,g,h be Function;
  let A be set such that
A1: A c= dom f and
A2: A c= dom g and
A3: rng h c= A and
A4: for x being set st x in A holds f.x = g.x;
A5: dom (f*h) = dom h by A1,A3,RELAT_1:27,XBOOLE_1:1;
A6: dom (g*h) = dom h by A2,A3,RELAT_1:27,XBOOLE_1:1;
  now
    let x be object;
    assume
A7: x in dom h;
    then
A8: (f*h).x = f.(h.x) by FUNCT_1:13;
A9: (g*h).x = g.(h.x) by A7,FUNCT_1:13;
    h.x in rng h by A7,FUNCT_1:3;
    hence (f*h).x = (g*h).x by A3,A4,A8,A9;
  end;
  hence thesis by A5,A6;
end;

registration
  let x,y be non empty set;
  cluster <*x,y*> -> non-empty;
  coherence
  proof
    assume {} in rng <*x,y*>;
    then {} in {x,y} by FINSEQ_2:127;
    hence thesis by TARSKI:def 2;
  end;
end;

registration
  let p,q be non-empty FinSequence;
  cluster p^q -> non-empty;
  coherence
  proof
    assume {} in rng (p^q);
    then {} in (rng p) \/ rng q by FINSEQ_1:31;
    then {} in rng p or {} in rng q by XBOOLE_0:def 3;
    hence thesis;
  end;
end;

definition
  let f be homogeneous Function;
  let x be set;
  pred x is_a_unity_wrt f means
   for y,z being set st <*y,z*> in dom f or <*z,y*> in dom f
  holds <*x,y*> in dom f & f.<*x,y*> = y & <*y,x*> in dom f & f.<*y,x*> = y;
end;

definition
  let f be homogeneous Function;
  attr f is associative means
  :
  Def2: for x,y,z being set st <*x,y*> in dom f & <*y,z*> in dom f &
  <*f.<*x,y*>,z*> in dom f & <*x,f.<*y,z*>*> in dom f
  holds f.<*f.<*x,y*>,z*> = f.<*x,f.<*y,z*>*>;
  attr f is unital means
  : Def3:
  ex x being set st x is_a_unity_wrt f;
end;

definition
  let X be set;
  let Y be non empty set;
  let Z be FinSequenceSet of X;
  let y be Element of Y;
  redefine func Z --> y -> PartFunc of X*,Y;  :: redefines --> (FUNCOP_1, definition)
  coherence
  proof
A1: dom (Z --> y) = Z by FUNCOP_1:13;
    rng (Z --> y) c= {y} by FUNCOP_1:13;
    hence thesis by A1,FINSEQ_2:90,RELSET_1:4;
  end;
end;

registration
  let X be non empty set;
  let x be Element of X;
  let n be Nat;
  cluster (n-tuples_on X) --> x ->
    non empty quasi_total homogeneous for PartFunc of X*, X;
  coherence
  proof
    reconsider m = n as Element of NAT by ORDINAL1:def 12;
    set f = (n-tuples_on X) --> x;
A1: dom f = m-tuples_on X by FUNCOP_1:13;
    then reconsider f as non empty homogeneous PartFunc of X*, X
    by COMPUT_1:16;
    arity f = m by A1,COMPUT_1:24;
    hence thesis by A1,COMPUT_1:22;
  end;
end;

theorem Th2:
  for X being non empty set, x being Element of X
  for n being Nat holds arity ((n-tuples_on X) --> x) = n
proof
  let X be non empty set;
  let x be Element of X;
  let n be Nat;
  reconsider m = n as Element of NAT by ORDINAL1:def 12;
  set f = (n-tuples_on X) --> x;
  dom f = m-tuples_on X by FUNCOP_1:13;
  hence thesis by COMPUT_1:24;
end;

Lm1: for X be non empty set, x be Element of X, n be Nat
 holds (n-tuples_on X) --> x is n-ary by Th2;

registration
  let X be non empty set;
  let x be Element of X;
  let n be Nat;
  cluster (n-tuples_on X) --> x -> n-ary for homogeneous PartFunc of X*, X;
  coherence by Lm1;
end;

registration
  let X be non empty set;
  cluster 2-ary associative unital
    for non empty quasi_total homogeneous PartFunc of X*, X;
  existence
  proof
    set x = the Element of X;
    deffunc F((Element of X), Element of X) = IFEQ($1,x,$2,$1);
    (ex f being Function of 2-tuples_on X, X st
    for x,y being Element of X holds f.<*x,y*> = F(x,y)) &
    for f1,f2 being Function of 2-tuples_on X, X st
    (for x,y being Element of X holds f1.<*x,y*> = F(x,y)) &
    (for x,y being Element of X holds f2.<*x,y*> = F(x,y))
    holds f1 = f2 from CIRCCMB3:sch 7;
    then consider f being Function of 2-tuples_on X, X such that
A1: for a,b being Element of X holds f.<*a,b*> = IFEQ(a,x,b,a);
A2: rng f c= X;
A3: dom f = 2-tuples_on X by FUNCT_2:def 1;
    then reconsider f as non empty homogeneous PartFunc of X*, X
    by A2,COMPUT_1:16,FINSEQ_2:134,RELSET_1:4;
    arity f = 2 by A3,COMPUT_1:24;
    then reconsider f as non empty quasi_total homogeneous PartFunc of X*, X
    by A3,COMPUT_1:22;
    take f;
    thus arity f = 2 by A3,COMPUT_1:24;
    hereby
      let u,y,z be set;
      assume that
A4:   <*u,y*> in dom f and
A5:   <*y,z*> in dom f;
      reconsider u9 = u, y9 = y, z9 = z as Element of X by A3,A4,A5,
FINSEQ_2:138;
      assume that <*f.<*u,y*>,z*> in dom f and <*u,f.<*y,z*>*> in dom f;
A6:   u = x implies IFEQ(u,x,y,u) = y by FUNCOP_1:def 8;
A7:   u <> x implies IFEQ(u,x,y,u) = u by FUNCOP_1:def 8;
A8:   u = x implies IFEQ(u,x,IFEQ(y,x,z,y),u) = IFEQ(y,x,z,y) by FUNCOP_1:def 8
;
A9:   u <> x implies IFEQ(u,x,IFEQ(y,x,z,y),u) = u by FUNCOP_1:def 8;
A10:  u <> x implies IFEQ(u,x,z,u) = u by FUNCOP_1:def 8;
      thus f.<*f.<*u,y*>,z*> = f.<*IFEQ(u9,x,y9,u9),z9*> by A1
        .= IFEQ(IFEQ(u,x,y,u),x,z,IFEQ(u,x,y,u)) by A1
        .= f.<*u9,IFEQ(y9,x,z9,y9)*> by A1,A6,A7,A8,A9,A10
        .= f.<*u,f.<*y,z*>*> by A1;
    end;
    take x;
    let y,z be set;
    assume <*y,z*> in dom f or <*z,y*> in dom f;
    then reconsider y9 = y as Element of X by A3,FINSEQ_2:138;
    <*x,y9*> in 2-tuples_on X by FINSEQ_2:137;
    hence <*x,y*> in dom f by FUNCT_2:def 1;
    thus f.<*x,y*> = IFEQ(x,x,y9,x) by A1
      .= y by FUNCOP_1:def 8;
    <*y9,x*> in 2-tuples_on X by FINSEQ_2:137;
    hence <*y,x*> in dom f by FUNCT_2:def 1;
A11: x = y or x <> y;
    thus f.<*y,x*> = IFEQ(y9,x,x,y9) by A1
      .= y by A11,FUNCOP_1:def 8;
  end;
  cluster 0-ary for non empty quasi_total homogeneous PartFunc of X*, X;
  existence
  proof
    set x = the Element of X;
    set f = (0-tuples_on X) --> x;
    take f;
    thus arity f = 0 by Th2;
  end;
  cluster 3-ary for non empty quasi_total homogeneous PartFunc of X*, X;
  existence
  proof
    set x = the Element of X;
    set f = (3-tuples_on X) --> x;
    take f;
    thus arity f = 3 by Th2;
  end;
end;

theorem Th3:
  for X being non empty set for p being FinSequence of FinTrees X
  for x,t being set st t in rng p holds t <> x-tree p
proof
  let X be non empty set;
  let p be FinSequence of FinTrees X;
  let x,t be set;
  assume
A1: t in rng p;
  then reconsider T = t as Element of FinTrees X;
  reconsider A = dom T as finite Tree;
  defpred P[set] means not contradiction;
  deffunc F(Element of A) = len $1;
  {F(e) where e is Element of A: P[e]} is finite from PRE_CIRC:sch 1;
  then reconsider B = {F(e) where e is Element of A: P[e]} as finite set;
  set e = the Element of A;
A2: F(e) in B;
  B is real-membered
  proof
    let a be object;
    assume a in B;
    then ex e being Element of A st a = F(e);
    hence thesis;
  end;
  then reconsider B as non empty finite real-membered set by A2;
  max B in B by XXREAL_2:def 8;
  then consider e being Element of A such that
A3: max B = len e;
  consider i being object such that
A4: i in dom p and
A5: t = p.i by A1,FUNCT_1:def 3;
  reconsider i as Nat by A4;
  i >= 1 by A4,FINSEQ_3:25;
  then consider j being Nat such that
A6: i = 1+j by NAT_1:10;
  i <= len p by A4,FINSEQ_3:25;
  then
A7: j < len p by A6,NAT_1:13;
A8: <*j*>^e in dom (x-tree p) by A5,A6,A7,TREES_4:11;
  len (<*j*>^e) = 1+len e by FINSEQ_5:8;
  then len (<*j*>^e) > max B by A3,NAT_1:13;
  then len (<*j*>^e) nin B by XXREAL_2:def 8;
  hence thesis by A8;
end;

definition
  let f,g be Function;
  let X be set;
  func (f,X)+*g -> Function equals
  g+*(f|X);
  coherence;
end;

theorem Th4:
  for f,g being Function, x,X being set holds
  x in X & X c= dom f implies ((f,X)+*g).x = f.x
proof
  let f,g be Function;
  let x,X be set;
  assume
A1: x in X;
  assume
A2: X c= dom f;
  dom (f|X) = dom f /\ X by RELAT_1:61;
  then
A3: x in dom (f|X) by A1,A2,XBOOLE_0:def 4;
  then (f|X).x = f.x by FUNCT_1:47;
  hence thesis by A3,FUNCT_4:13;
end;

theorem Th5:
  for f,g being Function, x,X being set holds
  x nin X & x in dom g implies ((f,X)+*g).x = g.x
proof
  let f,g be Function;
  let x,X be set;
  assume x nin X;
  then x nin dom f /\ X by XBOOLE_0:def 4;
  then x nin dom (f|X) by RELAT_1:61;
  hence thesis by FUNCT_4:11;
end;

definition
  let X,Y be non empty set;
  let f,g be Element of Funcs(X,Y);
  let A be set;
  redefine func (f,A)+*g -> Element of Funcs(X,Y);  :: redefines +* (AOFA_000, definition)
  coherence
  proof
    dom g = X by FUNCT_2:92;
    then dom g \/ dom (f|A) = X by XBOOLE_1:12;
    then
A1: dom ((f,A)+*g) = X by FUNCT_4:def 1;
    rng ((f,A)+*g) c= rng g \/ rng (f|A) by FUNCT_4:17;
    then rng ((f,A)+*g) c= Y by XBOOLE_1:1;
    hence thesis by A1,FUNCT_2:def 2;
  end;
end;

definition
  let X,Y,Z be non empty set;
  let f be Element of Funcs(X,Y);
  let g be Element of Funcs(Y,Z);
  redefine func g*f -> Element of Funcs(X,Z);  :: redefines * (FUNCT_1, synonym) → * (RELAT_1, synonym) → (#) (RELAT_1, definition)
  coherence
  proof
    g*f is Function of X,Z;
    hence thesis by FUNCT_2:8;
  end;
end;

definition
  let f be Function;
  let x be object;
  func f orbit x -> set equals
  {iter(f,n).x where n is Element of NAT: x in dom iter(f,n)};
  coherence;
end;

theorem Th6:
  for f being Function, x being set st x in dom f holds x in f orbit x
proof
  let f be Function;
  let x be set;
  assume x in dom f;
  then
A1: x in dom f \/ rng f by XBOOLE_0:def 3;
A2: iter(f,0) = id (field f) by FUNCT_7:68;
  then
A3: iter(f,0).x = x by A1,FUNCT_1:17;
  dom iter(f,0) = dom f \/ rng f by A2;
  hence thesis by A1,A3;
end;

theorem
  for f being Function, x,y being set
  st rng f c= dom f & y in f orbit x holds f.y in f orbit x
proof
  let f be Function;
  let x,y be set;
  assume
A1: rng f c= dom f;
  assume y in f orbit x;
  then consider n being Element of NAT such that
A2: y = iter(f,n).x and
A3: x in dom iter(f,n);
A4: iter(f,n+1) = f*iter(f,n) by FUNCT_7:71;
  then
A5: f.y = iter(f,n+1).x by A2,A3,FUNCT_1:13;
A6: y in rng iter(f,n) by A2,A3,FUNCT_1:def 3;
A7: rng iter(f,n) c= field f by FUNCT_7:72;
  field f = dom f by A1,XBOOLE_1:12;
  then x in dom iter(f,n+1) by A2,A3,A4,A6,A7,FUNCT_1:11;
  hence thesis by A5;
end;

theorem
  for f being Function, x being set st x in dom f holds f.x in f orbit x
proof
  let f be Function;
  let x be set;
  assume
A1: x in dom f;
  iter(f,1) = f by FUNCT_7:70;
  hence thesis by A1;
end;

theorem Th9:
  for f being Function, x being set st x in dom f
  holds f orbit (f.x) c= f orbit x
proof
  let f be Function;
  let x be set;
  assume that
A1: x in dom f;
  let a be object;
  assume a in f orbit (f.x);
  then consider n being Element of NAT such that
A2: a = iter(f,n).(f.x) and
A3: f.x in dom iter(f,n);
A4: iter(f,n+1) = iter(f,n)*f by FUNCT_7:69;
  then
A5: a = iter(f,n+1).x by A1,A2,FUNCT_1:13;
  x in dom iter(f,n+1) by A1,A3,A4,FUNCT_1:11;
  hence thesis by A5;
end;

definition
  let f be Function such that
A1: rng f c= dom f;
  let A be set;
  let x be set;
  defpred T[Nat] means
  for a being set st a in dom f holds a in dom iter(f,$1);
A2: field f = dom f by A1,XBOOLE_1:12;
  then iter(f,0) = id dom f by FUNCT_7:68;
  then
A3: T[0];
A4: now
    let i be Nat;
    assume
A5: T[i];
    thus T[i+1]
    proof
      let a be set;
      assume a in dom f;
      then
A6:   a in dom iter(f,i) by A5;
      then
A7:   iter(f,i).a in rng iter(f,i) by FUNCT_1:def 3;
A8:   rng iter(f,i) c= dom f by A2,FUNCT_7:72;
      iter(f,i+1) = f*iter(f,i) by FUNCT_7:71;
      hence thesis by A6,A7,A8,FUNCT_1:11;
    end;
  end;
A9: for i being Nat holds T[i] from NAT_1:sch 2(A3,A4);
  func (A,x) iter f -> Function means
  dom it = dom f &
  for a being set st a in dom f holds (f orbit a c= A implies it.a = x) &
  for n being Nat st iter(f,n).a nin A &
  for i being Nat st i < n holds iter(f,i).a in A holds it.a = iter(f,n).a;
  existence
  proof
    defpred P[object] means f orbit $1 c= A;
    consider Z being set such that
A10: for a being object holds a in Z iff a in dom f & P[a] from XBOOLE_0:sch 1
;
A11: Z c= dom f
    by A10;
    defpred Q[object,object] means
    ex n being Nat st $2 = iter(f,n).$1 & $2 nin A &
    for i being Nat st i < n holds iter(f,i).$1 in A;
A12: for a being object st a in (dom f) \ Z ex b being object st Q[a,b]
    proof
      let a be object;
      assume
A13:  a in (dom f) \ Z;
      then a nin Z by XBOOLE_0:def 5;
      then not f orbit a c= A by A10,A13;
      then consider y being object such that
A14:  y in f orbit a and
A15:  y nin A;
A16:  ex n1 being Element of NAT st ( y = iter(f,n1).a)&( a in dom
      iter(f,n1)) by A14;
      defpred R[Nat] means iter(f,$1).a nin A;
A17:  ex n being Nat st R[n] by A15,A16;
      consider n being Nat such that
A18:  R[n] and
A19:  for m being Nat st R[m] holds n <= m from NAT_1:sch 5(A17);
      take b = iter(f,n).a, n;
      thus b = iter(f,n).a & b nin A by A18;
      let i be Nat;
      thus thesis by A19;
    end;
    consider h being Function such that
A20: dom h = (dom f) \ Z and
A21: for a being object st a in (dom f) \ Z holds Q[a,h.a]
    from CLASSES1:sch 1(
    A12
    );
    take g = (Z-->x)+*h;
    dom (Z-->x) = Z by FUNCOP_1:13;
    hence dom g = Z \/ (dom f \ Z) by A20,FUNCT_4:def 1
      .= dom f by A11,XBOOLE_1:45;
    let a be set;
    assume
A22: a in dom f;
    hereby
      assume f orbit a c= A;
      then
A23:  a in Z by A10,A22;
      then
A24:  a nin dom f \ Z by XBOOLE_0:def 5;
      (Z-->x).a = x by A23,FUNCOP_1:7;
      hence g.a = x by A20,A24,FUNCT_4:11;
    end;
    let n be Nat;
    assume that
A25: iter(f,n).a nin A and
A26: for i being Nat st i < n holds iter(f,i).a in A;
A27: n in NAT by ORDINAL1:def 12;
    a in dom iter(f,n) by A9,A22;
    then iter(f,n).a in f orbit a by A27;
    then not f orbit a c= A by A25;
    then a nin Z by A10;
    then
A28: a in dom f \ Z by A22,XBOOLE_0:def 5;
    then consider n2 being Nat such that
A29: h.a = iter(f,n2).a and
A30: h.a nin A and
A31: for i being Nat st i < n2 holds iter(f,i).a in A by A21;
A32: n <= n2 by A26,A29,A30;
    n2 <= n by A25,A31;
    then n = n2 by A32,XXREAL_0:1;
    hence thesis by A20,A28,A29,FUNCT_4:13;
  end;
  uniqueness
  proof
    let f1,f2 be Function such that
A33: dom f1 = dom f and
A34: for a being set st a in dom f holds (f orbit a c= A implies f1.a = x) &
    for n being Nat st iter(f,n).a nin A &
    for i being Nat st i < n holds iter(f,i).a in A
    holds f1.a = iter(f,n).a and
A35: dom f2 = dom f and
A36: for a being set st a in dom f holds (f orbit a c= A implies f2.a = x) &
    for n being Nat st iter(f,n).a nin A &
    for i being Nat st i < n holds iter(f,i).a in A holds f2.a = iter(f,n).a;
    now
      let a be object;
      assume
A37:  a in dom f;
      per cases;
      suppose
A38:    f orbit a c= A;
        hence f1.a = x by A34,A37
          .= f2.a by A36,A37,A38;
      end;
      suppose not f orbit a c= A;
        then consider y being object such that
A39:    y in f orbit a and
A40:    y nin A;
A41:    ex n1 being Element of NAT st ( y = iter(f,n1).a)&( a in dom
        iter(f,n1)) by A39;
        defpred R[Nat] means iter(f,$1).a nin A;
A42:    ex n being Nat st R[n] by A40,A41;
        consider n being Nat such that
A43:    R[n] and
A44:    for m being Nat st R[m] holds n <= m from NAT_1:sch 5(A42);
A45:    for i be Nat holds i < n implies iter(f,i).a in A by A44;
        hence f1.a = iter(f,n).a by A34,A37,A43
          .= f2.a by A36,A37,A43,A45;
      end;
    end;
    hence thesis by A33,A35;
  end;
end;

definition
  let f be Function such that
A1: rng f c= dom f;
  let A be set;
  let g be Function;
  defpred T[Nat] means
  for a being set st a in dom f holds a in dom iter(f,$1);
A2: field f = dom f by A1,XBOOLE_1:12;
  then iter(f,0) = id dom f by FUNCT_7:68;
  then
A3: T[0];
A4: now
    let i be Nat;
    assume
A5: T[i];
    thus T[i+1]
    proof
      let a be set;
      assume a in dom f;
      then
A6:   a in dom iter(f,i) by A5;
      then
A7:   iter(f,i).a in rng iter(f,i) by FUNCT_1:def 3;
A8:   rng iter(f,i) c= dom f by A2,FUNCT_7:72;
      iter(f,i+1) = f*iter(f,i) by FUNCT_7:71;
      hence thesis by A6,A7,A8,FUNCT_1:11;
    end;
  end;
A9: for i being Nat holds T[i] from NAT_1:sch 2(A3,A4);
  func (A,g) iter f -> Function means
  : Def7:
  dom it = dom f &
  for a being set st a in dom f holds (f orbit a c= A implies it.a = g.a) &
  for n being Nat st iter(f,n).a nin A &
  for i being Nat st i < n holds iter(f,i).a in A holds it.a = iter(f,n).a;
  existence
  proof
    defpred P[object] means f orbit $1 c= A;
    consider Z being set such that
A10: for a being object holds a in Z iff a in dom f & P[a] from XBOOLE_0:sch 1
;
A11: Z c= dom f
    by A10;
    defpred Q[object,object] means
ex n being Nat st $2 = iter(f,n).$1 & $2 nin A &
    for i being Nat st i < n holds iter(f,i).$1 in A;
A12: for a being object st a in (dom f) \ Z ex b being object st Q[a,b]
    proof
      let a be object;
      assume
A13:  a in (dom f) \ Z;
      then a nin Z by XBOOLE_0:def 5;
      then not f orbit a c= A by A10,A13;
      then consider y being object such that
A14:  y in f orbit a and
A15:  y nin A;
A16:  ex n1 being Element of NAT st ( y = iter(f,n1).a)&( a in dom
      iter(f,n1)) by A14;
      defpred R[Nat] means iter(f,$1).a nin A;
A17:  ex n being Nat st R[n] by A15,A16;
      consider n being Nat such that
A18:  R[n] and
A19:  for m being Nat st R[m] holds n <= m from NAT_1:sch 5(A17);
      take b = iter(f,n).a, n;
      thus b = iter(f,n).a & b nin A by A18;
      let i be Nat;
      thus thesis by A19;
    end;
    consider h being Function such that
A20: dom h = (dom f) \ Z and
A21: for a being object st a in (dom f) \ Z holds Q[a,h.a]
from CLASSES1:sch 1(
    A12
    );
    take i = (Z-->0)+*(g|Z)+*h;
    dom (Z-->0) = Z by FUNCOP_1:13;
    then dom ((Z-->0)+*(g|Z)) = Z \/ dom(g|Z) by FUNCT_4:def 1
      .= Z by RELAT_1:58,XBOOLE_1:12;
    hence dom i = Z \/ (dom f \ Z) by A20,FUNCT_4:def 1
      .= dom f by A11,XBOOLE_1:45;
    let a be set;
    assume
A22: a in dom f;
    hereby
      assume f orbit a c= A;
      then
A23:  a in Z by A10,A22;
      then a nin dom f \ Z by XBOOLE_0:def 5;
      then
A24:  i.a = ((Z-->0)+*(g|Z)).a by A20,FUNCT_4:11;
      per cases;
      suppose a in dom(g|Z);
        then i.a = (g|Z).a by A24,FUNCT_4:13;
        hence i.a = g.a by A23,FUNCT_1:49;
      end;
      suppose
A25:    a nin dom(g|Z);
        then
A26:    i.a = (Z-->0).a by A24,FUNCT_4:11;
A27:    (Z-->0).a = 0 by A23,FUNCOP_1:7;
        a nin dom g by A23,A25,RELAT_1:57;
        hence i.a = g.a by A26,A27,FUNCT_1:def 2;
      end;
    end;
    let n be Nat;
    reconsider n9 = n as Element of NAT by ORDINAL1:def 12;
    assume that
A28: iter(f,n).a nin A and
A29: for i being Nat st i < n holds iter(f,i).a in A;
    a in dom iter(f,n9) by A9,A22;
    then iter(f,n).a in f orbit a;
    then not f orbit a c= A by A28;
    then a nin Z by A10;
    then
A30: a in dom f \ Z by A22,XBOOLE_0:def 5;
    then consider n2 being Nat such that
A31: h.a = iter(f,n2).a and
A32: h.a nin A and
A33: for i being Nat st i < n2 holds iter(f,i).a in A by A21;
A34: n <= n2 by A29,A31,A32;
    n2 <= n by A28,A33;
    then n = n2 by A34,XXREAL_0:1;
    hence thesis by A20,A30,A31,FUNCT_4:13;
  end;
  uniqueness
  proof
    let f1,f2 be Function such that
A35: dom f1 = dom f and
A36: for a being set st a in dom f holds (f orbit a c= A implies f1.a = g.a) &
    for n being Nat st iter(f,n).a nin A &
    for i being Nat st i < n holds iter(f,i).a in A
    holds f1.a = iter(f,n).a and
A37: dom f2 = dom f and
A38: for a being set st a in dom f holds (f orbit a c= A implies f2.a = g.a) &
    for n being Nat st iter(f,n).a nin A &
    for i being Nat st i < n holds iter(f,i).a in A holds f2.a = iter(f,n).a;
    now
      let a be object;
      assume
A39:  a in dom f;
      per cases;
      suppose
A40:    f orbit a c= A;
        hence f1.a = g.a by A36,A39
          .= f2.a by A38,A39,A40;
      end;
      suppose not f orbit a c= A;
        then consider y being object such that
A41:    y in f orbit a and
A42:    y nin A;
A43:    ex n1 being Element of NAT st ( y = iter(f,n1).a)&( a in dom
        iter(f,n1)) by A41;
        defpred R[Nat] means iter(f,$1).a nin A;
A44:    ex n being Nat st R[n] by A42,A43;
        consider n being Nat such that
A45:    R[n] and
A46:    for m being Nat st R[m] holds n <= m from NAT_1:sch 5(A44);
A47:    for i be Nat holds i < n implies iter(f,i).a in A by A46;
        hence f1.a = iter(f,n).a by A36,A39,A45
          .= f2.a by A38,A39,A45,A47;
      end;
    end;
    hence thesis by A35,A37;
  end;
end;

theorem Th10:
  for f,g being Function, a,A being set st rng f c= dom f & a in dom f holds
  not f orbit a c= A implies
  ex n being Nat st ((A,g) iter f).a = iter(f,n).a & iter(f,n).a nin A &
  for i being Nat st i < n holds iter(f,i).a in A
proof
  let f,g be Function;
  let a,A be set;
  assume
A1: rng f c= dom f;
  assume
A2: a in dom f;
  assume not f orbit a c= A;
  then consider y being object such that
A3: y in f orbit a and
A4: y nin A;
A5: ex n1 being Element of NAT st ( y = iter(f,n1).a)&( a in dom
  iter(f,n1)) by A3;
  defpred R[Nat] means iter(f,$1).a nin A;
A6: ex n being Nat st R[n] by A4,A5;
  consider n being Nat such that
A7: R[n] and
A8: for m being Nat st R[m] holds n <= m from NAT_1:sch 5(A6);
  take n;
  for i being Nat holds i < n implies iter(f,i).a in A by A8;
  hence ((A,g) iter f).a = iter(f,n).a by A1,A2,A7,Def7;
  thus thesis by A7,A8;
end;

theorem Th11:
  for f,g being Function, a,A being set
  st rng f c= dom f & a in dom f & g*f = g holds
  a in A implies ((A,g) iter f).a = ((A,g) iter f).(f.a)
proof
  let f,g be Function;
  let a,A be set;
  assume that
A1: rng f c= dom f and
A2: a in dom f and
A3: g*f = g and
A4: a in A;
A5: f.a in rng f by A2,FUNCT_1:def 3;
A6: f orbit (f.a) c= f orbit a by A2,Th9;
  per cases;
  suppose
A7: f orbit a c= A;
    then f orbit (f.a) c= A by A6;
    then ((A,g) iter f).(f.a) = g.(f.a) by A1,A5,Def7
      .= g.a by A2,A3,FUNCT_1:13;
    hence thesis by A1,A2,A7,Def7;
  end;
  suppose not f orbit a c= A;
    then consider n being Nat such that
A8: ((A,g) iter f).a = iter(f,n).a and
A9: iter(f,n).a nin A and
A10: for i being Nat st i < n holds iter(f,i).a in A by A1,A2,Th10;
    field f = dom f by A1,XBOOLE_1:12;
    then iter(f,0) = id dom f by FUNCT_7:68;
    then n <> 0 by A2,A4,A9,FUNCT_1:18;
    then n >= 0+1 by NAT_1:13;
    then consider i being Nat such that
A11: n = 1+i by NAT_1:10;
    iter(f,n) = iter(f,i)*f by A11,FUNCT_7:69;
    then
A12: iter(f,n).a = iter(f,i).(f.a) by A2,FUNCT_1:13;
    now
      let j be Nat;
      assume j < i;
      then
A13:  j+1 < n by A11,XREAL_1:8;
A14:  iter(f,j+1) = iter(f,j)*f by FUNCT_7:69;
      iter(f,j+1).a in A by A10,A13;
      hence iter(f,j).(f.a) in A by A2,A14,FUNCT_1:13;
    end;
    hence thesis by A1,A5,A8,A9,A12,Def7;
  end;
end;

theorem Th12:
  for f,g being Function, a,A being set st rng f c= dom f & a in dom f holds
  a nin A implies ((A,g) iter f).a = a
proof
  let f,g be Function;
  let a,A be set;
  assume that
A1: rng f c= dom f and
A2: a in dom f and
A3: a nin A;
  field f = dom f by A1,XBOOLE_1:12;
  then iter(f,0) = id dom f by FUNCT_7:68;
  then
A4: a = iter(f,0).a by A2,FUNCT_1:18;
  for i being Nat st i < 0 holds iter(f,i).a in A;
  hence thesis by A1,A2,A3,A4,Def7;
end;

definition
  let X be non empty set;
  let f be Element of Funcs(X,X);
  let A be set;
  let g be Element of Funcs(X,X);
  redefine func (A,g) iter f -> Element of Funcs(X,X);  :: redefines iter (AOFA_000, definition)
  coherence
  proof
A1: dom f = X by FUNCT_2:def 1;
A2: rng f c= X;
    then
A3: dom ((A,g) iter f) = dom f by A1,Def7;
    rng ((A,g) iter f) c= X
    proof
      let a be object;
      assume a in rng ((A,g) iter f);
      then consider b being object such that
A4:   b in dom ((A,g) iter f) and
A5:   a = ((A,g) iter f).b by FUNCT_1:def 3;
      reconsider b as Element of X by A1,A2,A4,Def7;
      per cases;
      suppose f orbit b c= A;
        then a = g.b by A1,A2,A5,Def7;
        hence thesis;
      end;
      suppose not f orbit b c= A;
        then consider n being Nat such that
A6:     ((A,g) iter f).b = iter(f,n).b and iter(f,n).b nin A
        and for i being Nat st i < n holds iter(f,i).b in A by A1,A2,Th10;
A7:     dom iter(f,n) = dom f by A1,A2,FUNCT_7:74;
        a in rng iter(f,n) by A1,A5,A6,A7,FUNCT_1:3;
        hence thesis;
      end;
    end;
    hence thesis by A1,A3,FUNCT_2:def 2;
  end;
end;

begin :: Free universal algebras

theorem Th13:
  for X being non empty set, S being non empty FinSequence of NAT
  ex A being Universal_Algebra st the carrier of A = X & signature A = S
proof
  let X be non empty set;
  let S be non empty FinSequence of NAT;
A1: dom S = Seg len S by FINSEQ_1:def 3;
  set x = the Element of X;
  defpred P[object,object] means
  ex i,j being Nat st $1 = i & j = S.i & $2 = (j-tuples_on X)--> x;
A2: for y being object st y in dom S ex z being object st P[y,z]
  proof
    let y be object;
    assume y in dom S;
    then reconsider i = y as Element of NAT;
    reconsider j = S.i as Element of NAT;
    take (j-tuples_on X)--> x, i, j;
    thus thesis;
  end;
  consider ch being Function such that
A3: dom ch = dom S & for y being object st y in dom S holds P[y,ch.y]
  from CLASSES1:sch 1(A2);
  reconsider ch as FinSequence by A1,A3,FINSEQ_1:def 2;
  rng ch c= PFuncs(X*,X)
  proof
    let y be object;
    assume y in rng ch;
    then consider xi being object such that
A4: xi in dom ch and
A5: y = ch.xi by FUNCT_1:def 3;
    consider i,j being Nat such that
    xi = i and j = S.i and
A6: y = (j-tuples_on X)--> x by A3,A4,A5;
A7: dom ((j-tuples_on X)--> x) = (j-tuples_on X) by FUNCOP_1:13;
    rng ((j-tuples_on X)--> x) c= {x} by FUNCOP_1:13;
    hence thesis by A6,A7,PARTFUN1:def 3;
  end;
  then reconsider ch as PFuncFinSequence of X by FINSEQ_1:def 4;
  set A = UAStr(#X,ch#);
A8: A is quasi_total
  proof
    let n be Nat, h be PartFunc of (the carrier of A)*, the carrier of A;
    assume that
A9: n in dom the charact of A and
A10: h = (the charact of A).n;
    ex i,j being Nat st n = i & j = S.i & h = (j-tuples_on X)--> x by A3,A9,A10
;
    hence thesis;
  end;
A11: A is non-empty
  proof
    thus the charact of A <> {} by A3;
    assume {} in rng the charact of A;
    then consider a being object such that
A12: a in dom ch and
A13: {} = ch.a by FUNCT_1:def 3;
    ex i,j being Nat st a = i & j = S.i & {} = (j-tuples_on X)--> x by A3,A12
,A13;
    hence thesis;
  end;
  A is partial
  proof
    let n be Nat, h be PartFunc of (the carrier of A)*, the carrier of A;
    assume that
A14: n in dom the charact of A and
A15: h = (the charact of A).n;
    ex i,j being Nat st n = i & j = S.i & h = (j-tuples_on X)--> x by A3,A14
,A15;
    hence thesis;
  end;
  then reconsider A as Universal_Algebra by A8,A11;
  take A;
  thus the carrier of A = X;
A16: len ch = len S by A3,FINSEQ_3:29;
  now
    let n be Nat such that
A17: n in dom S;
    let h be homogeneous non empty PartFunc of (the carrier of A)*,
    the carrier of A;
    assume h = (the charact of A).n;
    then consider i,j being Nat such that
A18: n = i and
A19: j = S.i and
A20: h = (j-tuples_on X)--> x by A3,A17;
    set z = the Element of j-tuples_on X;
A21: dom h = j-tuples_on X by A20,FUNCOP_1:13;
    len z = j by CARD_1:def 7;
    hence S.n = arity h by A18,A19,A21,MARGREL1:def 25;
  end;
  hence thesis by A16,UNIALG_1:def 4;
end;

theorem Th14:
  for S being non empty FinSequence of NAT
  ex A being Universal_Algebra st the carrier of A = NAT & signature A = S &
  for i,j being Nat st i in dom S & j = S.i
  holds (the charact of A).i = (j-tuples_on NAT) --> i
proof
  set X = NAT;
  let S be non empty FinSequence of NAT;
A1: dom S = Seg len S by FINSEQ_1:def 3;
  defpred P[object,object] means
  ex i,j being Element of NAT st $1 = i & j = S.i & $2 = (j-tuples_on X)-->i;
A2: for y being object st y in dom S ex z being object st P[y,z]
  proof
    let y be object;
    assume y in dom S;
    then reconsider i = y as Element of NAT;
    reconsider j = S.i as Element of NAT;
    take (j-tuples_on X)--> i, i, j;
    thus thesis;
  end;
  consider ch being Function such that
A3: dom ch = dom S & for y being object st y in dom S holds P[y,ch.y]
  from CLASSES1:sch 1(A2);
  reconsider ch as FinSequence by A1,A3,FINSEQ_1:def 2;
  rng ch c= PFuncs(X*,X)
  proof
    let y be object;
    assume y in rng ch;
    then consider xi being object such that
A4: xi in dom ch and
A5: y = ch.xi by FUNCT_1:def 3;
    consider i,j being Element of NAT such that
    xi = i and j = S.i and
A6: y = (j-tuples_on X)--> i by A3,A4,A5;
A7: dom ((j-tuples_on X)--> i) = (j-tuples_on X) by FUNCOP_1:13;
    rng ((j-tuples_on X)--> i) c= X;
    hence thesis by A6,A7,PARTFUN1:def 3;
  end;
  then reconsider ch as PFuncFinSequence of X by FINSEQ_1:def 4;
  set A = UAStr(#X,ch#);
A8: A is quasi_total
  proof
    let n be Nat, h be PartFunc of (the carrier of A)*, the carrier of A;
    assume that
A9: n in dom the charact of A and
A10: h = (the charact of A).n;
    ex i,j being Element of NAT st
    n = i & j = S.i & h = (j-tuples_on X)--> i by A3,A9,A10;
    hence thesis;
  end;
A11: A is non-empty
  proof
    thus the charact of A <> {} by A3;
    assume {} in rng the charact of A;
    then consider a being object such that
A12: a in dom ch and
A13: {} = ch.a by FUNCT_1:def 3;
    ex i,j being Element of NAT st
    a = i & j = S.i & {} = (j-tuples_on X)--> i by A3,A12,A13;
    hence thesis;
  end;
  A is partial
  proof
    let n be Nat, h be PartFunc of (the carrier of A)*, the carrier of A;
    assume that
A14: n in dom the charact of A and
A15: h = (the charact of A).n;
    ex i,j being Element of NAT st
    n = i & j = S.i & h = (j-tuples_on X)--> i by A3,A14,A15;
    hence thesis;
  end;
  then reconsider A as Universal_Algebra by A8,A11;
  take A;
  thus the carrier of A = X;
A16: len ch = len S by A3,FINSEQ_3:29;
  now
    let n be Nat such that
A17: n in dom S;
    let h be homogeneous non empty PartFunc of (the carrier of A)*,
    the carrier of A;
    assume h = (the charact of A).n;
    then consider i,j being Element of NAT such that
A18: n = i and
A19: j = S.i and
A20: h = (j-tuples_on X)--> i by A3,A17;
    set z = the Element of j-tuples_on X;
A21: dom h = j-tuples_on X by A20,FUNCOP_1:13;
    len z = j by CARD_1:def 7;
    hence S.n = arity h by A18,A19,A21,MARGREL1:def 25;
  end;
  hence signature A = S by A16,UNIALG_1:def 4;

  let i,j be Nat;
  assume i in dom S;
  then ex i1,j being Element of NAT st
  i = i1 & j = S.i1 & ch.i = (j-tuples_on X)--> i1 by A3;
  hence thesis;
end;

theorem
  for S being non empty FinSequence of NAT
  for i,j being Nat st i in dom S & j = S.i
  for X being non empty set, f being Function of j-tuples_on X, X
  ex A being Universal_Algebra st the carrier of A = X & signature A = S &
  (the charact of A).i = f
proof
  let S be non empty FinSequence of NAT;
  let i,j be Nat;
  reconsider j9 = j as Element of NAT by ORDINAL1:def 12;
  assume that
A1: i in dom S and
A2: j = S.i;
  let X be non empty set;
  consider A0 being Universal_Algebra such that
A3: the carrier of A0 = X and
A4: signature A0 = S by Th13;
  let f be Function of j-tuples_on X, X;
  j9-tuples_on X c= X* by FINSEQ_2:134;
  then reconsider f0 = f as PartFunc of X*,X by RELSET_1:7;
  set z = the Element of j-tuples_on X;
A5: dom f0 = j-tuples_on X by FUNCT_2:def 1;
  f0 is homogeneous
  by A5;
  then reconsider f0 as homogeneous non empty PartFunc of X*,X;
A6: len z = j by CARD_1:def 7;
  then
A7: arity f0 = j by A5,MARGREL1:def 25;
  set ch = (the charact of A0)+*(i,f0);
  f0 in PFuncs(X*, X) by PARTFUN1:45;
  then
A8: {f0} c= PFuncs(X*,X) by ZFMISC_1:31;
A9: rng ch c= (rng the charact of A0) \/ {f0} by FUNCT_7:100;
  (rng the charact of A0) \/ {f0} c= PFuncs(X*, X) by A3,A8,XBOOLE_1:8;
  then rng ch c= PFuncs(X*, X) by A9;
  then reconsider ch as FinSequence of PFuncs(X*,X) by FINSEQ_1:def 4;
A10: dom ch = dom the charact of A0 by FUNCT_7:30;
  set A = UAStr(#X,ch#);
A11: A is quasi_total
  proof
    let n be Nat, h be PartFunc of (the carrier of A)*, the carrier of A;
    assume that
A12: n in dom the charact of A and
A13: h = (the charact of A).n;
A14: n = i implies h = f0 by A10,A12,A13,FUNCT_7:31;
    n <> i implies h = (the charact of A0).n by A13,FUNCT_7:32;
    hence thesis by A3,A5,A7,A10,A12,A14,COMPUT_1:22,MARGREL1:def 24;
  end;
A15: A is non-empty
  proof
    thus the charact of A <> {};
    assume {} in rng the charact of A;
    then consider a being object such that
A16: a in dom ch and
A17: {} = ch.a by FUNCT_1:def 3;
    reconsider a as Element of NAT by A16;
    a <> i implies {} = (the charact of A0).a by A17,FUNCT_7:32;
    hence thesis by A10,A16,A17,FUNCT_7:31;
  end;
  A is partial
  proof
    let n be Nat, h be PartFunc of (the carrier of A)*, the carrier of A;
    assume that
A18: n in dom the charact of A and
A19: h = (the charact of A).n;
    n <> i implies h = (the charact of A0).n by A19,FUNCT_7:32;
    hence thesis by A10,A18,A19,FUNCT_7:31;
  end;
  then reconsider A as Universal_Algebra by A11,A15;
  take A;
  thus the carrier of A = X;
A20: len S = len the charact of A0 by A4,UNIALG_1:def 4;
  then
A21: dom S = dom the charact of A0 by FINSEQ_3:29;
A22: len S = len the charact of A by A10,A20,FINSEQ_3:29;
  now
    let n be Nat;
    assume
A23: n in dom S;
    let h be homogeneous non empty PartFunc of (the carrier of A )*,
    the carrier of A;
    assume
A24: h = (the charact of A).n;
    then
A25: n = i implies h = f0 by A21,A23,FUNCT_7:31;
    n <> i implies h = (the charact of A0).n by A24,FUNCT_7:32;
    hence S.n = arity h by A2,A4,A5,A6,A23,A25,MARGREL1:def 25,UNIALG_1:def 4;
  end;
  hence signature A = S by A22,UNIALG_1:def 4;
  thus thesis by A1,A21,FUNCT_7:31;
end;

registration
  let f be non empty FinSequence of NAT;
  let D be non empty disjoint_with_NAT set;
  cluster -> Relation-like Function-like for Element of FreeUnivAlgNSG(f,D);
  coherence;
end;

registration
  let f be non empty FinSequence of NAT;
  let D be non empty disjoint_with_NAT set;
  cluster -> DecoratedTree-like for Element of FreeUnivAlgNSG(f,D);
  coherence;
  cluster -> DTree-yielding for FinSequence of FreeUnivAlgNSG(f,D);
  coherence;
end;

theorem Th16:
  for G being non empty DTConstrStr for t being set st t in TS G holds
  (ex d being Symbol of G st d in Terminals G & t = root-tree d) or
  ex o being Symbol of G, p being FinSequence of TS G
  st o ==> roots p & t = o-tree p
proof
  let G be non empty DTConstrStr;
  let t be set;
  assume that
A1: t in TS G and
A2: not ex d being Symbol of G st d in Terminals G & t = root-tree d and
A3: not ex o being Symbol of G, p being FinSequence of TS G
  st o ==> roots p & t = o-tree p;
A4: (TS G) \ {t} c= TS G by XBOOLE_1:36;
  reconsider Y = (TS G) \ {t} as Subset of FinTrees the carrier of G;
A5: now
    let d be Symbol of G;
    assume
A6: d in Terminals G;
    then
A7: root-tree d in TS G by DTCONSTR:def 1;
    root-tree d <> t by A2,A6;
    hence root-tree d in Y by A7,ZFMISC_1:56;
  end;
  now
    let o be Symbol of G, p be FinSequence of Y;
    rng p c= Y by FINSEQ_1:def 4;
    then rng p c= TS G by A4;
    then reconsider q = p as FinSequence of TS G by FINSEQ_1:def 4;
    assume
A8: o ==> roots p;
    then
A9: o-tree q in TS G by DTCONSTR:def 1;
    t <> o-tree q by A3,A8;
    hence o-tree p in Y by A9,ZFMISC_1:56;
  end;
  then TS G c= Y by A5,DTCONSTR:def 1;
  then t nin {t} by A1,XBOOLE_0:def 5;
  hence contradiction by TARSKI:def 1;
end;

theorem Th17:
  for X being disjoint_with_NAT non empty set
  for S being non empty FinSequence of NAT for i being Nat st i in dom S
  for p being FinSequence of FreeUnivAlgNSG(S,X) st len p = S.i holds
  Den(In(i, dom the charact of FreeUnivAlgNSG(S,X)),FreeUnivAlgNSG(S,X)).p
  = i-tree p
proof
  let X be disjoint_with_NAT non empty set;
  let S be non empty FinSequence of NAT;
  reconsider S9 = S as non empty FinSequence of omega;
  set G = DTConUA(S,X);
  set A = FreeUnivAlgNSG(S,X);
  let i be Nat;
  assume
A1: i in dom S;
  then
A2: S9/.i = S.i by PARTFUN1:def 6;
  let p be FinSequence of A;
  assume len p = S.i;
  then p is Element of (S9/.i)-tuples_on TS G by A2,FINSEQ_2:92;
  then p in (S9/.i)-tuples_on TS G;
  then
A3: p in dom FreeOpNSG(i,S,X) by A1,FREEALG:def 10;
  len the charact of A = len S by FREEALG:def 11;
  then dom the charact of A = dom S by FINSEQ_3:29;
  then In(i, dom the charact of A) = i by A1,SUBSET_1:def 8;
  hence Den(In(i, dom the charact of A), A).p
  = FreeOpNSG(i,S,X).p by FREEALG:def 11
    .= Sym(i,S,X)-tree p by A1,A3,FREEALG:def 10
    .= i-tree p by A1,FREEALG:def 9;
end;

definition
  let A be non-empty UAStr;
  let B be Subset of A;
  let n be natural Number;
  func B|^n -> Subset of A means
  : Def8:
  ex F being sequence of  bool the carrier of A st it = F.n & F.0 = B &
  for n being Nat holds F.(n+1) = F.n \/
  {Den(o,A).p where o is (Element of dom the charact of A),
  p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= F.n};
  existence
  proof
    defpred P[set,set,set] means
    $3 = $2 \/ {Den(o,A).p where o is (Element of dom the charact of A),
    p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= $2};
A1: for n being Nat
    for B1 being Subset of A ex B2 being Subset of A st P[n,B1,B2]
    proof
      let n be Nat, B1 be Subset of A;
      set B2 = B1 \/ {Den(o,A).p where o is (Element of dom the charact of A),
      p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= B1};
      B2 c= the carrier of A
      proof
        let x be object;
        assume that
A2:     x in B2 and
A3:     not x in the carrier of A;
        x in B1 implies x in the carrier of A;
        then x in {Den(o,A).p where o is (Element of dom the charact of A),
        p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= B1}
        by A2,A3,XBOOLE_0:def 3;
        then consider o being (Element of dom the charact of A), p being
        Element of (the carrier of A)* such that
A4:     x = Den(o,A).p and
A5:     p in dom Den(o,A) and rng p c= B1;
        x in rng Den(o,A) by A4,A5,FUNCT_1:def 3;
        hence contradiction by A3;
      end;
      then reconsider B2 as Subset of A;
      take B2;
      thus thesis;
    end;
    consider F being sequence of  bool the carrier of A such that
A6: F.0 = B & for n being Nat holds P[n,F.n,F.(n+1)]
    from RECDEF_1:sch 2(A1);
    reconsider n9 = n as Element of NAT by ORDINAL1:def 12;
    take a = F.n9, F;
    thus a = F.n & F.0 = B by A6;
    let n be Nat;
    thus thesis by A6;
  end;
  uniqueness
  proof
    let C1,C2 be Subset of A;
    deffunc Rec(set,set) = $2 \/
    {Den(o,A).p where o is (Element of dom the charact of A),
    p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= $2};
    given F1 being sequence of  bool the carrier of A such that
A7: C1 = F1.n and
A8: F1.0 = B and
A9: for n being Nat holds F1.(n+1) = Rec(n,F1.n);
    given F2 being sequence of  bool the carrier of A such that
A10: C2 = F2.n and
A11: F2.0 = B and
A12: for n being Nat holds F2.(n+1) = Rec(n,F2.n);
A13: dom F1 = NAT by FUNCT_2:def 1;
A14: F1.0 = B by A8;
A15: for n being Nat holds F1.(n+1) = Rec(n,F1.n) by A9;
A16: dom F2 = NAT by FUNCT_2:def 1;
A17: F2.0 = B by A11;
A18: for n being Nat holds F2.(n+1) = Rec(n,F2.n) by A12;
    F1 = F2 from NAT_1:sch 15(A13,A14,A15,A16,A17,A18);
    hence thesis by A7,A10;
  end;
end;

theorem Th18:
  for A being Universal_Algebra, B being Subset of A holds B|^0 = B
proof
  let A be Universal_Algebra;
  let B be Subset of A;
  ex F being sequence of  bool the carrier of A st B|^0 = F.0 & F.0 = B &
  for n being Nat holds F.(n+1) = F.n \/ {Den(o,A).p where o is (Element of
  dom the charact of A), p is Element of (the carrier of A)*: p in dom
  Den(o,A) & rng p c= F.n} by Def8;
  hence thesis;
end;

theorem Th19:
  for A being Universal_Algebra, B being Subset of A for n being Nat
  holds B|^(n+1) = (B|^n) \/ {Den(o,A).p
  where o is (Element of dom the charact of A),
  p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= B|^n}
proof
  let A be Universal_Algebra;
  let B be Subset of A;
  let n be Nat;
  deffunc Rec(set,set) = $2 \/
  {Den(o,A).p where o is (Element of dom the charact of A),
  p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= $2};
  consider F1 being sequence of  bool the carrier of A such that
A1: B|^(n) = F1.(n) and
A2: F1.0 = B and
A3: for n being Nat holds F1.(n+1) = Rec(n,F1.n) by Def8;
  consider F2 being sequence of  bool the carrier of A such that
A4: B|^(n+1) = F2.(n+1) and
A5: F2.0 = B and
A6: for n being Nat holds F2.(n+1) = Rec(n,F2.n) by Def8;
A7: dom F1 = NAT by FUNCT_2:def 1;
A8: F1.0 = B by A2;
A9: for n being Nat holds F1.(n+1) = Rec(n,F1.n) by A3;
A10: dom F2 = NAT by FUNCT_2:def 1;
A11: F2.0 = B by A5;
A12: for n being Nat holds F2.(n+1) = Rec(n,F2.n) by A6;
  F1 = F2 from NAT_1:sch 15(A7,A8,A9,A10,A11,A12);
  hence thesis by A1,A3,A4;
end;

theorem Th20:
  for A being Universal_Algebra, B being Subset of A for n being Nat
  for x being set holds x in B|^(n+1) iff x in B|^n or
  ex o being Element of dom the charact of A st
  ex p being Element of (the carrier of A)*
  st x = Den(o,A).p & p in dom Den(o,A) & rng p c= B|^n
proof
  let A be Universal_Algebra;
  let B be Subset of A;
  let n be Nat;
  set Z = {Den(o,A).p where o is (Element of dom the charact of A),
  p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= B|^n};
  let x be set;
  B|^(n+1) = (B|^n) \/ Z by Th19;
  then x in B|^(n+1) iff x in B|^n or x in Z by XBOOLE_0:def 3;
  hence thesis;
end;

theorem Th21:
  for A being Universal_Algebra, B being Subset of A
  for n,m being Nat st n <= m holds B|^n c= B|^m
proof
  let A be Universal_Algebra;
  let B be Subset of A;
  let n,m be Nat;
  assume n <= m;
  then
A1: ex i being Nat st ( m = n+i) by NAT_1:10;
  defpred P[Nat] means B|^n c= B|^(n+$1);
A2: P[0];
A3: now
    let i be Nat;
    assume
A4: P[i];
    deffunc Rec(set,set) = $2 \/
    {Den(o,A).p where o is (Element of dom the charact of A),
    p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= $2};
    B|^(n+i+1) = Rec(n,B|^(n+i)) by Th19;
    then B|^(n+i) c= B|^(n+(i+1)) by XBOOLE_1:7;
    hence P[i+1] by A4,XBOOLE_1:1;
  end;
  for i being Nat holds P[i] from NAT_1:sch 2(A2,A3);
  hence thesis by A1;
end;

theorem Th22:
  for A being Universal_Algebra for B1,B2 being Subset of A st B1 c= B2
  for n being Nat holds B1|^n c= B2|^n
proof
  let A be Universal_Algebra;
  let B1,B2 be Subset of A such that
A1: B1 c= B2;
  defpred P[Nat] means B1|^$1 c= B2|^$1;
  B1|^0 = B1 by Th18;
  then
A2: P[0] by A1,Th18;
A3: now
    let n be Nat;
    assume
A4: P[n];
    thus P[n+1]
    proof
      let x be object;
      assume that
A5:   x in B1|^(n+1) and
A6:   x nin B2|^(n+1);
      reconsider a = x as Element of A by A5;
      a nin B1|^n by A4,A6,Th20;
      then consider o being (Element of dom the charact of A),
      p being Element of (the carrier of A)* such that
A7:   a = Den(o,A).p and
A8:   p in dom Den(o,A) and
A9:   rng p c= B1|^n by A5,Th20;
      rng p c= B2|^n by A4,A9,XBOOLE_1:1;
      hence contradiction by A6,A7,A8,Th20;
    end;
  end;
  for n being Nat holds P[n] from NAT_1:sch 2(A2,A3);
  hence thesis;
end;

theorem Th23:
  for A being Universal_Algebra, B being Subset of A for n being Nat
  for x being set holds x in B|^(n+1) iff x in B or
  ex o being Element of dom the charact of A st
  ex p being Element of (the carrier of A)*
  st x = Den(o,A).p & p in dom Den(o,A) & rng p c= B|^n
proof
  let A be Universal_Algebra;
  let B be Subset of A;
  defpred P[Nat] means for x being set st x in B|^($1+1) holds x in B or
  ex o being Element of dom the charact of A st
  ex p being Element of (the carrier of A)*
  st x = Den(o,A).p & p in dom Den(o,A) & rng p c= B|^$1;
A1: B|^0 = B by Th18;
  then
A2: P[0] by Th20;
A3: now
    let n be Nat such that
A4: P[n];
    thus P[n+1]
    proof
      let x be set;
      assume x in B|^(n+1+1);
      then
A5:   x in B|^(n+1) or ex o being Element of dom the charact of A st
      ex p being Element of (the carrier of A)*
      st x = Den(o,A).p & p in dom Den(o,A) & rng p c= B|^(n+1) by Th20;
      now
        given o being (Element of dom the charact of A),
        p being Element of (the carrier of A)* such that
A6:     x = Den(o,A).p and
A7:     p in dom Den(o,A) and
A8:     rng p c= B|^n;
        take o,p;
        n <= n+1 by NAT_1:13;
        then B|^n c= B|^(n+1) by Th21;
        hence x = Den(o,A).p & p in dom Den(o,A) & rng p c= B|^(n+1)
        by A6,A7,A8;
      end;
      hence thesis by A4,A5;
    end;
  end;
A9: for n being Nat holds P[n] from NAT_1:sch 2(A2,A3);
  let n be Nat;
  let x be set;
  B c= B|^n by A1,Th21;
  hence thesis by A9,Th20;
end;

scheme MaxVal{A() -> non empty set, B() -> set, P[object,object]}:
 ex n being Nat st
  for x being Element of A() st x in B() holds P[x,n]
provided
A1: B() is finite and
A2: for x being Element of A() st x in B() ex n being Nat st P[x,n] and
A3: for x being Element of A()
for n,m being Nat st P[x,n] & n <= m holds P[x,m]
proof
A4: for x being object st x in A()/\B()
  ex y being object st y in NAT & P[x,y]
  proof
    let x be object;
    assume
A5: x in A()/\B();
    then reconsider x as Element of A() by XBOOLE_0:def 4;
    x in B() by A5,XBOOLE_0:def 4;
    then consider n being Nat such that
A6: P[x,n] by A2;
    n is Element of NAT by ORDINAL1:def 12;
    hence thesis by A6;
  end;
  consider f being Function such that
A7: dom f = A()/\B() & rng f c= NAT and
A8: for x being object st x in A()/\B() holds P[x,f.x]
from FUNCT_1:sch 6(A4);
  reconsider Z = rng f as finite Subset of NAT by A1,A7,FINSET_1:8;
  consider n being Nat such that
A9: for i being Nat st i in Z holds i <= n by STIRL2_1:56;
  take n;
  let x be Element of A();
  assume x in B();
  then
A10: x in A()/\B() by XBOOLE_0:def 4;
  then
A11: f.x in rng f by A7,FUNCT_1:def 3;
  then reconsider i = f.x as Element of NAT by A7;
 i <= n by A9,A11;
  hence thesis by A3,A8,A10;
end;

theorem Th24:
  for A being Universal_Algebra, B being Subset of A ex C being Subset of A
  st C = union the set of all B|^n where n is Element of NAT &
  C is opers_closed
proof
  let A be Universal_Algebra;
  let B be Subset of A;
  set X = the set of all B|^n where n is Element of NAT;
  set C = union X;
A1: union bool the carrier of A = the carrier of A by ZFMISC_1:81;
  X c= bool the carrier of A
  proof
    let x be object;
    assume x in X;
    then ex n being Element of NAT st x = B|^n;
    hence thesis;
  end;
  then reconsider C as Subset of A by A1,ZFMISC_1:77;
  take C;
  thus
  C = union the set of all B|^n where n is Element of NAT;
  let o be Element of Operations A;
  consider s being object such that
A2: s in dom the charact of A and
A3: o = (the charact of A).s by FUNCT_1:def 3;
  reconsider s as OperSymbol of A by A2;
A4: dom o = (arity o)-tuples_on the carrier of A by MARGREL1:22;
  let p be FinSequence of C;
  assume len p = arity o;
  then p is Element of dom Den(s,A) by A3,A4,FINSEQ_2:92;
  then
A5: p in dom Den(s,A);
  defpred P[set,Nat] means $1 in B|^$2;
A6: rng p is finite;
A7: for x being Element of A st x in rng p ex n being Nat st P[x,n]
  proof
    let x be Element of A;
    assume
A8: x in rng p;
    rng p c= C by FINSEQ_1:def 4;
    then consider Y being set such that
A9: x in Y and
A10: Y in X by A8,TARSKI:def 4;
    consider n being Element of NAT such that
A11: Y = B|^n by A10;
    take n;
    thus thesis by A9,A11;
  end;
A12: for x being Element of A for n,m being Nat st P[x,n] & n <= m holds P[x,m]
  proof
    let x be Element of A;
    let n,m be Nat;
    assume
A13: P[x,n];
    assume n <= m;
    then B|^n c= B|^m by Th21;
    hence thesis by A13;
  end;
  consider n being Nat such that
A14: for x being Element of A st x in rng p holds P[x,n] from MaxVal(A6,A7
  ,A12
  );
  rng p c= B|^n
  by A14;
  then Den(s,A).p in {Den(a,A).r where a is (Element of dom the charact of A
  ), r is Element of (the carrier of A)*: r in dom Den(a,A) & rng r c= B|^n}
  by A5;
  then o.p in (B|^n)\/{Den(a,A).r where a is (Element of dom the charact of A),
  r is Element of (the carrier of A)*: r in dom Den(a,A) & rng r c= B|^n} &
  n+1 in NAT by A3,XBOOLE_0:def 3;
  then
A15: o.p in B|^(n+1) by Th19;
  B|^(n+1) in X;
  hence thesis by A15,TARSKI:def 4;
end;

theorem Th25:
  for A being Universal_Algebra, B,C being Subset of A
  st C is opers_closed & B c= C
  holds union the set of all B|^n where n is Element of NAT c= C
proof
  let A be Universal_Algebra;
  let B,C be Subset of A;
  assume
A1: C is opers_closed;
  assume
A2: B c= C;
  let z be object;
  assume z in union the set of all B|^n where n is Element of NAT;
  then consider Y being set such that
A3: z in Y and
A4: Y in the set of all B|^n where n is Element of NAT by TARSKI:def 4;
  consider n being Element of NAT such that
A5: Y = B|^n by A4;
  defpred P[Nat] means B|^$1 c= C;
A6: P[0] by A2,Th18;
A7: now
    let n be Nat;
    assume
A8: P[n];
    thus P[n+1]
    proof
      let x be object;
      assume that
A9:   x in B|^(n+1) and
A10:  x nin C;
      x in (B|^n)\/{Den(o,A).p where o is (Element of dom the charact of A),
      p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= B|^n}
      by A9,Th19;
      then x in B|^n or
      x in {Den(o,A).p where o is (Element of dom the charact of A),
      p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= B|^n}
      by XBOOLE_0:def 3;
      then consider o being (Element of dom the charact of A), p being Element
      of (the carrier of A)* such that
A11:  x = Den(o,A).p and
A12:  p in dom Den(o,A) and
A13:  rng p c= B|^n by A8,A10;
      rng p c= C by A8,A13,XBOOLE_1:1;
      then reconsider p as FinSequence of C by FINSEQ_1:def 4;
      reconsider oo = Den(o,A) as Element of Operations A;
A14:  len p = arity oo by A12,MARGREL1:def 25;
      C is_closed_on oo by A1;
      hence thesis by A10,A11,A14;
    end;
  end;
  for n being Nat holds P[n] from NAT_1:sch 2(A6,A7);
  then P[n];
  hence thesis by A3,A5;
end;

definition
  let A be Universal_Algebra;
  func Generators A -> Subset of A equals
  (the carrier of A) \
  union the set of all rng o where o is Element of Operations A;
  coherence;
end;

theorem Th26:
  for A being Universal_Algebra, a being Element of A holds
  a in Generators A iff not ex o being Element of Operations A st a in rng o
proof
  let A be Universal_Algebra;
  set Z = the set of all rng o where o is Element of Operations A;
  let a be Element of A;
  hereby
    assume a in Generators A;
    then
A1: a nin union Z by XBOOLE_0:def 5;
    given o being Element of Operations A such that
A2: a in rng o;
    rng o in Z;
    hence contradiction by A1,A2,TARSKI:def 4;
  end;
  assume
A3: not ex o being Element of Operations A st a in rng o;
  assume a nin Generators A;
  then a in union Z by XBOOLE_0:def 5;
  then consider X being set such that
A4: a in X and
A5: X in Z by TARSKI:def 4;
  ex o being Element of Operations A st X = rng o by A5;
  hence contradiction by A3,A4;
end;

theorem
  for A being Universal_Algebra for B being Subset of A st B is opers_closed
  holds Constants A c= B
proof
  let A be Universal_Algebra;
  let B be Subset of A such that
A1: B is opers_closed;
  let x be object;
  assume x in Constants A;
  then consider a being Element of A such that
A2: x = a and
A3: ex o being Element of Operations A st arity o = 0 & a in rng o;
  consider o being Element of Operations A such that
A4: arity o = 0 and
A5: a in rng o by A3;
  consider s being object such that
A6: s in dom o and
A7: a = o.s by A5,FUNCT_1:def 3;
A8: dom o = 0-tuples_on the carrier of A by A4,MARGREL1:22;
  reconsider s as Element of (the carrier of A)* by A6;
A9: len s = 0 by A6,A8;
  s = {} by A6,A8;
  then rng s c= B;
  then
A10: s is FinSequence of B by FINSEQ_1:def 4;
  B is_closed_on o by A1;
  hence thesis by A2,A4,A7,A9,A10;
end;

theorem Th28:
  for A being Universal_Algebra st Constants A = {} holds {} A is opers_closed
proof
  let A be Universal_Algebra such that
A1: Constants A = {};
  let o be Element of Operations A;
  let s be FinSequence of {} A;
  assume
A2: len s = arity o;
A3: s is Element of (arity o)-tuples_on the carrier of A by A2,FINSEQ_2:92;
  dom o = (arity o)-tuples_on the carrier of A by MARGREL1:22;
  then
A4: o.s in rng o by A3,FUNCT_1:def 3;
  then reconsider a = o.s as Element of A;
  a nin Constants A by A1;
  then s <> {} by A2,A4;
  hence thesis;
end;

theorem
  for A being Universal_Algebra st Constants A = {}
  for G being GeneratorSet of A holds G <> {}
proof
  let A be Universal_Algebra such that
A1: Constants A = {};
  let G be GeneratorSet of A;
  assume
A2: G = {};
  then G = {} A;
  then G is opers_closed by A1,Th28;
  hence thesis by A2,FREEALG:def 4;
end;

theorem Th30:
  for A being Universal_Algebra for G being Subset of A
  holds G is GeneratorSet of A iff
  for I being Element of A ex n being Nat st I in G|^n
proof
  let A be Universal_Algebra;
  let B be Subset of A;
  set X = the set of all B|^n where n is Element of NAT;
  consider C being Subset of A such that
A1: C = union X and
A2: C is opers_closed by Th24;
  B|^0 = B by Th18;
  then
A3: B in X;

  thus B is GeneratorSet of A implies for I being Element of A
  ex n being Nat st I in B|^n
  proof
    assume for D being Subset of A st D is opers_closed & B c= D
    holds D = the carrier of A;
    then
A4: C = the carrier of A by A1,A2,A3,ZFMISC_1:74;
    let I be Element of A;
    consider Y being set such that
A5: I in Y and
A6: Y in X by A1,A4,TARSKI:def 4;
    ex n being Element of NAT st Y = B|^n by A6;
    hence thesis by A5;
  end;
  assume
A7: for I being Element of A ex n being Nat st I in B|^n;
  let D be Subset of A;
  assume that
A8: D is opers_closed and
A9: B c= D;
A10: union X c= D by A8,A9,Th25;
  thus D c= the carrier of A;
  let x be object;
  assume x in the carrier of A;
  then reconsider I = x as Element of A;
  consider n being Nat such that
A11: I in B|^n by A7;
  reconsider n as Element of NAT by ORDINAL1:def 12;
  B|^n in X;
  then I in union X by A11,TARSKI:def 4;
  hence thesis by A10;
end;

theorem Th31:
  for A being Universal_Algebra for B being Subset of A
  for G being GeneratorSet of A st G c= B holds B is GeneratorSet of A
proof
  let A be Universal_Algebra;
  let B be Subset of A;
  let G be GeneratorSet of A such that
A1: G c= B;
  now
    let a be Element of A;
    consider n being Nat such that
A2: a in G|^n by Th30;
    take n;
    G|^n c= B|^n by A1,Th22;
    hence a in B|^n by A2;
  end;
  hence thesis by Th30;
end;

theorem Th32:
  for A being Universal_Algebra for G being GeneratorSet of A
  for a being Element of A
  st not ex o being Element of Operations A st a in rng o holds a in G
proof
  let A be Universal_Algebra;
  let G be GeneratorSet of A;
  let a be Element of A;
  assume
A1: for o being Element of Operations A holds a nin rng o;
  defpred P[Nat] means a nin G|^$1;
  assume a nin G;
  then
A2: P[0] by Th18;
A3: now
    let n be Nat;
    assume
A4: P[n];
    thus P[n+1]
    proof
      assume a in G|^(n+1);
      then a in (G|^n) \/ {Den(o,A).p
      where o is (Element of dom the charact of A),
      p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= G|^n}
      by Th19;
      then a in {Den(o,A).p where o is (Element of dom the charact of A),
      p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= G|^n}
      by A4,XBOOLE_0:def 3;
      then consider o being (Element of dom the charact of A), p being
      Element of (the carrier of A)* such that
A5:   a = Den(o,A).p and
A6:   p in dom Den(o,A) and rng p c= G|^n;
      a in rng Den(o,A) by A5,A6,FUNCT_1:def 3;
      hence contradiction by A1;
    end;
  end;
  for n being Nat holds P[n] from NAT_1:sch 2(A2,A3);
  hence contradiction by Th30;
end;

theorem
  for A being Universal_Algebra, G being GeneratorSet of A
  holds Generators A c= G
proof
  let A be Universal_Algebra;
  let G be GeneratorSet of A;
  let a be object;
  assume
A1: a in Generators A;
  then
A2: a nin union the set of all rng o where o is Element of
  Operations A by XBOOLE_0:def 5;
  reconsider I = a as Element of A by A1;
  assume a nin G;
  then consider o0 being Element of Operations A such that
A3: I in rng o0 by Th32;
  rng o0 in the set of all rng o where o is Element of Operations A;
  hence contradiction by A2,A3,TARSKI:def 4;
end;

theorem Th34:
  for A being free Universal_Algebra for G being free GeneratorSet of A
  holds G = Generators A
proof
  let A be free Universal_Algebra;
  let G be free GeneratorSet of A;
  reconsider S = signature A as non empty FinSequence of NAT by MSUALG_1:4;
  consider B being Universal_Algebra such that
A1: the carrier of B = NAT and
A2: signature B = S and
A3: for i,j being Nat st i in dom S & j = S.i
  holds (the charact of B).i = (j-tuples_on NAT) --> i by Th14;
  reconsider f = G --> 0 as Function of G, the carrier of B by A1;
  A,B are_similar by A2;
  then consider h being Function of A,B such that
A4: h is_homomorphism and
A5: h|G = f by FREEALG:def 5;
A6: len S = len the charact of B by A2,UNIALG_1:def 4;
A7: len S = len the charact of A by UNIALG_1:def 4;
A8: dom S = dom the charact of B by A6,FINSEQ_3:29;
A9: dom S = dom the charact of A by A7,FINSEQ_3:29;
  thus G c= Generators A
  proof
    let a be object;
    assume
A10: a in G;
    then reconsider I = a as Element of A;
    assume not thesis;
    then I in union the set of all rng o where o is Element of Operations A
 by XBOOLE_0:def 5;
    then consider Y being set such that
A11: I in Y and
A12: Y in the set of all rng o where o is Element of Operations A
    by TARSKI:def 4;
    consider o being Element of Operations A such that
A13: Y = rng o by A12;
    consider i being object such that
A14: i in dom the charact of A and
A15: o = (the charact of A).i by FUNCT_1:def 3;
    reconsider i as Element of NAT by A14;
    reconsider j = S.i as Element of NAT;
    reconsider o2 = (the charact of B).i as Element of Operations B
    by A8,A9,A14,FUNCT_1:def 3;
    consider x being object such that
A16: x in dom o and
A17: I = o.x by A11,A13,FUNCT_1:def 3;
A18: dom o = (arity o)-tuples_on the carrier of A by MARGREL1:22;
    reconsider x as FinSequence of A by A16,FINSEQ_1:def 11;
    reconsider hx = h*x as FinSequence of NAT by A1;
    len (h*x) = len x by FINSEQ_2:33
      .= arity o by A16,A18,CARD_1:def 7
      .= j by A9,A14,A15,UNIALG_1:def 4;
    then
A19: hx is Element of j-tuples_on NAT by FINSEQ_2:92;
    0 = f.I by A10,FUNCOP_1:7
      .= h.(o.x) by A5,A10,A17,FUNCT_1:49
      .= o2.(h*x) by A4,A14,A15,A16,ALG_1:def 1
      .= ((j-tuples_on NAT) --> i).(h*x) by A3,A9,A14
      .= i by A19,FUNCOP_1:7;
    hence contradiction by A14,FINSEQ_3:25;
  end;
  let a be object;
  assume
A20: a in Generators A;
  then
A21: a nin union the set of all rng o where o is Element of Operations A
 by XBOOLE_0:def 5;
  reconsider I = a as Element of A by A20;
  assume a nin G;
  then consider o0 being Element of Operations A such that
A22: I in rng o0 by Th32;
  rng o0 in the set of all rng o where o is Element of Operations A;
  hence contradiction by A21,A22,TARSKI:def 4;
end;

registration
  let A be free Universal_Algebra;
  cluster Generators A -> free for GeneratorSet of A;
  coherence
  proof
    set G = the free GeneratorSet of A;
    Generators A = G by Th34;
    hence thesis;
  end;
end;

definition
  let A be free Universal_Algebra;
  redefine func Generators A -> GeneratorSet of A;  :: redefines Generators (AOFA_000, definition)
  coherence
  proof
    set G = the free GeneratorSet of A;
    Generators A = G by Th34;
    hence thesis;
  end;
end;

registration
  let A,B be set;
  cluster [:A,B:] -> disjoint_with_NAT;
  coherence
  proof
    now
      let z be object;
      assume that
A1:   z in [:A,B:] and
A2:   z in NAT;
      ex a,b being object st a in A & b in B & z = [a,b] by A1,ZFMISC_1:def 2;
      hence contradiction by A2;
    end;
    hence [:A,B:] misses NAT by XBOOLE_0:3;
  end;
end;

theorem
  for A being free Universal_Algebra for G being GeneratorSet of A
  for B being Universal_Algebra for h1,h2 being Function of A,B
  st h1 is_homomorphism & h2 is_homomorphism & h1|G = h2|G
  holds h1 = h2
proof
  let A be free Universal_Algebra;
  let G be GeneratorSet of A;
  let B be Universal_Algebra;
  let h1,h2 be Function of A,B such that
A1: h1 is_homomorphism and
A2: h2 is_homomorphism and
A3: h1|G = h2|G;
  defpred P[Nat] means
  for a being Element of A st a in G|^$1 holds h1.a = h2.a;
A4: P[0]
  proof
    let a be Element of A;
    assume a in G|^0;
    then
A5: a in G by Th18;
    then h1.a = (h1|G).a by FUNCT_1:49;
    hence thesis by A3,A5,FUNCT_1:49;
  end;
A6: for n being Nat st P[n] holds P[n+1]
  proof
    let n be Nat such that
A7: P[n];
    let a be Element of A;
    assume that
A8: a in G|^(n+1) and
A9: h1.a <> h2.a;
    a nin G|^n by A7,A9;
    then consider o being (Element of dom the charact of A),
    p being Element of (the carrier of A)* such that
A10: a = Den(o,A).p and
A11: p in dom Den(o,A) and
A12: rng p c= G|^n by A8,Th20;
    A,B are_similar by A1,ALG_1:def 1;
    then len the charact of A = len the charact of B by UNIALG_2:1;
    then reconsider o9 = o as Element of dom the charact of B by FINSEQ_3:29;
A13: Operations A = rng the charact of A;
A14: Operations B = rng the charact of B;
    then
A15: h1.a = Den(o9,B).(h1*p) by A1,A10,A11,A13,ALG_1:def 1;
A16: h2.a = Den(o9,B).(h2*p) by A2,A10,A11,A13,A14,ALG_1:def 1;
    now
A17:  dom h1 = the carrier of A by FUNCT_2:def 1;
      dom h2 = the carrier of A by FUNCT_2:def 1;
      hence G|^n c= dom h1 & G|^n c= dom h2 by A17;
      let x be set;
      assume x in G|^n;
      hence h1.x = h2.x by A7;
    end;
    hence thesis by A9,A12,A15,A16,Th1;
  end;
A18: for n being Nat holds P[n] from NAT_1:sch 2(A4,A6);
  now
    let a be Element of A;
    ex n being Nat st a in G|^n by Th30;
    hence h1.a = h2.a by A18;
  end;
  hence thesis by FUNCT_2:63;
end;

Lm2: for A being free Universal_Algebra for o1,o2 being OperSymbol of A
for p1,p2 being FinSequence st p1 in dom Den(o1,A) & p2 in dom Den(o2,A)
holds Den(o1,A).p1 = Den(o2,A).p2 implies o1 = o2
proof
  let A be free Universal_Algebra;
  set G = the free GeneratorSet of A;
  let o1,o2 be OperSymbol of A;
  let p1,p2 be FinSequence such that
A1: p1 in dom Den(o1,A) and
A2: p2 in dom Den(o2,A) and
A3: Den(o1,A).p1 = Den(o2,A).p2;
  reconsider S = signature A as non empty FinSequence of NAT by MSUALG_1:4;
  consider B being Universal_Algebra such that
A4: the carrier of B = NAT and
A5: signature B = S and
A6: for i,j being Nat st i in dom S & j = S.i
  holds (the charact of B).i = (j-tuples_on NAT) --> i by Th14;
  reconsider f = G --> 0 as Function of G, the carrier of B by A4;
  A,B are_similar by A5;
  then consider h being Function of A,B such that
A7: h is_homomorphism and h|G = f by FREEALG:def 5;
A8: len S = len the charact of B by A5,UNIALG_1:def 4;
A9: len S = len the charact of A by UNIALG_1:def 4;
A10: dom S = dom the charact of B by A8,FINSEQ_3:29;
A11: dom S = dom the charact of A by A9,FINSEQ_3:29;
  reconsider b1 = o1, b2 = o2 as OperSymbol of B by A8,A9,FINSEQ_3:29;
  reconsider n1 = o1, n2 = o2 as Element of NAT;
  reconsider j1 = S.n1, j2 = S.n2 as Element of NAT;
  reconsider x1 = p1, x2 = p2 as FinSequence of A by A1,A2,FINSEQ_1:def 11;
  reconsider h1 = h*x1, h2 = h*x2 as FinSequence of NAT by A4;
  reconsider oo1 = Den(o1,A), oo2 = Den(o2,A) as Element of Operations A;
A12: dom oo1 = (arity oo1)-tuples_on the carrier of A by MARGREL1:22;
A13: dom oo2 = (arity oo2)-tuples_on the carrier of A by MARGREL1:22;
  len x1 = arity oo1 by A1,A12,CARD_1:def 7
    .= j1 by A11,UNIALG_1:def 4;
  then len h1 = j1 by FINSEQ_2:33;
  then
A14: h1 is Element of j1-tuples_on NAT by FINSEQ_2:92;
  len x2 = arity oo2 by A2,A13,CARD_1:def 7
    .= j2 by A11,UNIALG_1:def 4;
  then len h2 = j2 by FINSEQ_2:33;
  then
A15: h2 is Element of j2-tuples_on NAT by FINSEQ_2:92;
A16: Den(o1,A) is Element of Operations A;
A17: Den(b1,B) is Element of Operations B;
  then
A18: h.(Den(o1,A).x1) = Den(b1,B).h1 by A1,A7,A16,ALG_1:def 1;
A19: h.(Den(o2,A).x2) = Den(b2,B).h2 by A2,A7,A16,A17,ALG_1:def 1;
A20: Den(b1,B) = (j1-tuples_on NAT)-->n1 by A6,A10;
A21: Den(b2,B) = (j2-tuples_on NAT)-->n2 by A6,A10;
  Den(b1,B).h1 = n1 by A14,A20,FUNCOP_1:7;
  hence thesis by A3,A15,A18,A19,A21,FUNCOP_1:7;
end;

theorem Th36:
  for A being free Universal_Algebra for o1,o2 being OperSymbol of A
  for p1,p2 being FinSequence st p1 in dom Den(o1,A) & p2 in dom Den(o2,A)
  holds Den(o1,A).p1 = Den(o2,A).p2 implies o1 = o2 & p1 = p2
proof
  let A be free Universal_Algebra;
  set G = the free GeneratorSet of A;
  let o1,o2 be OperSymbol of A;
  let p1,p2 be FinSequence such that
A1: p1 in dom Den(o1,A) and
A2: p2 in dom Den(o2,A) and
A3: Den(o1,A).p1 = Den(o2,A).p2;
  thus
A4: o1 = o2 by A1,A2,A3,Lm2;
  reconsider S = signature A as non empty FinSequence of NAT by MSUALG_1:4;
  set G9 = G \/ {the carrier of A};
  reconsider G9 as non empty set;
  deffunc F(object) = root-tree [0,$1];
  consider g being Function such that
  A5: dom
 g = G & for x being object st x in G holds g.x = F(x) from FUNCT_1:sch 3;
  set X = [:{0},G9:];
  set B = FreeUnivAlgNSG(S,X);
A6: signature B = S by FREEALG:4;
A7: Terminals DTConUA(S,[:{0},G9:]) = [:{0},G9:] by FREEALG:3;
  rng g c= FreeGenSetNSG(S,[:{0},G9:])
  proof
    let b be object;
    assume b in rng g;
    then consider a being object such that
A8: a in dom g and
A9: b = g.a by FUNCT_1:def 3;
    reconsider a as Element of A by A5,A8;
A10: a in G9 by A5,A8,XBOOLE_0:def 3;
    0 in {0} by TARSKI:def 1;
    then
A11: [0,a] in [:{0},G9:] by A10,ZFMISC_1:87;
    then reconsider s = [0,a] as Symbol of DTConUA(S,[:{0},G9:]) by A7;
    root-tree s in FreeGenSetNSG(S,[:{0},G9:]) by A7,A11;
    hence thesis by A5,A8,A9;
  end;
  then reconsider g as Function of G, the carrier of B
  by A5,FUNCT_2:2,XBOOLE_1:1;
  signature B = S by FREEALG:4;
  then A,B are_similar;
  then consider h being Function of A,B such that
A12: h is_homomorphism and
A13: h|G = g by FREEALG:def 5;
  defpred G[Nat] means
  for a1,a2 being set st a1 in G|^$1 & a2 in G|^$1 & h.a1 = h.a2
  holds a1 = a2;
A14: G|^0 = G by Th18;
A15: len S = len the charact of B by A6,UNIALG_1:def 4;
A16: len S = len the charact of A by UNIALG_1:def 4;
A17: dom S = dom the charact of B by A15,FINSEQ_3:29;
A18: now
    let o be Element of dom the charact of A;
    let p be FinSequence of A such that
A19: p in dom Den(o,A);
    reconsider q = p as FinSequence of A;
    reconsider hq = h*q as FinSequence of B;
    reconsider op = Den(o,A) as Element of Operations A;
    reconsider on = o as Element of NAT;
    reconsider o9 = on as OperSymbol of B by A15,A16,FINSEQ_3:29;
    reconsider op9 = Den(o9,B) as Element of Operations B;
    reconsider j = S.o9 as Element of NAT;
    dom op = (arity op)-tuples_on the carrier of A by MARGREL1:22;
    then
A20: len p = arity op by A19,CARD_1:def 7
      .= j by A17,UNIALG_1:def 4;
    hence len p = S.o & len (h*p) = S.o by FINSEQ_2:33;
A21: h.(op.q) = op9.hq by A12,A19,ALG_1:def 1;
A22: In(o9, dom the charact of B) = o9;
    len hq = S.o9 by A20,FINSEQ_2:33;
    hence h.(Den(o,A).p) = o-tree (h*p) by A17,A21,A22,Th17;
  end;
A23: G[0]
  proof
    let a1,a2 be set;
    assume that
A24: a1 in G|^0 and
A25: a2 in G|^0 and
A26: h.a1 = h.a2;
A27: h.a1 = g.a1 by A13,A14,A24,FUNCT_1:49;
A28: h.a2 = g.a2 by A13,A14,A25,FUNCT_1:49;
A29: h.a1 = F(a1) by A5,A14,A24,A27;
    h.a2 = F(a2) by A5,A14,A25,A28;
    then [0,a1] = [0,a2] by A26,A29,TREES_4:4;
    hence thesis by XTUPLE_0:1;
  end;
A30: now
    let o be Element of dom the charact of A;
    let p be Element of (the carrier of A)*;
    assume p in dom Den(o,A);
    then
A31: h.(Den(o,A).p) = o-tree(h*p) by A18;
    let x be set;
    assume
A32: x in G;
    then
A33: h.x = g.x by A13,FUNCT_1:49
      .= F(x) by A5,A32;
    assume h.(Den(o,A).p) = h.x;
    hence contradiction by A31,A33,TREES_4:17;
  end;
A34: for k being Nat st G[k] holds G[k+1]
  proof
    let k be Nat such that
A35: G[k];
    defpred Gk[set] means ex o being Element of dom the charact of A st
    ex p being Element of (the carrier of A)*
    st $1 = Den(o,A).p & p in dom Den(o,A) & rng p c= G|^k;
    let a1,a2 be set;
    assume that
A36: a1 in G|^(k+1) and
A37: a2 in G|^(k+1) and
A38: h.a1 = h.a2;
    per cases by A36,A37,Th23;
    suppose
A39:  a1 in G & a2 in G;
      then
A40:  h.a1 = g.a1 by A13,FUNCT_1:49;
A41:  h.a2 = g.a2 by A13,A39,FUNCT_1:49;
A42:  h.a1 = F(a1) by A5,A39,A40;
      h.a2 = F(a2) by A5,A39,A41;
      then [0,a1] = [0,a2] by A38,A42,TREES_4:4;
      hence thesis by XTUPLE_0:1;
    end;
    suppose
A43:  Gk[a1] & Gk[a2];
      then consider b1 being (Element of dom the charact of A),
      q1 being Element of (the carrier of A)* such that
A44:  a1 = Den(b1,A).q1 and
A45:  q1 in dom Den(b1,A) and
A46:  rng q1 c= G|^k;
      consider b2 being (Element of dom the charact of A),
      q2 being Element of (the carrier of A)* such that
A47:  a2 = Den(b2,A).q2 and
A48:  q2 in dom Den(b2,A) and
A49:  rng q2 c= G|^k by A43;
A50:  b1-tree(h*q1) = h.a1 by A18,A44,A45
        .= b2-tree(h*q2) by A18,A38,A47,A48;
      then
A51:  b1 = b2 by TREES_4:15;
A52:  h*q1 = h*q2 by A50,TREES_4:15;
A53:  len q1 = S.b1 by A18,A45;
A54:  len q2 = S.b2 by A18,A48;
A55:  dom q1 = Seg len q1 by FINSEQ_1:def 3;
A56:  dom q2 = Seg len q1 by A51,A53,A54,FINSEQ_1:def 3;
      now
        let j be Nat;
        assume
A57:    j in dom q1;
        then
A58:    q1.j in rng q1 by FUNCT_1:3;
A59:    q2.j in rng q2 by A55,A56,A57,FUNCT_1:3;
A60:    h.(q1.j) = (h*q1).j by A57,FUNCT_1:13;
        h.(q2.j) = (h*q2).j by A55,A56,A57,FUNCT_1:13;
        hence q1.j = q2.j by A35,A46,A49,A52,A58,A59,A60;
      end;
      hence thesis by A44,A47,A51,A55,A56,FINSEQ_1:13;
    end;
    suppose a1 in G & Gk[a2] or Gk[a1] & a2 in G;
      hence thesis by A30,A38;
    end;
  end;
A61: for k being Nat holds G[k] from NAT_1:sch 2(A23,A34);
  reconsider q1 = p1, q2 = p2 as FinSequence of A by A1,A2,FINSEQ_1:def 11;
  o1-tree(h*q1) = h.(Den(o1,A).p1) by A1,A18
    .= o2-tree(h*q2) by A2,A3,A18;
  then
A62: h*p1 = h*p2 by TREES_4:15;
A63: len q1 = S.o1 by A1,A18;
A64: len q2 = S.o2 by A2,A18;
A65: dom q1 = Seg len q1 by FINSEQ_1:def 3;
A66: dom q2 = Seg len q1 by A4,A63,A64,FINSEQ_1:def 3;
  now
    let j be Nat;
    assume
A67: j in dom q1;
    then
A68: q1.j in rng q1 by FUNCT_1:3;
A69: q2.j in rng q2 by A65,A66,A67,FUNCT_1:3;
    consider n1 being Nat such that
A70: q1.j in G|^n1 by A68,Th30;
    consider n2 being Nat such that
A71: q2.j in G|^n2 by A69,Th30;
    reconsider k = max(n1,n2) as Nat by TARSKI:1;
A72: G|^n1 c= G|^k by Th21,XXREAL_0:25;
A73: G|^n2 c= G|^k by Th21,XXREAL_0:25;
A74: h.(q1.j) = (h*q1).j by A67,FUNCT_1:13;
    h.(q2.j) = (h*q2).j by A65,A66,A67,FUNCT_1:13;
    hence q1.j = q2.j by A61,A62,A70,A71,A72,A73,A74;
  end;
  hence thesis by A65,A66;
end;

theorem
  for A being free Universal_Algebra for o1,o2 being Element of Operations A
  for p1,p2 being FinSequence st p1 in dom o1 & p2 in dom o2
  holds o1.p1 = o2.p2 implies o1 = o2 & p1 = p2
proof
  let A be free Universal_Algebra;
  let o1,o2 be Element of Operations A;
  consider a1 being object such that
A1: a1 in dom the charact of A and
A2: o1 = (the charact of A).a1 by FUNCT_1:def 3;
  consider a2 being object such that
A3: a2 in dom the charact of A and
A4: o2 = (the charact of A).a2 by FUNCT_1:def 3;
  reconsider a1,a2 as OperSymbol of A by A1,A3;
A5: o1 = Den(a1,A) by A2;
A6: o2 = Den(a2,A) by A4;
  let p1,p2 be FinSequence;
  assume that
A7: p1 in dom o1 and
A8: p2 in dom o2 and
A9: o1.p1 = o2.p2;
  thus thesis by A5,A6,A7,A8,A9,Th36;
end;

theorem Th38:
  for A being free Universal_Algebra for o being OperSymbol of A
  for p being FinSequence st p in dom Den(o,A) for a being set st a in rng p
  holds a <> Den(o,A).p
proof
  let A be free Universal_Algebra;
  let o be OperSymbol of A;
  let p be FinSequence such that
A1: p in dom Den(o,A);
  let a be set such that
A2: a in rng p and
A3: a = Den(o,A).p;
  reconsider p as FinSequence of A by A1,FINSEQ_1:def 11;
  a in rng p by A2;
  then reconsider a as Element of A;
  set G = Generators A;
  consider n being Nat such that
A4: a in G|^n by Th30;
  defpred P[Nat] means ex a being (Element of A), o being OperSymbol of A st
  ex p being FinSequence of A st
  p in dom Den(o,A) & a in rng p & a = Den(o,A).p & a in G|^$1;
  a in rng p by A2;
  then
A5: ex n being Nat st P[n] by A1,A3,A4;
  consider n being Nat such that
A6: P[n] & for m being Nat st P[m] holds n <= m from NAT_1:sch 5(A5);
  consider a being (Element of A), o being OperSymbol of A,
  p being FinSequence of A such that
A7: p in dom Den(o,A) and
A8: a in rng p and
A9: a = Den(o,A).p and
A10: a in G|^n by A6;
  reconsider op = Den(o,A) as Element of Operations A;
  a in rng op by A7,A9,FUNCT_1:3;
  then a nin G by Th26;
  then n <> 0 by A10,Th18;
  then consider k being Nat such that
A11: n = k+1 by NAT_1:6;
  reconsider k as Element of NAT by ORDINAL1:def 12;
A12: k < n by A11,NAT_1:13;
  then a nin G|^k by A6,A7,A8,A9;
  then consider o9 being (Element of dom the charact of A),
  p9 being Element of (the carrier of A)* such that
A13: a = Den(o9,A).p9 and
A14: p9 in dom Den(o9,A) and
A15: rng p9 c= G|^k by A10,A11,Th20;
  p9 = p by A7,A9,A13,A14,Th36;
  hence contradiction by A6,A7,A8,A9,A12,A15;
end;

theorem Th39:
  for A being free Universal_Algebra for G being GeneratorSet of A
  for o being OperSymbol of A
  st for o9 being OperSymbol of A, p being FinSequence
  st p in dom Den(o9,A) & Den(o9,A).p in G holds o9 <> o
  for p being FinSequence st p in dom Den(o,A)
  for n being Nat st Den(o,A).p in G|^(n+1) holds rng p c= G|^n
proof
  let A be free Universal_Algebra;
  let G be GeneratorSet of A;
  let o be OperSymbol of A such that
A1: for o9 being OperSymbol of A, p being FinSequence
  st p in dom Den(o9,A) & Den(o9,A).p in G holds o9 <> o;
  let p be FinSequence such that
A2: p in dom Den(o,A);
  let n be Nat such that
A3: Den(o,A).p in G|^(n+1) and
A4: not rng p c= G|^n;
  reconsider p as FinSequence of A by A2,FINSEQ_1:def 11;
  defpred P[Nat] means ex p being FinSequence of A st
  p in dom Den(o,A) & Den(o,A).p in G|^($1+1) & not rng p c= G|^$1;
  p is FinSequence of A;
  then
A5: ex n being Nat st P[n] by A2,A3,A4;
  consider n being Nat such that
A6: P[n] & for m being Nat st P[m] holds n <= m from NAT_1:sch 5(A5);
  consider p being FinSequence of A such that
A7: p in dom Den(o,A) and
A8: Den(o,A).p in G|^(n+1) and
A9: not rng p c= G|^n by A6;
  set a = Den(o,A).p;
  now
    assume
A10: a in G|^n;
    a nin G by A1,A7;
    then n <> 0 by A10,Th18;
    then consider k being Nat such that
A11: n = k+1 by NAT_1:6;
    reconsider k as Element of NAT by ORDINAL1:def 12;
A12: k < n by A11,NAT_1:13;
    then G|^k c= G|^n by Th21;
    then not rng p c= G|^k by A9;
    hence contradiction by A6,A7,A10,A11,A12;
  end;
  then ex o9 being (Element of dom the charact of A),
  p9 being Element of (the carrier of A)* st
  a = Den(o9,A).p9 & p9 in dom Den(o9,A) & rng p9 c= G|^n by A8,Th20;
  hence contradiction by A7,A9,Th36;
end;

theorem
  for A being free Universal_Algebra for o being OperSymbol of A
  for p being FinSequence st p in dom Den(o,A)
  for n being Nat st Den(o,A).p in (Generators A)|^(n+1)
  holds rng p c= (Generators A)|^n
proof
  let A be free Universal_Algebra;
  set G = Generators A;
  let o be OperSymbol of A;
  now
    let o9 be OperSymbol of A, p be FinSequence;
    reconsider op = Den(o9,A) as Element of Operations A;
    assume p in dom Den(o9,A);
    then op.p in rng op by FUNCT_1:3;
    hence Den(o9,A).p in G implies o9 <> o by Th26;
  end;
  hence thesis by Th39;
end;

begin :: If-while Algebra

definition
  let S be non empty UAStr;
  attr S is with_empty-instruction means
  : Def10:
  1 in dom the charact of S &
  (the charact of S).1 is 0-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S;
  attr S is with_catenation means
  : Def11:
  2 in dom the charact of S &
  (the charact of S).2 is 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S;
  attr S is with_if-instruction means
  : Def12:
  3 in dom the charact of S &
  (the charact of S).3 is 3-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S;
  attr S is with_while-instruction means
  : Def13:
  4 in dom the charact of S &
  (the charact of S).4 is 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S;
  attr S is associative means
  :
  Def14: (the charact of S).2 is 2-ary associative non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S;
end;

definition
  let S be non-empty UAStr;
  attr S is unital means
  : Def15:
  ex f being 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S
  st f = (the charact of S).2 &
  Den(In(1, dom the charact of S), S).({}) is_a_unity_wrt f;
end;

theorem Th41:
  for X being non empty set, x being Element of X
  for c being 2-ary associative unital
  non empty quasi_total homogeneous PartFunc of X*, X st x is_a_unity_wrt c
  for i being 3-ary non empty quasi_total homogeneous PartFunc of X*, X
  for w being 2-ary non empty quasi_total homogeneous PartFunc of X*, X
  ex S being non-empty strict UAStr st the carrier of S = X &
  the charact of S = <*(0-tuples_on X)-->x,c*>^<*i,w*> &
  S is with_empty-instruction with_catenation unital associative
  with_if-instruction with_while-instruction quasi_total partial
proof
  let X be non empty set;
  let x be Element of X;
  let c be 2-ary associative unital non empty quasi_total homogeneous
  PartFunc of X*, X;
  assume
A1: x is_a_unity_wrt c;
  let i be 3-ary non empty quasi_total homogeneous PartFunc of X*, X;
  let w be 2-ary non empty quasi_total homogeneous PartFunc of X*, X;
  set Y = 0-tuples_on X;
  set e = Y --> x;
  reconsider e as 0-ary
  non empty quasi_total homogeneous PartFunc of X*, X;
  set char = <*e,c*>^<*i,w*>;
  char is PFuncFinSequence of X
  proof
    let a be object;
    assume a in rng char;
    then a in rng <*e,c*> \/ rng <*i,w*> by FINSEQ_1:31;
    then a in rng <*e,c*> or a in rng <*i,w*> by XBOOLE_0:def 3;
    then a in {e,c} or a in {i,w} by FINSEQ_2:127;
    then a = e or a = c or a = i or a = w by TARSKI:def 2;
    hence thesis by PARTFUN1:45;
  end;
  then reconsider char as non empty non-empty PFuncFinSequence of X;
  reconsider S = UAStr(#X, char#) as non-empty strict UAStr by UNIALG_1:def 3;
  take S;
  thus the carrier of S = X;
  thus the charact of S = <*(0-tuples_on X)-->x,c*>^<*i,w*>;
A2: len <*e,c*> = 2 by FINSEQ_1:44;
  len <*i,w*> = 2 by FINSEQ_1:44;
  then len char = 2+2 by A2,FINSEQ_1:22;
  then
A3: dom char = Seg 4 by FINSEQ_1:def 3;
  reconsider e as 0-ary non empty homogeneous
  PartFunc of (the carrier of S)*, the carrier of S;
  reconsider c as 2-ary associative non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S;
A4: <*e,c*>.1 = e;
A5: <*e,c*>.2 = c;
A6: <*i,w*>.1 = i;
A7: <*i,w*>.2 = w;
  thus 1 in dom the charact of S by A3;
A8: dom <*e,c*> = Seg 2 by FINSEQ_1:89;
  then
A9: 1 in dom <*e,c*>;
A10: 2 in dom <*e,c*> by A8;
A11: e = (the charact of S).1 by A4,A9,FINSEQ_1:def 7;
A12: c = (the charact of S).2 by A5,A10,FINSEQ_1:def 7;
  thus (the charact of S).1 is 0-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S
  by A4,A9,FINSEQ_1:def 7;
  thus 2 in dom the charact of S by A3;
  thus (the charact of S).2 is 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S
  by A5,A10,FINSEQ_1:def 7;
  thus S is unital
  proof
    take c;
    thus c = (the charact of S).2 by A5,A10,FINSEQ_1:def 7;
A13: 1 in dom the charact of S by A3;
A14: Y = {{}} by COMPUT_1:5;
A15: In(1, dom the charact of S) = 1 by A13,SUBSET_1:def 8;
A16: {} in Y by A14,TARSKI:def 1;
    e = Den(In(1, dom the charact of S),S) by A4,A9,A15,FINSEQ_1:def 7;
    hence thesis by A1,A16,FUNCOP_1:7;
  end;
  thus (the charact of S).2 is 2-ary associative non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S
  by A5,A10,FINSEQ_1:def 7;
  thus 3 in dom the charact of S by A3;
A17: dom <*i,w*> = Seg 2 by FINSEQ_1:89;
  then
A18: 1 in dom <*i,w*>;
A19: 2 in dom <*i,w*> by A17;
A20: char.(2+1) = i by A2,A6,A18,FINSEQ_1:def 7;
A21: char.(2+2) = w by A2,A7,A19,FINSEQ_1:def 7;
  thus (the charact of S).3 is 3-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S by A20;
  thus 4 in dom the charact of S by A3;
  thus (the charact of S).4 is 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of S)*, the carrier of S by A2,A7,A19,
FINSEQ_1:def 7;
  thus S is quasi_total
  proof
    let i be Nat, h be PartFunc of (the carrier of S)*, the carrier of S;
    assume i in dom the charact of S;
    hence thesis by A3,A11,A12,A20,A21,ENUMSET1:def 2,FINSEQ_3:2;
  end;
  let i be Nat, h be PartFunc of (the carrier of S)*, the carrier of S;
  assume that
A22: i in dom the charact of S and
A23: h = (the charact of S).i;
  let p1,p2 be FinSequence;
  i = 1 or i = 2 or i = 3 or i = 4 by A3,A22,ENUMSET1:def 2,FINSEQ_3:2;
  hence thesis by A11,A12,A20,A21,A23,MARGREL1:def 1;
end;

registration
  cluster with_empty-instruction with_catenation with_if-instruction
    with_while-instruction unital associative
    for quasi_total partial non-empty strict UAStr;
  existence
  proof

set c = the 2-ary associative unital non empty quasi_total homogeneous
PartFunc of {{}}*, {{}};
    set a = the Element of {{}};
    consider x being set such that
A1: x is_a_unity_wrt c by Def3;
    arity c = 2 by COMPUT_1:def 21;
    then
A2: dom c = 2-tuples_on {{}} by COMPUT_1:22;
    then <*a,a*> in dom c by FINSEQ_2:137;
    then <*a,x*> in dom c by A1;
    then reconsider x as Element of {{}} by A2,FINSEQ_2:138;

set i = the 3-ary non empty quasi_total homogeneous PartFunc of {{}}*, {{}};

set w = the 2-ary non empty quasi_total homogeneous PartFunc of {{}}*, {{}};
    ex S being non-empty strict UAStr st the carrier of S = {{}} &
    the charact of S = <*(0-tuples_on {{}})-->x,c*>^<*i,w*> &
    S is with_empty-instruction with_catenation unital associative
    with_if-instruction with_while-instruction quasi_total partial by A1,Th41;
    hence thesis;
  end;
end;

definition
  mode preIfWhileAlgebra is with_empty-instruction
    with_catenation with_if-instruction with_while-instruction
    Universal_Algebra;
end;

reserve A for preIfWhileAlgebra,
  C,I,J for Element of A;
reserve S for non empty set,
  T for Subset of S,
  s for Element of S;

definition
  let A be non empty UAStr;
  mode Algorithm of A is Element of A;
end;

theorem Th42:
  for A being with_empty-instruction non-empty UAStr
  holds dom Den(In(1, dom the charact of A), A) = {{}}
proof
  let A be with_empty-instruction non-empty UAStr;
  reconsider e = (the charact of A).1 as 0-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def10;

  1 in dom the charact of A by Def10;
  then
A1: Den(In(1, dom the charact of A), A) = e by SUBSET_1:def 8;
  arity e = 0 by COMPUT_1:def 21;
  then dom e = 0-tuples_on the carrier of A by COMPUT_1:22;
  hence thesis by A1,COMPUT_1:5;
end;

definition
  let A be with_empty-instruction non-empty UAStr;
  func EmptyIns A -> Algorithm of A equals
  Den(In(1, dom the charact of A), A).{};
  coherence
  proof
    reconsider e = (the charact of A).1 as 0-ary non empty homogeneous
    quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def10;
    1 in dom the charact of A by Def10;
    then
A1: Den(In(1, dom the charact of A), A) = e by SUBSET_1:def 8;
    then dom e = {{}} by Th42;
    then {} in dom e by TARSKI:def 1;
    hence thesis by A1,PARTFUN1:4;
  end;
end;

theorem
  for A being with_empty-instruction Universal_Algebra
  for o being Element of Operations A
  st o = Den(In(1, dom the charact of A), A)
  holds arity o = 0 & EmptyIns A in rng o
proof
  let A be with_empty-instruction Universal_Algebra;
  let o be Element of Operations A such that
A1: o = Den(In(1, dom the charact of A), A);
A2: dom Den(In(1, dom the charact of A), A) = {{}} by Th42;
A3: <*>the carrier of A in {{}} by TARSKI:def 1;
  hence arity o = len (<*>the carrier of A) by A1,A2,MARGREL1:def 25
    .= 0;
  thus thesis by A1,A2,A3,FUNCT_1:def 3;
end;

theorem Th44:
  for A being with_catenation non-empty UAStr
  holds dom Den(In(2, dom the charact of A), A) = 2-tuples_on the carrier of A
proof
  let A be with_catenation non-empty UAStr;
  reconsider f = (the charact of A).2 as 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def11;
  2 in dom the charact of A by Def11;
  then
A1: Den(In(2, dom the charact of A), A) = f by SUBSET_1:def 8;
  arity f = 2 by COMPUT_1:def 21;
  hence thesis by A1,COMPUT_1:22;
end;

definition
  let A be with_catenation non-empty UAStr;
  let I1,I2 be Algorithm of A;
  func I1 \; I2 -> Algorithm of A equals
  Den(In(2, dom the charact of A), A).<*I1,I2*>;
  coherence
  proof
    reconsider f = (the charact of A).2 as 2-ary non empty homogeneous
    quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def11;
    2 in dom the charact of A by Def11;
    then
A1: Den(In(2, dom the charact of A), A) = f by SUBSET_1:def 8;
    then dom f = 2-tuples_on the carrier of A by Th44;
    then <*I1,I2*> in dom f by FINSEQ_2:137;
    hence thesis by A1,PARTFUN1:4;
  end;
end;

theorem
  for A being with_empty-instruction with_catenation unital non-empty UAStr
  for I being Element of A holds EmptyIns A\;I = I & I\;EmptyIns A = I
proof
  let A be with_empty-instruction with_catenation unital non-empty UAStr;
  let I be Element of A;
  consider f being 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A such that
A1: f = (the charact of A).2 and
A2: Den(In(1, dom the charact of A), A).({}) is_a_unity_wrt f by Def15;
A3: 2 in dom the charact of A by Def11;
  arity f = 2 by COMPUT_1:def 21;
  then
A4: dom f = 2-tuples_on the carrier of A by COMPUT_1:22;
A5: In(2, dom the charact of A) = 2 by A3,SUBSET_1:def 8;
  <*I,I*> in dom f by A4,FINSEQ_2:137;
  hence thesis by A1,A2,A5;
end;

theorem
  for A being associative with_catenation non-empty UAStr
  for I1,I2,I3 being Element of A holds (I1\;I2)\;I3 = I1\;(I2\;I3)
proof
  let A be associative with_catenation non-empty UAStr;
  let I1,I2,I3 be Element of A;
  reconsider f = (the charact of A).2 as
  2-ary associative non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def14;
A1: 2 in dom the charact of A by Def11;
  arity f = 2 by COMPUT_1:def 21;
  then
A2: dom f = 2-tuples_on the carrier of A by COMPUT_1:22;
A3: In(2, dom the charact of A) = 2 by A1,SUBSET_1:def 8;
A4: <*I1,I2*> in dom f by A2,FINSEQ_2:137;
A5: <*I2,I3*> in dom f by A2,FINSEQ_2:137;
A6: <*I1,I2\;I3*> in dom f by A2,FINSEQ_2:137;
  <*I1\;I2,I3*> in dom f by A2,FINSEQ_2:137;
  hence thesis by A3,A4,A5,A6,Def2;
end;

theorem Th47:
  for A being with_if-instruction non-empty UAStr
  holds dom Den(In(3, dom the charact of A), A) = 3-tuples_on the carrier of A
proof
  let A be with_if-instruction non-empty UAStr;
  reconsider f = (the charact of A).3 as 3-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def12;
  3 in dom the charact of A by Def12;
  then
A1: Den(In(3, dom the charact of A), A) = f by SUBSET_1:def 8;
  arity f = 3 by COMPUT_1:def 21;
  hence thesis by A1,COMPUT_1:22;
end;

definition
  let A be with_if-instruction non-empty UAStr;
  let C,I1,I2 be Algorithm of A;
  func if-then-else(C,I1,I2) -> Algorithm of A equals
  Den(In(3, dom the charact of A), A).<*C,I1,I2*>;
  coherence
  proof
    reconsider f = (the charact of A).3 as 3-ary non empty homogeneous
    quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def12;
    3 in dom the charact of A by Def12;
    then
A1: Den(In(3, dom the charact of A), A) = f by SUBSET_1:def 8;
    arity f = 3 by COMPUT_1:def 21;
    then dom f = 3-tuples_on the carrier of A by COMPUT_1:22;
    then <*C,I1,I2*> in dom f by FINSEQ_2:139;
    hence thesis by A1,PARTFUN1:4;
  end;
end;

definition
  let A be with_empty-instruction with_if-instruction non-empty UAStr;
  let C,I be Algorithm of A;
  func if-then(C,I) -> Algorithm of A equals
  if-then-else(C,I,EmptyIns A);
  coherence;
end;

theorem Th48:
  for A being with_while-instruction non-empty UAStr
  holds dom Den(In(4, dom the charact of A), A) = 2-tuples_on the carrier of A
proof
  let A be with_while-instruction non-empty UAStr;
  reconsider f = (the charact of A).4 as 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def13;
  4 in dom the charact of A by Def13;
  then
A1: Den(In(4, dom the charact of A), A) = f by SUBSET_1:def 8;
  arity f = 2 by COMPUT_1:def 21;
  hence thesis by A1,COMPUT_1:22;
end;

definition
  let A be with_while-instruction non-empty UAStr;
  let C,I be Algorithm of A;
  func while(C,I) -> Algorithm of A equals
  Den(In(4, dom the charact of A), A).<*C,I*>;
  coherence
  proof
    reconsider f = (the charact of A).4 as 2-ary non empty homogeneous
    quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def13;
    4 in dom the charact of A by Def13;
    then
A1: Den(In(4, dom the charact of A), A) = f by SUBSET_1:def 8;
    arity f = 2 by COMPUT_1:def 21;
    then dom f = 2-tuples_on the carrier of A by COMPUT_1:22;
    then <*C,I*> in dom f by FINSEQ_2:137;
    hence thesis by A1,PARTFUN1:4;
  end;
end;

definition
  let A be preIfWhileAlgebra;
  let I0,C,I,J be Element of A;
  func for-do(I0,C,J,I) -> Element of A equals
  I0\;while(C,I\;J);
  coherence;
end;

definition
  let A be preIfWhileAlgebra;
  func ElementaryInstructions A -> Subset of A equals
  (the carrier of A)
  \ {EmptyIns A} \ rng Den(In(3, dom the charact of A), A)
  \ rng Den(In(4, dom the charact of A), A)
  \ {I1 \; I2 where I1,I2 is Algorithm of A: I1 <> I1\;I2 & I2 <> I1\;I2};
  coherence;
end;

theorem Th49:
  for A being preIfWhileAlgebra holds EmptyIns A nin ElementaryInstructions A
proof
  let A be preIfWhileAlgebra;
  set I = EmptyIns A;
  I in {I} by TARSKI:def 1;
  then I nin (the carrier of A)\{I} by XBOOLE_0:def 5;
  then I nin (the carrier of A) \ {EmptyIns A}
  \ rng Den(In(3, dom the charact of A), A) by XBOOLE_0:def 5;
  then I nin (the carrier of A) \ {EmptyIns A}
  \ rng Den(In(3, dom the charact of A), A)
  \ rng Den(In(4, dom the charact of A), A) by XBOOLE_0:def 5;
  hence thesis by XBOOLE_0:def 5;
end;

theorem Th50:
  for A being preIfWhileAlgebra
  for I1,I2 being Element of A st I1 <> I1\;I2 & I2 <> I1\;I2
  holds I1\;I2 nin ElementaryInstructions A
proof
  let A be preIfWhileAlgebra;
  let I1,I2 be Element of A;
  assume that
A1: I1 <> I1\;I2 and
A2: I2 <> I1\;I2;
  I1\;I2 in {J1 \; J2 where J1,J2 is Algorithm of A:
  J1 <> J1\;J2 & J2 <> J1\;J2} by A1,A2;
  hence thesis by XBOOLE_0:def 5;
end;

theorem Th51:
  for A being preIfWhileAlgebra for C,I1,I2 being Element of A
  holds if-then-else(C,I1,I2) nin ElementaryInstructions A
proof
  let A be preIfWhileAlgebra;
  let C,I1,I2 be Element of A;
  set I = if-then-else(C,I1,I2);
  reconsider f = (the charact of A).3 as 3-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def12;
  3 in dom the charact of A by Def12;
  then In(3, dom the charact of A) = 3 by SUBSET_1:def 8;
  then dom Den(In(3, dom the charact of A), A)
  = (arity f)-tuples_on the carrier of A by COMPUT_1:22
    .= 3-tuples_on the carrier of A by COMPUT_1:def 21;
  then <*C,I1,I2*> in dom Den(In(3, dom the charact of A), A) by FINSEQ_2:139;
  then I in rng Den(In(3, dom the charact of A), A) by FUNCT_1:def 3;
  then I nin (the carrier of A) \ {EmptyIns A}
  \ rng Den(In(3, dom the charact of A), A) by XBOOLE_0:def 5;
  then I nin (the carrier of A) \ {EmptyIns A}
  \ rng Den(In(3, dom the charact of A), A)
  \ rng Den(In(4, dom the charact of A), A) by XBOOLE_0:def 5;
  hence thesis by XBOOLE_0:def 5;
end;

theorem Th52:
  for A being preIfWhileAlgebra for C,I being Element of A
  holds while(C,I) nin ElementaryInstructions A
proof
  let A be preIfWhileAlgebra;
  let C,I1 be Element of A;
  set I = while(C,I1);
  reconsider f = (the charact of A).4 as 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def13;
  4 in dom the charact of A by Def13;
  then In(4, dom the charact of A) = 4 by SUBSET_1:def 8;
  then dom Den(In(4, dom the charact of A), A)
  = (arity f)-tuples_on the carrier of A by COMPUT_1:22
    .= 2-tuples_on the carrier of A by COMPUT_1:def 21;
  then <*C,I1*> in dom Den(In(4, dom the charact of A), A) by FINSEQ_2:137;
  then I in rng Den(In(4, dom the charact of A), A) by FUNCT_1:def 3;
  then I nin (the carrier of A) \ {EmptyIns A}
  \ rng Den(In(3, dom the charact of A), A)
  \ rng Den(In(4, dom the charact of A), A) by XBOOLE_0:def 5;
  hence thesis by XBOOLE_0:def 5;
end;

theorem Th53:
  for A being preIfWhileAlgebra for I being Element of A
  st I nin ElementaryInstructions A holds I = EmptyIns A or
  (ex I1,I2 being Element of A st I = I1\;I2 & I1 <> I1\;I2 & I2 <> I1\;I2) or
  (ex C,I1,I2 being Element of A st I = if-then-else(C,I1,I2)) or
  ex C,J being Element of A st I = while(C,J)
proof
  let A be preIfWhileAlgebra;
  let I be Element of A such that
A1: I nin ElementaryInstructions A and
A2: I <> EmptyIns A and
A3: for I1,I2 being Element of A st I = I1\;I2 & I1 <> I1\;I2 holds
  I2 = I1\;I2 and
A4: for C,I1,I2 being Element of A holds I <> if-then-else(C,I1,I2) and
A5: for C,J being Element of A holds I <> while(C,J);
A6: now
    assume I in rng Den(In(3, dom the charact of A), A);
    then consider x being object such that
A7: x in dom Den(In(3, dom the charact of A), A) and
A8: I = Den(In(3, dom the charact of A), A).x by FUNCT_1:def 3;
    reconsider f = (the charact of A).3 as 3-ary non empty homogeneous
    quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def12;
    3 in dom the charact of A by Def12;
    then In(3, dom the charact of A) = 3 by SUBSET_1:def 8;
    then dom Den(In(3, dom the charact of A), A)
    = (arity f)-tuples_on the carrier of A by COMPUT_1:22
      .= 3-tuples_on the carrier of A by COMPUT_1:def 21;
    then consider C,I1,I2 be object such that
A9: C in the carrier of A and
A10: I1 in the carrier of A and
A11: I2 in the carrier of A and
A12: x = <*C,I1,I2*> by A7,FINSEQ_2:139;
    reconsider C,I1,I2 as Element of A by A9,A10,A11;
    I = if-then-else(C,I1,I2) by A8,A12;
    hence contradiction by A4;
  end;
A13: now
    assume I in rng Den(In(4, dom the charact of A), A);
    then consider x being object such that
A14: x in dom Den(In(4, dom the charact of A), A) and
A15: I = Den(In(4, dom the charact of A), A).x by FUNCT_1:def 3;
    reconsider f = (the charact of A).4 as 2-ary non empty homogeneous
    quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def13;
    4 in dom the charact of A by Def13;
    then In(4, dom the charact of A) = 4 by SUBSET_1:def 8;
    then dom Den(In(4, dom the charact of A), A)
    = (arity f)-tuples_on the carrier of A by COMPUT_1:22
      .= 2-tuples_on the carrier of A by COMPUT_1:def 21;
    then consider C,J be object such that
A16: C in the carrier of A and
A17: J in the carrier of A and
A18: x = <*C,J*> by A14,FINSEQ_2:137;
    reconsider C,J as Element of A by A16,A17;
    I = while(C,J) by A15,A18;
    hence contradiction by A5;
  end;
  A19: I
 nin {I1\;I2 where I1,I2 is Algorithm of A: I1 <> I1\;I2 & I2 <> I1\;I2}
  by A3;
  I in (the carrier of A) \ {EmptyIns A} by A2,ZFMISC_1:56;
  then I in (the carrier of A) \ {EmptyIns A}
  \ rng Den(In(3, dom the charact of A), A) by A6,XBOOLE_0:def 5;
  then I in (the carrier of A) \ {EmptyIns A}
  \ rng Den(In(3, dom the charact of A), A)
  \ rng Den(In(4, dom the charact of A), A) by A13,XBOOLE_0:def 5;
  hence contradiction by A1,A19,XBOOLE_0:def 5;
end;

definition
  let A be preIfWhileAlgebra;
  attr A is infinite means
  : Def23:
  ElementaryInstructions A is infinite;
  attr A is degenerated means
  : Def24:
  (ex I1,I2 being Element of A st
  I1 <> EmptyIns A & I1\;I2 = I2 or I2 <> EmptyIns A & I1\;I2 = I1 or
  (I1 <> EmptyIns A or I2 <> EmptyIns A) & I1\;I2 = EmptyIns A) or
  (ex C,I1,I2 being Element of A st if-then-else(C,I1,I2) = EmptyIns A) or
  (ex C,I being Element of A st while(C,I) = EmptyIns A) or
  (ex I1,I2,C,J1,J2 being Element of A st I1 <> EmptyIns A & I2 <> EmptyIns A &
  I1\;I2 = if-then-else(C,J1,J2)) or
  (ex I1,I2,C,J being Element of A st I1 <> EmptyIns A & I2 <> EmptyIns A &
  I1\;I2 = while(C,J)) or ex C1,I1,I2,C2,J being Element of A st
  if-then-else(C1,I1,I2) = while(C2,J);
  attr A is well_founded means
  :
  Def25: ElementaryInstructions A is GeneratorSet of A;
end;

definition
  func ECIW-signature -> non empty FinSequence of NAT equals
  <*0, 2*>^<*3, 2*>;
  coherence;
end;

theorem Th54:
  len ECIW-signature = 4 & dom ECIW-signature = Seg 4 &
  ECIW-signature.1 = 0 & ECIW-signature.2 = 2 &
  ECIW-signature.3 = 3 & ECIW-signature.4 = 2
proof
A1: len <*0,2*> = 2 by FINSEQ_1:44;
A2: len <*3,2*> = 2 by FINSEQ_1:44;
A3: dom <*0,2*> = Seg 2 by A1,FINSEQ_1:def 3;
A4: dom <*3,2*> = Seg 2 by A2,FINSEQ_1:def 3;
  then
A5: 1 in dom <*3,2*>;
A6: <*3,2*>.1 = 3;
A7: 2 in dom <*3,2*> by A4;
A8: <*3,2*>.2 = 2;
A9: 2+1 = 3;
A10: 1 in dom <*0,2*> by A3;
A11: <*0,2*>.1 = 0;
A12: 2 in dom <*0,2*> by A3;
  <*0,2*>.2 = 2;
  hence thesis by A1,A2,A5,A6,A7,A8,A9,A10,A11,A12,FINSEQ_1:22,def 7;
end;

definition
  let A be partial non-empty non empty UAStr;
  attr A is ECIW-strict means
  : Def27:
  signature A = ECIW-signature;
end;

theorem Th55:
  for A being partial non-empty non empty UAStr st A is ECIW-strict
  for o being OperSymbol of A holds o = 1 or o = 2 or o = 3 or o = 4
proof
  let A be partial non-empty non empty UAStr;
  assume signature A = ECIW-signature;
  then 4 = len the charact of A by Th54,UNIALG_1:def 4;
  then dom the charact of A = Seg 4 by FINSEQ_1:def 3;
  hence thesis by ENUMSET1:def 2,FINSEQ_3:2;
end;

registration
  let X be disjoint_with_NAT non empty set;
  cluster FreeUnivAlgNSG(ECIW-signature,X) -> with_empty-instruction
    with_catenation with_if-instruction with_while-instruction;
  coherence
  proof
    set S = FreeUnivAlgNSG(ECIW-signature,X);
    set char = ECIW-signature;
A1: len <*0,2*> = 2 by FINSEQ_1:44;
A2: len <*3,2*> = 2 by FINSEQ_1:44;
    then
A3: len char = 2+2 by A1,FINSEQ_1:22;
A4: len the charact of S = len char by FREEALG:def 11;
A5: dom <*0,2*> = Seg 2 by A1,FINSEQ_1:def 3;
A6: dom <*3,2*> = Seg 2 by A2,FINSEQ_1:def 3;
A7: dom the charact of S = Seg 4 by A3,A4,FINSEQ_1:def 3;
A8: dom char = Seg 4 by A3,FINSEQ_1:def 3;
    thus 1 in dom the charact of S by A7;
    then
A9: (the charact of S).1 = FreeOpNSG(1,char,X) by FREEALG:def 11;
A10: 1 in dom char by A8;
A11: 2 in dom char by A8;
A12: 3 in dom char by A8;
A13: 4 in dom char by A8;
    reconsider D = TS(DTConUA(char,X)) as non empty set;
    reconsider char as non empty FinSequence of omega;
    set o = FreeOpNSG(1,char,X);
A14: 1 in dom <*0,2*> by A5;
A15: <*0,2*>.1 = 0;
A16: 2 in dom <*0,2*> by A5;
A17: <*0,2*>.2 = 2;
    char.1 = 0 by A14,A15,FINSEQ_1:def 7;
    then char/.1 = 0 by A10,PARTFUN1:def 6;
    then
A18: dom o = 0-tuples_on the carrier of S by A10,FREEALG:def 10;
    reconsider o as homogeneous non empty quasi_total PartFunc of D*, D;
    arity o = 0 by A18,COMPUT_1:25;
    hence (the charact of S).1 is 0-ary non empty homogeneous
    quasi_total PartFunc of (the carrier of S)*, the carrier of S
    by A9,COMPUT_1:def 21;
    thus 2 in dom the charact of S by A7;
    then
A19: (the charact of S).2 = FreeOpNSG(2,char,X) by FREEALG:def 11;
    set o = FreeOpNSG(2,char,X);
    char.2 = 2 by A16,A17,FINSEQ_1:def 7;
    then (char qua FinSequence of omega)/.2 = 2 by A11,PARTFUN1:def 6;
    then
A20: dom o = 2-tuples_on the carrier of S by A11,FREEALG:def 10;
    reconsider o as homogeneous non empty quasi_total PartFunc of D*, D;
    arity o = 2 by A20,COMPUT_1:25;
    hence (the charact of S).2 is 2-ary non empty homogeneous
    quasi_total PartFunc of (the carrier of S)*, the carrier of S
    by A19,COMPUT_1:def 21;
    thus 3 in dom the charact of S by A7;
    then
A21: (the charact of S).3 = FreeOpNSG(3,char,X) by FREEALG:def 11;
    set o = FreeOpNSG(3,char,X);
A22: 1 in dom <*3,2*> by A6;
A23: <*3,2*>.1 = 3;
A24: 2 in dom <*3,2*> by A6;
A25: <*3,2*>.2 = 2;
    char.(2+1) = 3 by A1,A22,A23,FINSEQ_1:def 7;
    then (char qua FinSequence of omega)/.3 = 3 by A12,PARTFUN1:def 6;
    then
A26: dom o = 3-tuples_on the carrier of S by A12,FREEALG:def 10;
    reconsider o as homogeneous non empty quasi_total PartFunc of D*, D;
    arity o = 3 by A26,COMPUT_1:25;
    hence (the charact of S).3 is 3-ary non empty homogeneous
    quasi_total PartFunc of (the carrier of S)*, the carrier of S
    by A21,COMPUT_1:def 21;
    thus 4 in dom the charact of S by A7;
    then
A27: (the charact of S).4 = FreeOpNSG(4,char,X) by FREEALG:def 11;
    set o = FreeOpNSG(4,char,X);
    char.(2+2) = 2 by A1,A24,A25,FINSEQ_1:def 7;
    then (char qua FinSequence of omega)/.4 = 2 by A13,PARTFUN1:def 6;
    then
A28: dom o = 2-tuples_on the carrier of S by A13,FREEALG:def 10;
    reconsider o as homogeneous non empty quasi_total PartFunc of D*, D;
    arity o = 2 by A28,COMPUT_1:25;
    hence thesis by A27,COMPUT_1:def 21;
  end;
end;

theorem Th56:
  for X being disjoint_with_NAT non empty set
  for I being Element of FreeUnivAlgNSG(ECIW-signature,X) holds
  (ex x being Element of X st I = root-tree x) or
  ex n being Nat, p being FinSequence of FreeUnivAlgNSG(ECIW-signature,X)
  st n in Seg 4 & I = n-tree p & len p = ECIW-signature.n
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set G = DTConUA(S,X);
  let I be Element of FreeUnivAlgNSG(S,X) such that
A1: not ex x being Element of X st I = root-tree x;
  Terminals DTConUA(S,X) = X by FREEALG:3;
  then not ex d being Symbol of G st d in Terminals G & I = root-tree d by A1;
  then consider o being Symbol of G, p being FinSequence of TS G such that
A2: o ==> roots p and
A3: I = o-tree p by Th16;
A4: NonTerminals G = {s where s is Symbol of G:
  ex n being FinSequence st s ==> n} by LANG1:def 3;
  then
A5: o in NonTerminals G by A2;
A6: NonTerminals G = Seg 4 by Th54,FREEALG:2;
  then reconsider n = o as Element of NAT by A5;
  reconsider p as FinSequence of FreeUnivAlgNSG(ECIW-signature,X);
  take n, p;
  thus n in Seg 4 by A2,A4,A6;
  thus I = n-tree p by A3;
A7: [n, roots p] in the Rules of G by A2,LANG1:def 1;
  then
A8: roots p in (the carrier of G)* by ZFMISC_1:87;
  dom p = dom roots p by TREES_3:def 18;
  hence len p = card dom roots p by CARD_1:62
    .= len roots p by CARD_1:62
    .= S.n by A7,A8,FREEALG:def 7;
end;

theorem Th57:
  for X being disjoint_with_NAT non empty set
  holds EmptyIns FreeUnivAlgNSG(ECIW-signature,X) = 1-tree {}
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  reconsider s = S as non empty FinSequence of omega;
  set A = FreeUnivAlgNSG(S,X);
A1: 1 in dom the charact of A by Def10;
  reconsider f = (the charact of A).1 as 0-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def10;
A2: f = FreeOpNSG(1,S,X) by A1,FREEALG:def 11;
A3: 1 in dom S by Th54;
  then
A4: s/.1 = S.1 by PARTFUN1:def 6;
A5: dom FreeOpNSG(1,S,X) = (s/.1)-tuples_on TS(DTConUA(S,X))
  by A3,FREEALG:def 10
    .= {{}} by A4,Th54,COMPUT_1:5;
A6: {} in {{}} by TARSKI:def 1;
A7: {} = <*> TS(DTConUA(S,X));
  thus EmptyIns A = f.{} by A1,SUBSET_1:def 8
    .= Sym(1,S,X)-tree({}) by A2,A3,A5,A6,A7,FREEALG:def 10
    .= 1-tree {} by A3,FREEALG:def 9;
end;

theorem Th58:
  for X being disjoint_with_NAT non empty set
  for p being FinSequence of FreeUnivAlgNSG(ECIW-signature,X)
  st 1-tree p is Element of FreeUnivAlgNSG(ECIW-signature,X) holds p = {}
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set G = DTConUA(S,X);
  set A = FreeUnivAlgNSG(S,X);
  let p be FinSequence of A;
  assume 1-tree p is Element of A;
  then reconsider I = 1-tree p as Element of A;
  per cases by Th56;
  suppose ex x being Element of X st I = root-tree x;
    then consider x being Element of X such that
A1: 1-tree p = root-tree x;
    1-tree p = x-tree(<*>TS G) by A1,TREES_4:20;
    hence thesis by TREES_4:15;
  end;
  suppose ex n being Nat, p being FinSequence of A
    st n in Seg 4 & I = n-tree p & len p = S.n;
    then consider n being Nat, q being FinSequence of A such that
    n in Seg 4 and
A2: I = n-tree q and
A3: len q = S.n;
    q = p by A2,TREES_4:15;
    hence thesis by A2,A3,Th54,TREES_4:15;
  end;
end;

theorem Th59:
  for X being disjoint_with_NAT non empty set
  for I1,I2 being Element of FreeUnivAlgNSG(ECIW-signature,X)
  holds I1\;I2 = 2-tree(I1,I2)
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  reconsider s = S as non empty FinSequence of omega;
  set A = FreeUnivAlgNSG(S,X);
  let I1,I2 be Element of A;
A1: 2 in dom the charact of A by Def11;
  reconsider f = (the charact of A).2 as 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def11;
A2: f = FreeOpNSG(2,S,X) by A1,FREEALG:def 11;
A3: 2 in dom S by Th54;
  then s/.2 = S.2 by PARTFUN1:def 6;
  then
A4: dom FreeOpNSG(2,S,X) = 2-tuples_on TS(DTConUA(S,X))
  by A3,Th54,FREEALG:def 10;
A5: <*I1,I2*> in 2-tuples_on TS(DTConUA(S,X)) by FINSEQ_2:137;
  thus I1\;I2 = f.<*I1,I2*> by A1,SUBSET_1:def 8
    .= Sym(2,S,X)-tree(<*I1,I2*>) by A2,A3,A4,A5,FREEALG:def 10
    .= 2-tree (I1,I2) by A3,FREEALG:def 9;
end;

theorem Th60:
  for X being disjoint_with_NAT non empty set
  for p being FinSequence of FreeUnivAlgNSG(ECIW-signature,X)
  st 2-tree p is Element of FreeUnivAlgNSG(ECIW-signature,X)
  ex I1,I2 being Element of FreeUnivAlgNSG(ECIW-signature,X) st p = <*I1,I2*>
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set G = DTConUA(S,X);
  set A = FreeUnivAlgNSG(S,X);
  let p be FinSequence of A;
  assume 2-tree p is Element of A;
  then reconsider I = 2-tree p as Element of A;
  per cases by Th56;
  suppose ex x being Element of X st I = root-tree x;
    then consider x being Element of X such that
A1: 2-tree p = root-tree x;
    2-tree p = x-tree(<*>TS G) by A1,TREES_4:20;
    then 2 = x by TREES_4:15;
    then X meets NAT by XBOOLE_0:3;
    hence thesis by FREEALG:def 1;
  end;
  suppose ex n being Nat, p being FinSequence of A
    st n in Seg 4 & I = n-tree p & len p = S.n;
    then consider n being Nat, q being FinSequence of A such that
    n in Seg 4 and
A2: I = n-tree q and
A3: len q = S.n;
A4: n = 2 by A2,TREES_4:15;
A5: q = p by A2,TREES_4:15;
    then p = <*p.1,p.2*> by A3,A4,Th54,FINSEQ_1:44;
    then rng p = {p.1,p.2} by FINSEQ_2:127;
    then reconsider I1 = p.1, I2 = p.2 as Element of A by ZFMISC_1:32;
    take I1,I2;
    thus thesis by A3,A4,A5,Th54,FINSEQ_1:44;
  end;
end;

theorem Th61:
  for X being disjoint_with_NAT non empty set
  for I1,I2 being Element of FreeUnivAlgNSG(ECIW-signature,X)
  holds I1\;I2 <> I1 & I1\;I2 <> I2
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set G = DTConUA(S,X);
  set A = FreeUnivAlgNSG(S,X);
  let I1,I2 be Element of A;
  set p = <*I1,I2*>;
  rng p c= FinTrees the carrier of G by XBOOLE_1:1;
  then
A1: p is FinSequence of FinTrees the carrier of G by FINSEQ_1:def 4;
A2: rng p = {I1,I2} by FINSEQ_2:127;
  then
A3: I1 in rng p by TARSKI:def 2;
A4: I2 in rng p by A2,TARSKI:def 2;
  I1\;I2 = 2-tree(I1,I2) by Th59
    .= 2-tree<*I1,I2*>;
  hence thesis by A1,A3,A4,Th3;
end;

theorem
  for X being disjoint_with_NAT non empty set
  for I1,I2,J1,J2 being Element of FreeUnivAlgNSG(ECIW-signature,X)
  holds I1\;I2 = J1\;J2 implies I1 = J1 & I2 = J2
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set A = FreeUnivAlgNSG(S,X);
  let I1,I2,J1,J2 be Element of A;
A1: I1\;I2 = 2-tree(I1,I2) by Th59;
  J1\;J2 = 2-tree(J1,J2) by Th59;
  then I1\;I2 = J1\;J2 implies <*I1,I2*> = <*J1,J2*> by A1,TREES_4:15;
  hence thesis by FINSEQ_1:77;
end;

theorem Th63:
  for X being disjoint_with_NAT non empty set
  for C,I1,I2 being Element of FreeUnivAlgNSG(ECIW-signature,X)
  holds if-then-else(C,I1,I2) = 3-tree<*C,I1,I2*>
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  reconsider s = S as non empty FinSequence of omega;
  set A = FreeUnivAlgNSG(S,X);
  let C,I1,I2 be Element of A;
A1: 3 in dom the charact of A by Def12;
  reconsider f = (the charact of A).3 as 3-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def12;
A2: f = FreeOpNSG(3,S,X) by A1,FREEALG:def 11;
A3: 3 in dom S by Th54;
  then s/.3 = S.3 by PARTFUN1:def 6;
  then
A4: dom FreeOpNSG(3,S,X) = 3-tuples_on TS(DTConUA(S,X))
  by A3,Th54,FREEALG:def 10;
A5: <*C,I1,I2*> in 3-tuples_on TS(DTConUA(S,X)) by FINSEQ_2:139;
  thus if-then-else(C,I1,I2) = f.<*C,I1,I2*> by A1,SUBSET_1:def 8
    .= Sym(3,S,X)-tree(<*C,I1,I2*>) by A2,A3,A4,A5,FREEALG:def 10
    .= 3-tree <*C,I1,I2*> by A3,FREEALG:def 9;
end;

theorem Th64:
  for X being disjoint_with_NAT non empty set
  for p being FinSequence of FreeUnivAlgNSG(ECIW-signature,X)
  st 3-tree p is Element of FreeUnivAlgNSG(ECIW-signature,X)
  ex C,I1,I2 being Element of FreeUnivAlgNSG(ECIW-signature,X)
  st p = <*C,I1,I2*>
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set G = DTConUA(S,X);
  set A = FreeUnivAlgNSG(S,X);
  let p be FinSequence of A;
  assume 3-tree p is Element of A;
  then reconsider I = 3-tree p as Element of A;
  per cases by Th56;
  suppose ex x being Element of X st I = root-tree x;
    then consider x being Element of X such that
A1: 3-tree p = root-tree x;
    3-tree p = x-tree(<*>TS G) by A1,TREES_4:20;
    then 3 = x by TREES_4:15;
    then X meets NAT by XBOOLE_0:3;
    hence thesis by FREEALG:def 1;
  end;
  suppose ex n being Nat, p being FinSequence of A
    st n in Seg 4 & I = n-tree p & len p = S.n;
    then consider n being Nat, q being FinSequence of A such that
    n in Seg 4 and
A2: I = n-tree q and
A3: len q = S.n;
A4: n = 3 by A2,TREES_4:15;
A5: q = p by A2,TREES_4:15;
    then p =<*p.1,p.2,p.3*> by A3,A4,Th54,FINSEQ_1:45;
    then
A6: rng p = {p.1,p.2,p.3} by FINSEQ_2:128;
A7: p.1 in {p.1,p.2,p.3} by ENUMSET1:def 1;
A8: p.2 in {p.1,p.2,p.3} by ENUMSET1:def 1;
    p.3 in {p.1,p.2,p.3} by ENUMSET1:def 1;
    then reconsider C = p.1, I1 = p.2, I2 = p.3 as Element of A by A6,A7,A8;
    take C,I1,I2;
    thus thesis by A3,A4,A5,Th54,FINSEQ_1:45;
  end;
end;

theorem
  for X being disjoint_with_NAT non empty set
  for C1,C2,I1,I2,J1,J2 being Element of FreeUnivAlgNSG(ECIW-signature,X)
  st if-then-else(C1,I1,I2) = if-then-else(C2,J1,J2)
  holds C1 = C2 & I1 = J1 & I2 = J2
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set A = FreeUnivAlgNSG(S,X);
  let C1,C2,I1,I2,J1,J2 be Element of A;
A1: if-then-else(C1,I1,I2) = 3-tree<*C1,I1,I2*> by Th63;
  if-then-else(C2,J1,J2) = 3-tree<*C2,J1,J2*> by Th63;
  then if-then-else(C1,I1,I2) = if-then-else(C2,J1,J2)
  implies <*C1,I1,I2*> = <*C2,J1,J2*> by A1,TREES_4:15;
  hence thesis by FINSEQ_1:78;
end;

theorem Th66:
  for X being disjoint_with_NAT non empty set
  for C,I being Element of FreeUnivAlgNSG(ECIW-signature,X)
  holds while(C,I) = 4-tree(C,I)
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  reconsider s = S as non empty FinSequence of omega;
  set A = FreeUnivAlgNSG(S,X);
  let C,I be Element of A;
A1: 4 in dom the charact of A by Def13;
  reconsider f = (the charact of A).4 as 2-ary non empty homogeneous
  quasi_total PartFunc of (the carrier of A)*, the carrier of A by Def13;
A2: f = FreeOpNSG(4,S,X) by A1,FREEALG:def 11;
A3: 4 in dom S by Th54;
  then s/.4 = S.4 by PARTFUN1:def 6;
  then
A4: dom FreeOpNSG(4,S,X) = 2-tuples_on TS(DTConUA(S,X))
  by A3,Th54,FREEALG:def 10;
A5: <*C,I*> in 2-tuples_on TS(DTConUA(S,X)) by FINSEQ_2:137;
  thus while(C,I) = f.<*C,I*> by A1,SUBSET_1:def 8
    .= Sym(4,S,X)-tree(<*C,I*>) by A2,A3,A4,A5,FREEALG:def 10
    .= 4-tree(C,I) by A3,FREEALG:def 9;
end;

theorem Th67:
  for X being disjoint_with_NAT non empty set
  for p being FinSequence of FreeUnivAlgNSG(ECIW-signature,X)
  st 4-tree p is Element of FreeUnivAlgNSG(ECIW-signature,X)
  ex C,I being Element of FreeUnivAlgNSG(ECIW-signature,X) st p = <*C,I*>
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set G = DTConUA(S,X);
  set A = FreeUnivAlgNSG(S,X);
  let p be FinSequence of A;
  assume 4-tree p is Element of A;
  then reconsider I = 4-tree p as Element of A;
  per cases by Th56;
  suppose ex x being Element of X st I = root-tree x;
    then consider x being Element of X such that
A1: 4-tree p = root-tree x;
    4-tree p = x-tree(<*>TS G) by A1,TREES_4:20;
    then 4 = x by TREES_4:15;
    then X meets NAT by XBOOLE_0:3;
    hence thesis by FREEALG:def 1;
  end;
  suppose ex n being Nat, p being FinSequence of A
    st n in Seg 4 & I = n-tree p & len p = S.n;
    then consider n being Nat, q being FinSequence of A such that
    n in Seg 4 and
A2: I = n-tree q and
A3: len q = S.n;
A4: n = 4 by A2,TREES_4:15;
A5: q = p by A2,TREES_4:15;
    then p = <*p.1,p.2*> by A3,A4,Th54,FINSEQ_1:44;
    then rng p = {p.1,p.2} by FINSEQ_2:127;
    then reconsider I1 = p.1, I2 = p.2 as Element of A by ZFMISC_1:32;
    take I1,I2;
    thus thesis by A3,A4,A5,Th54,FINSEQ_1:44;
  end;
end;

theorem Th68:
  for X being disjoint_with_NAT non empty set
  for I being Element of FreeUnivAlgNSG(ECIW-signature,X)
  st I in ElementaryInstructions FreeUnivAlgNSG(ECIW-signature,X)
  ex x being Element of X st I = x-tree {}
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set A = FreeUnivAlgNSG(S, X);
  let I be Element of FreeUnivAlgNSG(ECIW-signature,X) such that
A1: I in ElementaryInstructions FreeUnivAlgNSG(ECIW-signature,X);
  per cases by Th56;
  suppose ex x being Element of X st I = root-tree x;
    then consider x being Element of X such that
A2: I = root-tree x;
    root-tree x = x-tree {} by TREES_4:20;
    hence thesis by A2;
  end;
  suppose
    ex n being Nat, p being FinSequence of FreeUnivAlgNSG(ECIW-signature,X)
    st n in Seg 4 & I = n-tree p & len p = S.n;
    then consider n being Nat,
    p being FinSequence of FreeUnivAlgNSG(ECIW-signature,X) such that
A3: n in Seg 4 and
A4: I = n-tree p and len p = S.n;
    per cases by A3,ENUMSET1:def 2,FINSEQ_3:2;
    suppose
A5:   n = 1;
      then p = {} by A4,Th58;
      then I = EmptyIns A by A4,A5,Th57;
      hence thesis by A1,Th49;
    end;
    suppose
A6:   n = 2;
      then consider I1,I2 being Element of A such that
A7:   p = <*I1,I2*> by A4,Th60;
A8:   I = n-tree(I1,I2) by A4,A7
        .= I1\;I2 by A6,Th59;
      then
A9:   I <> I1 by Th61;
      I <> I2 by A8,Th61;
      hence thesis by A1,A8,A9,Th50;
    end;
    suppose
A10:  n = 3;
      then consider C,I1,I2 being Element of A such that
A11:  p = <*C,I1,I2*> by A4,Th64;
      I = if-then-else(C,I1,I2) by A4,A10,A11,Th63;
      hence thesis by A1,Th51;
    end;
    suppose
A12:  n = 4;
      then consider C,I9 being Element of A such that
A13:  p = <*C,I9*> by A4,Th67;
      I = n-tree(C,I9) by A4,A13
        .= while(C,I9) by A12,Th66;
      hence thesis by A1,Th52;
    end;
  end;
end;

theorem
  for X being disjoint_with_NAT non empty set
  for p being FinSequence of FreeUnivAlgNSG(ECIW-signature,X)
  for x being Element of X
  st x-tree p is Element of FreeUnivAlgNSG(ECIW-signature,X) holds p = {}
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set A = FreeUnivAlgNSG(S, X);
  let p be FinSequence of FreeUnivAlgNSG(ECIW-signature,X);
  let x be Element of X;
  assume x-tree p is Element of FreeUnivAlgNSG(ECIW-signature,X);
  then reconsider I = x-tree p as Element of A;
  now
    given n being Nat, p being FinSequence of A such that
A1: n in Seg 4 and
A2: I = n-tree p and len p = ECIW-signature.n;
A3: x = n by A2,TREES_4:15;
    X misses NAT by FREEALG:def 1;
    hence contradiction by A1,A3,XBOOLE_0:3;
  end;
  then consider y being Element of X such that
A4: I = root-tree y by Th56;
  x-tree p = y-tree {} by A4,TREES_4:20;
  hence thesis by TREES_4:15;
end;

theorem Th70:
  for X being disjoint_with_NAT non empty set
  holds ElementaryInstructions FreeUnivAlgNSG(ECIW-signature,X) =
  FreeGenSetNSG(ECIW-signature,X) &
  card X = card FreeGenSetNSG(ECIW-signature,X)
proof
  let X be disjoint_with_NAT non empty set;
  set S = ECIW-signature;
  set G = DTConUA(S,X);
A1: X = Terminals G by FREEALG:3;
  set A = FreeUnivAlgNSG(S, X);
  thus ElementaryInstructions A = FreeGenSetNSG(S, X)
  proof
    thus ElementaryInstructions A c= FreeGenSetNSG(S, X)
    proof
      let x be object;
      assume x in ElementaryInstructions A;
      then consider y being Element of X such that
A2:   x = y-tree {} by Th68;
      reconsider y as Symbol of G by XBOOLE_0:def 3;
      x = root-tree y by A2,TREES_4:20;
      hence thesis by A1;
    end;
    let x be object;
    assume
A3: x in FreeGenSetNSG(S,X);
    then reconsider I = x as Element of A;
    consider y being Symbol of G such that
A4: x = root-tree y and
A5: y in Terminals G by A3;
A6: x = y-tree {} by A4,TREES_4:20;
    assume
A7: x nin ElementaryInstructions A;
    per cases by A7,Th53;
    suppose I = EmptyIns A;
      then x = 1-tree {} by Th57;
      then
A8:   y = 1 by A6,TREES_4:15;
      X misses NAT by FREEALG:def 1;
      hence thesis by A1,A5,A8,XBOOLE_0:3;
    end;
    suppose ex I1,I2 being Element of A st
      I = I1\;I2 & I1 <> I1\;I2 & I2 <> I1\;I2;
      then consider I1,I2 be Element of A such that
A9:   I = I1\;I2;
      x = 2-tree(I1,I2) by A9,Th59
        .= 2-tree<*I1,I2*>;
      hence thesis by A6,TREES_4:15;
    end;
    suppose ex C,I1,I2 being Element of A st I = if-then-else(C,I1,I2);
      then consider C,I1,I2 be Element of A such that
A10:  I = if-then-else(C,I1,I2);
      x = 3-tree<*C,I1,I2*> by A10,Th63;
      hence thesis by A6,TREES_4:15;
    end;
    suppose ex C,J being Element of A st I = while(C,J);
      then consider C,J be Element of A such that
A11:  I = while(C,J);
      x = 4-tree(C,J) by A11,Th66
        .= 4-tree<*C,J*>;
      hence thesis by A6,TREES_4:15;
    end;
  end;
  deffunc F(object) = root-tree $1;
  consider f being Function such that
  A12: dom
 f = X & for x being Element of X holds f.x = F(x) from FUNCT_1:sch 4;
A13: rng f = FreeGenSetNSG(S,X)
  proof
    thus rng f c= FreeGenSetNSG(S,X)
    proof
      let a be object;
      assume a in rng f;
      then consider x being object such that
A14:  x in X and
A15:  a = f.x by A12,FUNCT_1:def 3;
      a = F(x) by A12,A14,A15;
      hence thesis by A1,A14;
    end;
    let a be object;
    assume a in FreeGenSetNSG(S,X);
    then consider s being Symbol of G such that
A16: a = root-tree s and
A17: s in X by A1;
    reconsider s as Element of X by A17;
    f.s = a by A12,A16;
    hence thesis by A12,FUNCT_1:def 3;
  end;
  f is one-to-one
  proof
    let a,b be object;
    assume that
A18: a in dom f and
A19: b in dom f;
    reconsider x = a, y = b as Element of X by A12,A18,A19;
    assume f.a = f.b;
    then F(x) = f.b by A12
      .= F(y) by A12;
    hence thesis by TREES_4:4;
  end;
  then X, FreeGenSetNSG(S,X) are_equipotent by A12,A13,WELLORD2:def 4;
  hence thesis by CARD_1:5;
end;

registration
  cluster infinite disjoint_with_NAT for set;
  existence
  proof
    take X = [:NAT,{0}:];
    thus X is infinite;
    now
      let x be object;
      assume x in X;
      then
A1:   ex a,b being object st ( a in NAT)&( b in {0})&( x = [a,b])
      by ZFMISC_1:def 2;
      assume x in NAT;
      hence contradiction by A1;
    end;
    hence X misses NAT by XBOOLE_0:3;
  end;
end;

registration
  let X be infinite disjoint_with_NAT set;
  cluster FreeUnivAlgNSG(ECIW-signature,X) -> infinite;
  coherence
  proof
    card X = card FreeGenSetNSG(ECIW-signature,X) by Th70;
    then card ElementaryInstructions FreeUnivAlgNSG(ECIW-signature,X) is
    infinite by Th70;
    hence
    ElementaryInstructions FreeUnivAlgNSG(ECIW-signature,X) is infinite;
  end;
end;

registration
  let X be disjoint_with_NAT non empty set;
  cluster FreeUnivAlgNSG(ECIW-signature,X) -> ECIW-strict;
  coherence
  by FREEALG:4;
end;

theorem Th71:
  for A being preIfWhileAlgebra holds Generators A c= ElementaryInstructions A
proof
  let A be preIfWhileAlgebra;
  let x be object;
  assume that
A1: x in Generators A and
A2: x nin ElementaryInstructions A;
  reconsider x as Element of A by A1;
  dom Den(In(1, dom the charact of A), A) = {{}} by Th42;
  then
A3: {} in dom Den(In(1, dom the charact of A),A) by TARSKI:def 1;
  per cases by A2,Th53;
  suppose x = EmptyIns A;
    then x in rng Den(In(1, dom the charact of A), A) by A3,FUNCT_1:3;
    hence contradiction by A1,Th26;
  end;
  suppose
    ex I1,I2 being Element of A st x = I1\;I2 & I1 <> I1\;I2 & I2 <> I1\;I2;
    then consider I1,I2 being Element of A such that
A4: x = I1\;I2 and I1 <> I1\;I2
    and I2 <> I1\;I2;
    dom Den(In(2, dom the charact of A), A) = 2-tuples_on the carrier of A
    by Th44;
    then <*I1,I2*> in dom Den(In(2, dom the charact of A),A) by FINSEQ_2:137;
    then x in rng Den(In(2, dom the charact of A),A) by A4,FUNCT_1:3;
    hence contradiction by A1,Th26;
  end;
  suppose ex C,I1,I2 being Element of A st x = if-then-else(C,I1,I2);
    then consider C,I1,I2 being Element of A such that
A5: x = if-then-else(C,I1,I2);
    dom Den(In(3, dom the charact of A), A) = 3-tuples_on the carrier of A
    by Th47;
    then <*C,I1,I2*> in dom Den(In(3, dom the charact of A),A) by FINSEQ_2:139;
    then x in rng Den(In(3, dom the charact of A),A) by A5,FUNCT_1:3;
    hence contradiction by A1,Th26;
  end;
  suppose ex C,J being Element of A st x = while(C,J);
    then consider C,J being Element of A such that
A6: x = while(C,J);
    dom Den(In(4, dom the charact of A), A) = 2-tuples_on the carrier of A
    by Th48;
    then <*C,J*> in dom Den(In(4, dom the charact of A),A) by FINSEQ_2:137;
    then x in rng Den(In(4, dom the charact of A),A) by A6,FUNCT_1:3;
    hence contradiction by A1,Th26;
  end;
end;

theorem Th72:
  for A being preIfWhileAlgebra st A is free for C,I1,I2 being Element of A
  holds EmptyIns A <> I1\;I2 & EmptyIns A <> if-then-else(C,I1,I2) &
  EmptyIns A <> while(C,I1)
proof
  let A be preIfWhileAlgebra such that
A1: A is free;
  let C,I1,I2 be Element of A;
A2: dom Den(In(1, dom the charact of A), A) = {{}} by Th42;
A3: dom Den(In(2, dom the charact of A), A) = 2-tuples_on the carrier of A
  by Th44;
A4: dom Den(In(3, dom the charact of A), A) = 3-tuples_on the carrier of A
  by Th47;
A5: dom Den(In(4, dom the charact of A), A) = 2-tuples_on the carrier of A
  by Th48;
A6: {} in {{}} by TARSKI:def 1;
  <*I1,I2*> in 2-tuples_on the carrier of A by FINSEQ_2:137;
  hence EmptyIns A <> I1\;I2 by A1,A2,A3,A6,Th36;
  <*C,I1,I2*> in 3-tuples_on the carrier of A by FINSEQ_2:139;
  hence EmptyIns A <> if-then-else(C,I1,I2) by A1,A2,A4,A6,Th36;
  <*C,I1*> in 2-tuples_on the carrier of A by FINSEQ_2:137;
  hence thesis by A1,A2,A5,A6,Th36;
end;

theorem Th73:
  for A being preIfWhileAlgebra st A is free
  for I1,I2,C,J1,J2 being Element of A holds I1\;I2 <> I1 & I1\;I2 <> I2 &
  (I1\;I2 = J1\;J2 implies I1 = J1 & I2 = J2) &
  I1\;I2 <> if-then-else(C,J1,J2) & I1\;I2 <> while(C,J1)
proof
  let A be preIfWhileAlgebra such that
A1: A is free;
  let I1,I2,C,J1,J2 be Element of A;
A2: 2 in dom the charact of A by Def11;
A3: dom Den(In(2, dom the charact of A), A) = 2-tuples_on the carrier of A
  by Th44;
A4: In(2, dom the charact of A) = 2 by A2,SUBSET_1:def 8;
A5: 3 in dom the charact of A by Def12;
A6: dom Den(In(3, dom the charact of A), A) = 3-tuples_on the carrier of A
  by Th47;
A7: In(3, dom the charact of A) = 3 by A5,SUBSET_1:def 8;
A8: 4 in dom the charact of A by Def13;
A9: dom Den(In(4, dom the charact of A), A) = 2-tuples_on the carrier of A
  by Th48;
A10: In(4, dom the charact of A) = 4 by A8,SUBSET_1:def 8;
A11: <*I1,I2*> in 2-tuples_on the carrier of A by FINSEQ_2:137;
A12: <*J1,J2*> in 2-tuples_on the carrier of A by FINSEQ_2:137;
A13: rng <*I1,I2*> = {I1,I2} by FINSEQ_2:127;
  then
A14: I1 in rng <*I1,I2*> by TARSKI:def 2;
  I2 in rng <*I1,I2*> by A13,TARSKI:def 2;
  hence I1\;I2 <> I1 & I1\;I2 <> I2 by A1,A3,A11,A14,Th38;
  hereby
    assume I1\;I2 = J1\;J2;
    then <*I1,I2*> = <*J1,J2*> by A1,A3,A11,A12,Th36;
    hence I1 = J1 & I2 = J2 by FINSEQ_1:77;
  end;
  <*C,J1,J2*> in 3-tuples_on the carrier of A by FINSEQ_2:139;
  hence I1\;I2 <> if-then-else(C,J1,J2) by A1,A3,A4,A6,A7,A11,Th36;
  <*C,J1*> in 2-tuples_on the carrier of A by FINSEQ_2:137;
  hence thesis by A1,A3,A4,A9,A10,A11,Th36;
end;

theorem Th74:
  for A being preIfWhileAlgebra st A is free
  for C,I1,I2,D,J1,J2 being Element of A
  holds if-then-else(C,I1,I2) <> C & if-then-else(C,I1,I2) <> I1 &
  if-then-else(C,I1,I2) <> I2 & if-then-else(C,I1,I2) <> while(D,J1) &
  (if-then-else(C,I1,I2) = if-then-else(D,J1,J2) implies C=D & I1=J1 & I2=J2)
proof
  let A be preIfWhileAlgebra such that
A1: A is free;
  let C,I1,I2,D,J1,J2 be Element of A;
A2: 3 in dom the charact of A by Def12;
A3: dom Den(In(3, dom the charact of A), A) = 3-tuples_on the carrier of A
  by Th47;
A4: In(3, dom the charact of A) = 3 by A2,SUBSET_1:def 8;
A5: 4 in dom the charact of A by Def13;
A6: dom Den(In(4, dom the charact of A), A) = 2-tuples_on the carrier of A
  by Th48;
A7: In(4, dom the charact of A) = 4 by A5,SUBSET_1:def 8;
A8: <*C,I1,I2*> in 3-tuples_on the carrier of A by FINSEQ_2:139;
A9: <*D,J1,J2*> in 3-tuples_on the carrier of A by FINSEQ_2:139;
A10: rng <*C,I1,I2*> = {C,I1,I2} by FINSEQ_2:128;
  then
A11: C in rng <*C,I1,I2*> by ENUMSET1:def 1;
A12: I1 in rng <*C,I1,I2*> by A10,ENUMSET1:def 1;
  I2 in rng <*C,I1,I2*> by A10,ENUMSET1:def 1;
  hence if-then-else(C,I1,I2) <> C & if-then-else(C,I1,I2) <> I1 &
  if-then-else(C,I1,I2) <> I2 by A1,A3,A8,A11,A12,Th38;
  <*D,J1*> in 2-tuples_on the carrier of A by FINSEQ_2:137;
  hence if-then-else(C,I1,I2) <> while(D,J1) by A1,A3,A4,A6,A7,A8,Th36;
  assume if-then-else(C,I1,I2) = if-then-else(D,J1,J2);
  then <*C,I1,I2*> = <*D,J1,J2*> by A1,A3,A8,A9,Th36;
  hence thesis by FINSEQ_1:78;
end;

theorem Th75:
  for A being preIfWhileAlgebra st A is free for C,I,D,J being Element of A
  holds while(C,I) <> C & while(C,I) <> I &
  (while(C,I) = while(D,J) implies C = D & I = J)
proof
  let A be preIfWhileAlgebra such that
A1: A is free;
  let C,I,D,J be Element of A;
A2: dom Den(In(4, dom the charact of A), A) = 2-tuples_on the carrier of A
  by Th48;
A3: <*C,I*> in 2-tuples_on the carrier of A by FINSEQ_2:137;
A4: <*D,J*> in 2-tuples_on the carrier of A by FINSEQ_2:137;
A5: rng <*C,I*> = {C,I} by FINSEQ_2:127;
  then
A6: C in rng <*C,I*> by TARSKI:def 2;
  I in rng <*C,I*> by A5,TARSKI:def 2;
  hence while(C,I) <> C & while(C,I) <> I by A1,A2,A3,A6,Th38;
  assume while(C,I) = while(D,J);
  then <*C,I*> = <*D,J*> by A1,A2,A3,A4,Th36;
  hence thesis by FINSEQ_1:77;
end;

registration
  cluster free -> well_founded non degenerated for preIfWhileAlgebra;
  coherence
  proof
    let A be preIfWhileAlgebra;
    assume
A1: A is free;
    then reconsider A9 = A as free Universal_Algebra;
    set G = the free GeneratorSet of A9;
    Generators A = G by Th34;
    hence ElementaryInstructions A is GeneratorSet of A by Th31,Th71;
    thus
    not ex I1,I2 be Element of A st I1 <> EmptyIns A & I1\;I2 = I2 or
    I2 <> EmptyIns A & I1\;I2 = I1 or
    (I1 <> EmptyIns A or I2 <> EmptyIns A) & I1\;I2 = EmptyIns A
    by A1,Th72,Th73;
    thus thesis by A1,Th72,Th73,Th74;
  end;
end;

registration
  cluster infinite non degenerated well_founded ECIW-strict free
    strict for preIfWhileAlgebra;
  existence
  proof
    set X = the infinite disjoint_with_NAT set;
    take FreeUnivAlgNSG(ECIW-signature,X);
    thus thesis;
  end;
end;

definition
  mode IfWhileAlgebra is
    non degenerated well_founded ECIW-strict preIfWhileAlgebra;
end;

registration
  let A be infinite preIfWhileAlgebra;
  cluster ElementaryInstructions A -> infinite;
  coherence by Def23;
end;

theorem Th76:
  for A being preIfWhileAlgebra for B being Subset of A for n being Nat holds
  EmptyIns A in B|^(n+1) & for C,I1,I2 being Element of A
  st C in B|^n & I1 in B|^n & I2 in B|^n
  holds I1\;I2 in B|^(n+1) & if-then-else(C,I1,I2) in B|^(n+1) &
  while(C,I1) in B|^(n+1)
proof
  let A be preIfWhileAlgebra;
  let B be Subset of A;
  let n be Nat;
  set X = {Den(o,A).p where o is (Element of dom the charact of A),
  p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= B|^n};
A1: B|^(n+1) = B|^n \/ X by Th19;
  reconsider pe = <*>the carrier of A as Element of (the carrier of A)*
  by FINSEQ_1:def 11;
A2: pe in {{}} by TARSKI:def 1;
A3: rng pe = {};
A4: dom Den(In(1, dom the charact of A), A) = {{}} by Th42;
  {} c= B|^n;
  then EmptyIns A in X by A2,A3,A4;
  hence EmptyIns A in B|^(n+1) by A1,XBOOLE_0:def 3;
  let C,I1,I2 be Element of A;
  assume
A5: C in B|^n;
  assume
A6: I1 in B|^n;
  assume
A7: I2 in B|^n;
A8: <*I1,I2*> in 2-tuples_on the carrier of A by FINSEQ_2:137;
A9: rng <*I1,I2*> = {I1,I2} by FINSEQ_2:127;
A10: dom Den(In(2, dom the charact of A), A) = 2-tuples_on the carrier of A
  by Th44;
  {I1,I2} c= B|^n by A6,A7,ZFMISC_1:32;
  then I1\;I2 in X by A8,A9,A10;
  hence I1\;I2 in B|^(n+1) by A1,XBOOLE_0:def 3;
A11: <*C,I1,I2*> in 3-tuples_on the carrier of A by FINSEQ_2:139;
A12: rng <*C,I1,I2*> = {C,I1,I2} by FINSEQ_2:128;
A13: dom Den(In(3, dom the charact of A), A) = 3-tuples_on the carrier of A
  by Th47;
  {C,I1,I2} c= B|^n by A5,A6,A7,ZFMISC_1:133;
  then if-then-else(C,I1,I2) in X by A11,A12,A13;
  hence if-then-else(C,I1,I2) in B|^(n+1) by A1,XBOOLE_0:def 3;
A14: <*C,I1*> in 2-tuples_on the carrier of A by FINSEQ_2:137;
A15: rng <*C,I1*> = {C,I1} by FINSEQ_2:127;
A16: dom Den(In(4, dom the charact of A), A) = 2-tuples_on the carrier of A
  by Th48;
  {C,I1} c= B|^n by A5,A6,ZFMISC_1:32;
  then while(C,I1) in X by A14,A15,A16;
  hence thesis by A1,XBOOLE_0:def 3;
end;

theorem Th77:
  for A being ECIW-strict preIfWhileAlgebra
  for x being set, n being Nat st x in (ElementaryInstructions A)|^(n+1)
  holds x in (ElementaryInstructions A)|^n or x = EmptyIns A or
  (ex I1,I2 being Element of A st x = I1\;I2 &
  I1 in (ElementaryInstructions A)|^n & I2 in (ElementaryInstructions A)|^n) or
  (ex C,I1,I2 being Element of A st x = if-then-else(C,I1,I2) &
  C in (ElementaryInstructions A)|^n &
  I1 in (ElementaryInstructions A)|^n & I2 in (ElementaryInstructions A)|^n) or
  ex C,I being Element of A st x = while(C,I) &
  C in (ElementaryInstructions A)|^n & I in (ElementaryInstructions A)|^n
proof
  let A be ECIW-strict preIfWhileAlgebra;
  set B = ElementaryInstructions A;
  let x be set;
  let n be Nat;
  assume
A1: x in B|^(n+1);
  then reconsider I = x as Element of A;
  assume
A2: x nin B|^n;
  assume
A3: x <> EmptyIns A;
  assume
A4: not ex I1,I2 being Element of A st x = I1\;I2 & I1 in B|^n & I2 in B|^n;
  assume
A5: not ex C,I1,I2 being Element of A st x = if-then-else(C,I1,I2) &
  C in B|^n & I1 in B|^n & I2 in B|^n;
  B|^(n+1) = B|^n\/{Den(o,A).p where o is (Element of dom the charact of A),
  p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= B|^n}
  by Th19;
  then x in {Den(o,A).p where o is (Element of dom the charact of A),
  p is Element of (the carrier of A)*: p in dom Den(o,A) & rng p c= B|^n}
  by A1,A2,XBOOLE_0:def 3;
  then consider o being (Element of dom the charact of A),
  p being Element of (the carrier of A)* such that
A6: I = Den(o,A).p and
A7: p in dom Den(o,A) and
A8: rng p c= B|^n;
  reconsider no = o as Element of NAT;
  reconsider oo = Den(o,A) as Element of Operations A;
  len signature A = len the charact of A by UNIALG_1:def 4;
  then
A9: dom signature A = dom the charact of A by FINSEQ_3:29;
A10: len p = arity oo by A7,MARGREL1:def 25
    .= (signature A).no by A9,UNIALG_1:def 4
    .= ECIW-signature.o by Def27;
A11: 1 in Seg 2;
A12: 2 in Seg 2;
A13: 1 in Seg 3;
A14: 2 in Seg 3;
A15: 3 in Seg 3;
  per cases by Th55;
  suppose
A16: o = 1;
    then p = {} by A10,Th54;
    hence thesis by A3,A6,A16;
  end;
  suppose
A17: o = 2;
    then
A18: p = <*p.1,p.2*> by A10,Th54,FINSEQ_1:44;
A19: dom p = Seg 2 by A10,A17,Th54,FINSEQ_1:def 3;
    then
A20: p.1 in rng p by A11,FUNCT_1:def 3;
A21: p.2 in rng p by A12,A19,FUNCT_1:def 3;
    then reconsider I1 = p.1, I2 = p.2 as Element of A by A20;
    I = I1\;I2 by A6,A17,A18;
    hence thesis by A4,A8,A20,A21;
  end;
  suppose
A22: o = 3;
    then
A23: p = <*p.1,p.2,p.3*> by A10,Th54,FINSEQ_1:45;
A24: dom p = Seg 3 by A10,A22,Th54,FINSEQ_1:def 3;
    then
A25: p.1 in rng p by A13,FUNCT_1:def 3;
A26: p.2 in rng p by A14,A24,FUNCT_1:def 3;
A27: p.3 in rng p by A15,A24,FUNCT_1:def 3;
    then reconsider C = p.1, I1 = p.2, I2 = p.3 as Element of A by A25,A26;
    I = if-then-else(C,I1,I2) by A6,A22,A23;
    hence thesis by A5,A8,A25,A26,A27;
  end;
  suppose
A28: o = 4;
    then
A29: p = <*p.1,p.2*> by A10,Th54,FINSEQ_1:44;
A30: dom p = Seg 2 by A10,A28,Th54,FINSEQ_1:def 3;
    then
A31: p.1 in rng p by A11,FUNCT_1:def 3;
A32: p.2 in rng p by A12,A30,FUNCT_1:def 3;
    then reconsider I1 = p.1, I2 = p.2 as Element of A by A31;
    I = while(I1,I2) by A6,A28,A29;
    hence thesis by A8,A31,A32;
  end;
end;

theorem
  for A being Universal_Algebra for B being Subset of A
  holds Constants A c= B|^1
proof
  let A be Universal_Algebra;
  let B be Subset of A;
  let x be object;
  assume x in Constants A;
  then consider a being Element of A such that
A1: x = a and
A2: ex o being Element of Operations A st arity o = 0 & a in rng o;
  consider o being Element of Operations A such that
A3: arity o = 0 and
A4: a in rng o by A2;
  consider s being object such that
A5: s in dom o and
A6: a = o.s by A4,FUNCT_1:def 3;
  consider z being object such that
A7: z in dom the charact of A and
A8: o = (the charact of A).z by FUNCT_1:def 3;
  reconsider z as Element of dom the charact of A by A7;
A9: Den(z,A) = o by A8;
A10: s is Element of 0-tuples_on the carrier of A by A3,A5,MARGREL1:22;
  reconsider s as Element of (the carrier of A)* by A5;
  rng s c= B by A10;
  then
A11: x in {Den(r,A).p where r is (Element of dom the charact of A),
  p is Element of (the carrier of A)*: p in dom Den(r,A) & rng p c= B}
  by A1,A5,A6,A9;
  B|^0 = B by Th18;
  then B|^(0+1) = B \/ {Den(r,A).p where r is (Element of dom the charact of
  A), p is Element of (the carrier of A)*: p in dom Den(r,A) & rng p c= B}
  by Th19;
  hence thesis by A11,XBOOLE_0:def 3;
end;

theorem Th79:
  for A being preIfWhileAlgebra holds A is well_founded iff
  for I being Element of A ex n being Nat st I in (ElementaryInstructions A)|^n
     by Th30;

scheme StructInd{ A() -> well_founded ECIW-strict preIfWhileAlgebra,
  I() -> (Element of A()), P[set] }: P[I()]
provided
A1: for I being Element of A() st I in ElementaryInstructions A() holds P[I]
and
A2: P[EmptyIns A()] and
A3: for I1,I2 being Element of A() st P[I1] & P[I2] holds P[I1\;I2] and
A4: for C,I1,I2 being Element of A() st P[C] & P[I1] & P[I2]
holds P[if-then-else(C,I1,I2)] and
A5: for C,I being Element of A() st P[C] & P[I] holds P[while(C,I)]
proof
  set A = A();
A6: ex n being Nat st ( I() in (ElementaryInstructions A())|^n) by Th79;
  defpred Q[Nat] means for I being Element of A()
  st I in (ElementaryInstructions A())|^$1 holds P[I];
  (ElementaryInstructions A())|^0 = ElementaryInstructions A() by Th18;
  then
A7: Q[0] by A1;
A8: now
    let n be Nat;
    assume
A9: Q[n];
    thus Q[n+1]
    proof
      let I be Element of A();
      assume
A10:  I in (ElementaryInstructions A())|^(n+1);
      per cases by A10,Th77;
      suppose I in (ElementaryInstructions A)|^n;
        hence thesis by A9;
      end;
      suppose I = EmptyIns A;
        hence thesis by A2;
      end;
      suppose ex I1,I2 being Element of A st I = I1\;I2 &
        I1 in (ElementaryInstructions A)|^n &
        I2 in (ElementaryInstructions A)|^n;
        then consider I1,I2 being Element of A such that
A11:    I = I1\;I2 and
A12:    I1 in (ElementaryInstructions A)|^n and
A13:    I2 in (ElementaryInstructions A)|^n;
A14:    P[I1] by A9,A12;
        P[I2] by A9,A13;
        hence thesis by A3,A11,A14;
      end;
      suppose
        ex C,I1,I2 being Element of A st I = if-then-else(C,I1,I2) &
        C in (ElementaryInstructions A)|^n &
        I1 in (ElementaryInstructions A)|^n &
        I2 in (ElementaryInstructions A)|^n;
        then consider C,I1,I2 being Element of A such that
A15:    I = if-then-else(C,I1,I2) and
A16:    C in (ElementaryInstructions A)|^n and
A17:    I1 in (ElementaryInstructions A)|^n and
A18:    I2 in (ElementaryInstructions A)|^n;
A19:    P[C] by A9,A16;
A20:    P[I1] by A9,A17;
        P[I2] by A9,A18;
        hence thesis by A4,A15,A19,A20;
      end;
      suppose ex C,J being Element of A st I = while(C,J) &
        C in (ElementaryInstructions A)|^n &
        J in (ElementaryInstructions A)|^n;
        then consider C,J being Element of A such that
A21:    I = while(C,J) and
A22:    C in (ElementaryInstructions A)|^n and
A23:    J in (ElementaryInstructions A)|^n;
A24:    P[C] by A9,A22;
        P[J] by A9,A23;
        hence thesis by A5,A21,A24;
      end;
    end;
  end;
  for n being Nat holds Q[n] from NAT_1:sch 2(A7,A8);
  hence thesis by A6;
end;

begin :: Execution function

definition
  let A be preIfWhileAlgebra;
  let S be non empty set; :: states
  let f be Function of [:S, the carrier of A:], S;
  attr f is complying_with_empty-instruction means
  :
  Def28: for s being Element of S holds f.(s, EmptyIns A) = s;
  attr f is complying_with_catenation means
  : Def29:
  for s being Element of S
  for I1,I2 being Element of A holds f.(s,I1 \; I2) = f.(f.(s,I1),I2);
end;

definition
  let A be preIfWhileAlgebra;
  let S be non empty set; :: states
  let T be Subset of S;   :: true states
  let f be Function of [:S, the carrier of A:], S;
  pred f complies_with_if_wrt T means
   for s being Element of S for C, I1,I2 being Element of A holds
  (f.(s,C) in T implies f.(s,if-then-else(C,I1,I2)) = f.(f.(s,C),I1)) &
  (f.(s,C) nin T implies f.(s,if-then-else(C,I1,I2)) = f.(f.(s,C),I2));
  pred f complies_with_while_wrt T means
   for s being Element of S for C, I being Element of A holds
  (f.(s,C) in T implies f.(s,while(C,I)) = f.(f.(f.(s,C),I),while(C,I))) &
  (f.(s,C) nin T implies f.(s,while(C,I)) = f.(s,C));
end;

theorem
  for f being Function of [:S, the carrier of A:], S
  st f is complying_with_empty-instruction & f complies_with_if_wrt T
  for s being Element of S holds
  f.(s,C) nin T implies f.(s,if-then(C,I)) = f.(s,C)
proof
  let f be Function of [:S, the carrier of A:], S such that
A1: f is complying_with_empty-instruction and
A2: f complies_with_if_wrt T;
  let s be Element of S;
  assume f.(s,C) nin T;
  hence f.(s,if-then(C,I)) = f.(f.(s,C),EmptyIns A) by A2
    .= f.(s,C) by A1;
end;

theorem Th81:
  pr1(S, the carrier of A) is complying_with_empty-instruction &
  pr1(S, the carrier of A) is complying_with_catenation &
  pr1(S, the carrier of A) complies_with_if_wrt T &
  pr1(S, the carrier of A) complies_with_while_wrt T
proof
  set f = pr1(S, the carrier of A);
  thus
  for s being Element of S holds f.(s, EmptyIns A) = s by FUNCT_3:def 4;
  hereby
    let s be Element of S;
    let I1,I2 be Element of A;
    thus f.(s,I1 \; I2) = s by FUNCT_3:def 4
      .= f.(s,I1) by FUNCT_3:def 4
      .= f.(f.(s,I1),I2) by FUNCT_3:def 4;
  end;
  hereby
    let s be Element of S;
    let C, I1,I2 be Element of A;
    f.(s,if-then-else(C,I1,I2)) = s by FUNCT_3:def 4
      .= f.(s,C) by FUNCT_3:def 4;
    hence
    (f.(s,C) in T implies f.(s,if-then-else(C,I1,I2)) = f.(f.(s,C),I1))
    & (f.(s,C) nin T implies f.(s,if-then-else(C,I1,I2)) = f.(f.(s,C),I2))
    by FUNCT_3:def 4;
  end;
  let s be Element of S;
  let C, I be Element of A;
  f.(s,C) = s by FUNCT_3:def 4;
  hence thesis by FUNCT_3:def 4;
end;

definition
  let A be preIfWhileAlgebra;
  let S be non empty set; :: states
  let T be Subset of S;   :: true states
  mode ExecutionFunction of A,S,T -> Function of [:S, the carrier of A:], S
    means
    : Def32:
    it is complying_with_empty-instruction &
    it is complying_with_catenation & it complies_with_if_wrt T &
    it complies_with_while_wrt T;
  existence
  proof
    take pr1(S, the carrier of A);
    thus thesis by Th81;
  end;
end;

registration
  let A be preIfWhileAlgebra;
  let S be non empty set; :: states
  let T be Subset of S;   :: true states
  cluster -> complying_with_empty-instruction complying_with_catenation
    for ExecutionFunction of A,S,T;
  coherence by Def32;
end;

definition
  let A be preIfWhileAlgebra;
  let I be Element of A;
  let S be non empty set; :: states
  let s be Element of S;
  let T be Subset of S;   :: true states
  let f be ExecutionFunction of A, S, T;

:: iteration of I started in s terminates wrt f
  pred f iteration_terminates_for I,s means
   ex r being non empty FinSequence of S st r.1 = s & r.len r nin T &
  for i being Nat st 1 <= i & i < len r holds r.i in T & r.(i+1) = f.(r.i, I);
end;

definition
  let A be preIfWhileAlgebra;
  let I be Element of A;
  let S be non empty set; :: states
  let s be Element of S;
  let T be Subset of S;   :: true states
  let f be ExecutionFunction of A, S, T;
  func iteration-degree(I,s,f) -> R_eal means
  :
  Def34: ex r being non empty FinSequence of S st
  it = (len r)-1 & r.1 = s & r.len r nin T &
  for i being Nat st 1 <= i & i < len r holds r.i in T & r.(i+1) = f.(r.i, I)
  if f iteration_terminates_for I,s otherwise it = +infty;
  correctness
  proof
A1: now
      assume f iteration_terminates_for I,s;
      then consider r being non empty FinSequence of S such that
A2:   r.1 = s and
A3:   r.len r nin T and
A4:   for i being Nat st 1 <= i & i < len r holds r.i in T & r.(i+1) = f.(
      r.i, I);
      reconsider x = (len r)-1 as R_eal by XXREAL_0:def 1;
      take x, r;
      thus x = (len r)-1 & r.1 = s & r.len r nin T &
      for i being Nat st 1 <= i & i < len r
      holds r.i in T & r.(i+1) = f.(r.i, I) by A2,A3,A4;
    end;
    now
      let d1, d2 be R_eal;
      given r1 being non empty FinSequence of S such that
A5:   d1 = (len r1)-1 and
A6:   r1.1 = s and
A7:   r1.len r1 nin T and
A8:   for i being Nat st 1 <= i & i < len r1 holds r1.i in T & r1.(i+1) =
      f.(r1.i, I);
      given r2 being non empty FinSequence of S such that
A9:   d2 = (len r2)-1 and
A10:  r2.1 = s and
A11:  r2.len r2 nin T and
A12:  for i being Nat st 1 <= i & i < len r2 holds r2.i in T & r2.(i+1) =
      f.(r2.i, I);
      defpred P[Nat] means
      $1 < len r1 implies $1 < len r2 & r1.($1+1) = r2.($1+1);
A13:  P[0] by A6,A10;
A14:  now
        let i be Nat;
        assume
A15:    P[i];
        thus P[i+1]
        proof
          assume
A16:      i+1 < len r1;
A17:      1 <= i+1 by NAT_1:11;
          then
A18:      r1.(i+1+1) = f.(r1.(i+1), I) by A8,A16;
A19:      r1.(i+1) in T by A8,A16,A17;
          i+1 <= len r2 by A15,A16,NAT_1:13;
          hence i+1 < len r2 by A11,A15,A16,A19,NAT_1:13,XXREAL_0:1;
          hence r1.(i+1+1) = r2.(i+1+1) by A12,A15,A16,A17,A18,NAT_1:13;
        end;
      end;
A20:  for i being Nat holds P[i] from NAT_1:sch 2(A13,A14);
      consider i being Nat such that
A21:  len r1 = i+1 by NAT_1:6;
      reconsider i as Element of NAT by ORDINAL1:def 12;
      i < len r1 by A21,NAT_1:13;
      then
A22:  r1.len r1 = r2.len r1 by A20,A21;
A23:  1 <= len r1 by A21,NAT_1:11;
A24:  len r1 <= len r2 by A20;
      len r2 <= len r1 by A7,A12,A22,A23;
      hence d1 = d2 by A5,A9,A24,XXREAL_0:1;
    end;
    hence thesis by A1;
  end;
end;

reserve f for ExecutionFunction of A,S,T;

theorem
  f iteration_terminates_for I,s iff iteration-degree(I,s,f) < +infty
proof
  hereby
    assume f iteration_terminates_for I,s;
    then consider r being non empty FinSequence of S such that
A1: iteration-degree(I,s,f) = (len r)-1 and r.1 = s
    and r.len r nin T
    and for i being Nat st 1 <= i & i < len r holds r.i in T & r.(i+1) = f.(
    r.i, I)
    by Def34;
    (len r)-1 in REAL by XREAL_0:def 1;
    hence iteration-degree(I,s,f) < +infty by A1,XXREAL_0:9;
  end;
  thus thesis by Def34;
end;

theorem Th83:
  s nin T implies f iteration_terminates_for I,s & iteration-degree(I,s,f) = 0
proof
  assume
A1: s nin T;
  set r = <*s*>;
A2: r.1 = s;
A3: len r = 1 by FINSEQ_1:40;
A4: for i being Nat st 1 <= i & i < len r
  holds r.i in T & r.(i+1) = f.(r.i, I) by FINSEQ_1:40;
A5: 1-1 = 0.;
  thus f iteration_terminates_for I,s
  proof
    take <*s*>;
    thus thesis by A1,A2,FINSEQ_1:40;
  end;
  hence thesis by A1,A2,A3,A4,A5,Def34;
end;

theorem
  s in T implies
  (f iteration_terminates_for I,s iff f iteration_terminates_for I, f.(s,I)) &
  iteration-degree(I,s,f) = 1.+iteration-degree(I,f.(s,I),f)
proof
  assume
A1: s in T;
  thus
A2: f iteration_terminates_for I,s iff f iteration_terminates_for I, f.(s,I)
  proof
    thus f iteration_terminates_for I,s implies
    f iteration_terminates_for I, f.(s,I)
    proof
      given r being non empty FinSequence of S such that
A3:   r.1 = s and
A4:   r.len r nin T and
A5:   for i being Nat st 1 <= i & i < len r
      holds r.i in T & r.(i+1) = f.(r.i, I);
      consider r1 being (Element of S), q being FinSequence of S such that
      r1 = r.1 and
A6:   r = <*r1*>^q by FINSEQ_3:102;
A7:   len r = 1+len q by A6,FINSEQ_5:8;
      then reconsider q as non empty FinSequence of S by A1,A3,A4;
      len r >= 1 by A7,NAT_1:11;
      then
A8:   1 < len r by A1,A3,A4,XXREAL_0:1;
A9:   len q >= 0+1 by NAT_1:13;
      take q;
A10:  len <*r1*> = 1 by FINSEQ_1:40;
      1 in dom q by A9,FINSEQ_3:25;
      hence q.1 = r.(1+1) by A6,A10,FINSEQ_1:def 7
        .= f.(s,I) by A3,A5,A8;
      len q in dom q by A9,FINSEQ_3:25;
      hence q.len q nin T by A4,A6,A7,A10,FINSEQ_1:def 7;
      let i be Nat;
      assume that
A11:  1 <= i and
A12:  i < len q;
A13:  i in dom q by A11,A12,MSUALG_8:1;
A14:  1 <= i+1 by NAT_1:11;
A15:  i+1 < len r by A7,A12,XREAL_1:6;
A16:  i+1 in dom q by A11,A12,MSUALG_8:1;
A17:  r.(i+1) = q.i by A6,A10,A13,FINSEQ_1:def 7;
      r.(i+1+1) = q.(i+1) by A6,A10,A16,FINSEQ_1:def 7;
      hence thesis by A5,A14,A15,A17;
    end;
    given q being non empty FinSequence of S such that
A18: q.1 = f.(s,I) and
A19: q.len q nin T and
A20: for i being Nat st 1 <= i & i < len q
    holds q.i in T & q.(i+1) = f.(q.i, I);
    take r = <*s*>^q;
A21: len <*s*> = 1 by FINSEQ_1:40;
    thus
A22: r.1 = s by FINSEQ_1:41;
A23: len r = 1+len q by FINSEQ_5:8;
A24: 0+1 <= len q by NAT_1:13;
    then len q in dom q by FINSEQ_3:25;
    hence r.len r nin T by A19,A21,A23,FINSEQ_1:def 7;
    let i be Nat;
    assume that
A25: 1 <= i and
A26: i < len r;
    consider j being Nat such that
A27: i = 1+j by A25,NAT_1:10;
    per cases;
    suppose
A28:  j = 0;
      1 in dom q by A24,FINSEQ_3:25;
      hence thesis by A1,A18,A21,A22,A27,A28,FINSEQ_1:def 7;
    end;
    suppose j > 0;
      then
A29:  j >= 0+1 by NAT_1:13;
A30:  j < len q by A23,A26,A27,XREAL_1:6;
A31:  j in dom q by A29,A30,MSUALG_8:1;
A32:  j+1 in dom q by A29,A30,MSUALG_8:1;
A33:  r.(j+1) = q.j by A21,A31,FINSEQ_1:def 7;
      r.(j+1+1) = q.(j+1) by A21,A32,FINSEQ_1:def 7;
      hence thesis by A20,A27,A29,A30,A33;
    end;
  end;
  per cases by A2;
  suppose
A34: not f iteration_terminates_for I,s;
    then
A35: iteration-degree(I,s,f) = +infty by Def34;
    iteration-degree(I,f.(s,I),f) = +infty by A2,A34,Def34;
    hence thesis by A35,XXREAL_3:def 2;
  end;
  suppose
 f iteration_terminates_for I,f.(s,I);
    then consider q being non empty FinSequence of S such that
A36: iteration-degree(I,f.(s,I),f) = (len q)-1 and
A37: q.1 = f.(s,I) and
A38: q.len q nin T and
A39: for i being Nat st 1 <= i & i < len q
    holds q.i in T & q.(i+1) = f.(q.i, I) by Def34;
    set r = <*s*>^q;
A40: len <*s*> = 1 by FINSEQ_1:40;
A41: r.1 = s by FINSEQ_1:41;
A42: len r = 1+len q by FINSEQ_5:8;
    1+((len q)-1) = len q;
    then
A43: (len r)-1 = 1.+iteration-degree(I,f.(s,I),f) by A36,A42,XXREAL_3:def 2;
A44: 0+1 <= len q by NAT_1:13;
    then len q in dom q by FINSEQ_3:25;
    then
A45: r.len r nin T by A38,A40,A42,FINSEQ_1:def 7;
    now
      let i be Nat;
      assume that
A46:  1 <= i and
A47:  i < len r;
      consider j being Nat such that
A48:  i = 1+j by A46,NAT_1:10;
      per cases;
      suppose
A49:    j = 0;
        1 in dom q by A44,FINSEQ_3:25;
        hence r.i in T & r.(i+1) = f.(r.i,I)
        by A1,A37,A40,A41,A48,A49,FINSEQ_1:def 7;
      end;
      suppose j > 0;
        then
A50:    j >= 0+1 by NAT_1:13;
A51:    j < len q by A42,A47,A48,XREAL_1:6;
A52:    j in dom q by A50,A51,MSUALG_8:1;
A53:    j+1 in dom q by A50,A51,MSUALG_8:1;
A54:    r.(j+1) = q.j by A40,A52,FINSEQ_1:def 7;
        r.(j+1+1) = q.(j+1) by A40,A53,FINSEQ_1:def 7;
        hence r.i in T & r.(i+1) = f.(r.i,I) by A39,A48,A50,A51,A54;
      end;
    end;
    hence thesis by A2,A41,A43,A45,Def34;
  end;
end;

theorem
  iteration-degree(I,s,f) >= 0 proof per cases;
  suppose not f iteration_terminates_for I,s;
    hence thesis by Def34;
  end;
  suppose f iteration_terminates_for I,s;
    then consider r being non empty FinSequence of S such that
A1: iteration-degree(I,s,f) = (len r)-1 and r.1 = s
    and r.len r nin T
    and for i being Nat st 1 <= i & i < len r holds r.i in T & r.(i+1) = f.(
    r.i, I)
    by Def34;
    ex i being Nat st len r = i+1 by NAT_1:6;
    hence thesis by A1;
  end;
end;

scheme Termination {A() -> preIfWhileAlgebra, I() -> (Element of A()),
  S() -> non empty set, s() -> (Element of S()), T() -> Subset of S(),
  f() -> ExecutionFunction of A(),S(),T(), F(set) -> Nat, P[set] }:
  f() iteration_terminates_for I(),s()
provided
A1: s() in T() iff P[s()] and
A2: for s being Element of S() st P[s]
holds (P[f().(s,I())] iff f().(s,I()) in T()) & F(f().(s,I())) < F(s)
proof
  per cases;
  suppose s() nin T();
    hence thesis by Th83;
  end;
  suppose
A3: s() in T();
    deffunc F(set,set) = f().(In($2,S()),I());
    consider f being sequence of S() such that
A4: f.0 = s() and
A5: for i being Nat holds f.(i+1) = F(i,f.i) from NAT_1:sch 12;
    defpred Q[Nat] means ex i being Element of NAT st F(f.i) = $1;
    F(f.0) in NAT by ORDINAL1:def 12;
    then
A6: ex j being Nat st Q[j];
    consider j being Nat such that
A7: Q[j] & for i being Nat st Q[i] holds j <= i from NAT_1:sch 5(A6);
    consider i0 being Element of NAT such that
A8: F(f.i0) = j by A7;
    defpred R[Nat] means not P[f.$1];
    In(f.i0,S()) = f.i0;
    then f.(i0+1) = f().(f.i0,I()) by A5;
    then P[f.i0] implies F(f.(i0+1)) < j by A2,A8;
    then
A9: ex i being Nat st R[i] by A7;
    consider j being Nat such that
A10: R[j] & for i being Nat st R[i] holds j <= i from NAT_1:sch 5(A9);
    deffunc G(Nat) = f.($1-'1);
    consider p being FinSequence of S() such that
A11: len p = j+1 & for i being Nat st i in dom p holds p.i = G(i)
    from FINSEQ_2:sch 1;
A12: dom p = Seg(j+1) by A11,FINSEQ_1:def 3;
    reconsider p as non empty FinSequence of S() by A11;
    take p;
A13: 1 <= j+1 by NAT_1:11;
    then 1 in Seg(j+1);
    hence p.1 = G(1) by A11,A12
      .= s() by A4,XREAL_1:232;
    len p in Seg(j+1) by A11,A13;
    then
A14: p.len p = G(j+1) by A11,A12
      .= f.j by NAT_D:34;
    j > 0 by A1,A3,A4,A10;
    then j >= 0+1 by NAT_1:13;
    then consider j9 being Nat such that
A15: j = 1+j9 by NAT_1:10;
    reconsider j9 as Element of NAT by ORDINAL1:def 12;
A16: f.j = f().(In(f.j9,S()),I()) by A5,A15;
    j9 < j by A15,NAT_1:13;
    then
    P[f.j9] by A10;
    hence p.len p nin T() by A2,A10,A14,A16;
    let i be Nat;
    assume that
A18: 1 <= i and
A19: i < len p;
A20: i+1 >= 1 by A18,NAT_1:13;
A21: i+1 <= len p by A19,NAT_1:13;
A22: i in Seg(j+1) by A11,A18,A19;
A23: i+1 in Seg(j+1) by A11,A20,A21;
A24: p.i = G(i) by A11,A12,A22;
A25: p.(i+1) = G(i+1) by A11,A12,A23;
    consider i9 being Nat such that
A26: i = 1+i9 by A18,NAT_1:10;
    reconsider i9 as Element of NAT by ORDINAL1:def 12;
    i <= j by A11,A19,NAT_1:13;
    then
A27: i9 < j by A26,NAT_1:13;
    then
A28: P[f.i9] by A10;
A29: i-'1 = i9 by A26,NAT_D:34;
A30: i+1-'1 = i by NAT_D:34;
A31: In(f.i9,S()) = f.i9;
    now
      assume i9 <> 0;
      then i9 >= 0+1 by NAT_1:13;
      then consider i99 being Nat such that
A32:  i9 = 1+i99 by NAT_1:10;
      reconsider i99 as Element of NAT by ORDINAL1:def 12;
      i99 <= i9 by A32,NAT_1:11;
      then i99 < j by A27,XXREAL_0:2;
      then
A33:  P[f.i99] by A10;
      f.i9 = F(i99,f.i99) by A5,A32;
      hence p.i in T() by A2,A24,A28,A29,A33;
    end;
    hence thesis by A3,A4,A5,A24,A25,A26,A29,A30,A31;
  end;
end;

scheme Termination2 {A() -> preIfWhileAlgebra, I() -> (Element of A()),
  S() -> non empty set, s() -> (Element of S()), T() -> Subset of S(),
  f() -> ExecutionFunction of A(),S(),T(), F(set) -> Nat, P,R[set] }:
  f() iteration_terminates_for I(),s()
provided
A1: P[s()] and
A2: s() in T() iff R[s()] and
A3: for s being Element of S() st P[s] & s in T() & R[s]
holds P[f().(s, I())] & (R[f().(s,I())] iff f().(s,I()) in T()) &
F(f().(s,I())) < F(s)
proof
  per cases;
  suppose s() nin T();
    hence thesis by Th83;
  end;
  suppose
A4: s() in T();
    deffunc F(set,set) = f().(In($2,S()),I());
    consider f being sequence of S() such that
A5: f.0 = s() and
A6: for i being Nat holds f.(i+1) = F(i,f.i) from NAT_1:sch 12;
    defpred Q[Nat] means ex i being Element of NAT st F(f.i) = $1;
    F(f.0) in NAT by ORDINAL1:def 12;
    then
A7: ex j being Nat st Q[j];
    consider j being Nat such that
A8: Q[j] & for i being Nat st Q[i] holds j <= i from NAT_1:sch 5(A7);
    consider i0 being Element of NAT such that
A9: F(f.i0) = j by A8;
    defpred notR[Nat] means not (P[f.$1] & f.$1 in T() & R[f.$1]);
    In(f.i0,S()) = f.i0;
    then f.(i0+1) = f().(f.i0,I()) by A6;
    then not notR[i0] implies F(f.(i0+1)) < j by A3,A9;
    then
A10: ex i being Nat st notR[i] by A8;
    consider j being Nat such that
A11: notR[j] & for i being Nat st notR[i] holds j <= i from NAT_1:sch 5(A10
    );
    deffunc G(Nat) = f.($1-'1);
    consider p being FinSequence of S() such that
A12: len p = j+1 & for i being Nat st i in dom p holds p.i = G(i)
    from FINSEQ_2:sch 1;
A13: dom p = Seg(j+1) by A12,FINSEQ_1:def 3;
    reconsider p as non empty FinSequence of S() by A12;
    take p;
A14: 1 <= j+1 by NAT_1:11;
    then 1 in Seg(j+1);
    hence p.1 = G(1) by A12,A13
      .= s() by A5,XREAL_1:232;
    len p in Seg(j+1) by A12,A14;
    then
A15: p.len p = G(j+1) by A12,A13
      .= f.j by NAT_D:34;
    j > 0 by A1,A2,A4,A5,A11;
    then j >= 0+1 by NAT_1:13;
    then consider j9 being Nat such that
A16: j = 1+j9 by NAT_1:10;
    reconsider j9 as Element of NAT by ORDINAL1:def 12;
A17: f.j = f().(In(f.j9,S()),I()) by A6,A16;
A18: j9 < j by A16,NAT_1:13;
    then
A19: R[f.j9] by A11;
A20: f.j9 in T() by A11,A18;
    P[f.j9] by A11,A18;
    hence p.len p nin T() by A3,A11,A15,A17,A19,A20;
    let i be Nat;
    assume that
A22: 1 <= i and
A23: i < len p;
A24: i+1 >= 1 by A22,NAT_1:13;
A25: i+1 <= len p by A23,NAT_1:13;
A26: i in Seg(j+1) by A12,A22,A23;
A27: i+1 in Seg(j+1) by A12,A24,A25;
A28: p.i = G(i) by A12,A13,A26;
A29: p.(i+1) = G(i+1) by A12,A13,A27;
    consider i9 being Nat such that
A30: i = 1+i9 by A22,NAT_1:10;
    reconsider i9 as Element of NAT by ORDINAL1:def 12;
    i <= j by A12,A23,NAT_1:13;
    then
A31: i9 < j by A30,NAT_1:13;
A32: i-'1 = i9 by A30,NAT_D:34;
A33: i+1-'1 = i by NAT_D:34;
    In(f.i9,S()) = f.i9;
    hence thesis by A6,A11,A28,A29,A30,A31,A32,A33;
  end;
end;

theorem Th86:
  for r being non empty FinSequence of S st r.1 = f.(s,C) & r.len r nin T &
  for i being Nat st 1 <= i & i < len r
  holds r.i in T & r.(i+1) = f.(r.i, I \; C) holds f.(s, while(C,I)) = r.len r
proof
A1: f complies_with_while_wrt T by Def32;
  let r be non empty FinSequence of S;
  assume
A2: r.1 = f.(s,C);
  assume
A3: r.len r nin T;
  assume
A4: for i being Nat st 1 <= i & i < len r
  holds r.i in T & r.(i+1) = f.(r.i, I \; C);
  defpred P[Nat] means (len r)-$1 in dom r implies
  for q being Element of S st f.(q,C) = r.((len r)-$1)
  holds f.(q, while(C,I)) = r.len r;
A5: P[0] by A1,A3;
A6: for i being Nat st P[i] holds P[i+1]
  proof
    let i be Nat such that
A7: P[i] and
A8: (len r)-(i+1) in dom r;
    reconsider j = (len r)-(i+1) as Element of NAT by A8;
A9: j+1+i = len r;
A10: 1 <= j+1 by NAT_1:11;
A11: j+1 <= len r by A9,NAT_1:11;
A12: 1 <= j by A8,FINSEQ_3:25;
A13: j < len r by A11,NAT_1:13;
    then
A14: r.(j+1) = f.(r.j, I\;C) by A4,A12;
    let q be Element of S;
    assume
A15: f.(q,C) = r.((len r)-(i+1));
    then
A16: f.(q,C) in T by A4,A12,A13;
    r.(j+1) = f.(f.(f.(q,C), I), C) by A14,A15,Def29;
    then f.(f.(f.(q,C), I), while(C,I)) = r.len r by A7,A10,A11,FINSEQ_3:25;
    hence thesis by A1,A16;
  end;
A17: for i being Nat holds P[i] from NAT_1:sch 2(A5,A6);
A18: len r >= 0+1 by NAT_1:13;
  then consider i being Nat such that
A19: len r = 1+i by NAT_1:10;
  P[i] by A17;
  hence thesis by A2,A18,A19,FINSEQ_3:25;
end;

theorem Th87:
  for I being Element of A for s being Element of S holds
  not f iteration_terminates_for I,s iff (curry' f).I orbit s c= T
proof
  let I be Element of A;
  let s be Element of S;
  set g = (curry' f).I;
  hereby
    assume
A1: not f iteration_terminates_for I,s;
    thus g orbit s c= T
    proof
      let x be object;
      assume x in g orbit s;
      then
A2:   ex n being Element of NAT st ( x = iter(g, n).s)&( s in dom iter(g, n));
      defpred P[Nat] means iter(g,$1).s nin T;
      assume x nin T;
      then
A3:   ex n being Nat st P[n] by A2;
      consider n being Nat such that
A4:   P[n] & for m being Nat st P[m] holds n <= m from NAT_1:sch 5(A3);
      deffunc F(Nat) = iter(g,$1-'1).s;
      consider r being FinSequence such that
A5:   len r = n+1 & for k being Nat st k in dom r holds r.k = F(k)
      from FINSEQ_1:sch 2;
      rng r c= S
      proof
        let a be object;
        assume a in rng r;
        then consider b being object such that
A6:     b in dom r and
A7:     a = r.b by FUNCT_1:def 3;
        reconsider b as Element of NAT by A6;
        r.b = iter(g,b-'1).s by A5,A6;
        hence thesis by A7;
      end;
      then reconsider r as non empty FinSequence of S
      by A5,FINSEQ_1:def 4;
A8:   1 <= n+1 by NAT_1:11;
      then
A9:   1 in dom r by A5,FINSEQ_3:25;
A10:  n+1 in dom r by A5,A8,FINSEQ_3:25;
A11:  1-'1 = 0 by XREAL_1:232;
A12:  n+1-'1 = n by NAT_D:34;
A13:  iter(g,0) = id S by FUNCT_7:84;
      r.1 = F(1) by A5,A9;
      then
A14:  r.1 = s by A11,A13;
A15:  r.len r nin T by A4,A5,A10,A12;
      now
        let i be Nat such that
A16:    1 <= i and
A17:    i < len r;
        consider j being Nat such that
A18:    i = 1+j by A16,NAT_1:10;
        reconsider j as Element of NAT by ORDINAL1:def 12;
A19:    i-'1 = j by A18,NAT_D:34;
A20:    (i+1)-'1 = i by NAT_D:34;
A21:    dom curry' f = the carrier of A by FUNCT_2:def 1;
        dom g = S by FUNCT_2:def 1;
        then
A22:    g.(iter(g,j).s) = f.(iter(g,j).s, I) by A21,FUNCT_5:34;
A23:    iter(g,i) = g*iter( g,j) by A18,FUNCT_7:71;
A24:    1 <= i+1 by A16,NAT_1:13;
A25:    i+1 <= n+1 by A5,A17,NAT_1:13;
A26:    i-'1 < n by A5,A17,A18,A19,XREAL_1:6;
A27:    i in dom r by A16,A17,FINSEQ_3:25;
A28:    i+1 in dom r by A5,A24,A25,FINSEQ_3:25;
A29:    r.i = iter(g,i-'1).s by A5,A27;
        r.(i+1) = iter(g,i).s by A5,A20,A28;
        hence r.i in T & r.(i+1) = f.(r.i, I) by A4,A19,A22,A23,A26,A29,
FUNCT_2:15;
      end;
      hence contradiction by A1,A14,A15;
    end;
  end;
  assume
A30: (curry' f).I orbit s c= T;
  given r being non empty FinSequence of S such that
A31: r.1 = s and
A32: r.len r nin T and
A33: for i being Nat st 1 <= i & i < len r
  holds r.i in T & r.(i+1) = f.(r.i, I);
  defpred P[Nat] means $1+1 <= len r implies r.($1+1) in (curry' f).I orbit s;
  dom g = S by FUNCT_2:def 1;
  then
A34: P[0] by A31,Th6;
A35: for i being Nat st P[i] holds P[i+1]
  proof
    let i be Nat such that
A36: P[i] and
A37: i+1+1 <= len r;
A38: 1 <= i+1 by NAT_1:11;
A39: i+1 < len r by A37,NAT_1:13;
    then i+1 in dom r by A38,FINSEQ_3:25;
    then
A40: r.(i+1) in rng r by FUNCT_1:3;
    dom f = [:S, the carrier of A:] by FUNCT_2:def 1;
    then
A41: [r.(i+1), I] in dom f by A40,ZFMISC_1:87;
    consider n being Element of NAT such that
A42: r.(i+1) = iter((curry' f).I,n).s and s in dom iter((curry' f).I,n)
    by A36,A37,NAT_1:13;
A43: r.(i+1+1) = f.(r.(i+1), I) by A33,A38,A39
      .= (curry' f).I.(r.(i+1)) by A41,FUNCT_5:22
      .= (g*iter(g,n)).s by A42,FUNCT_2:15
      .= iter((curry' f).I,n+1).s by FUNCT_7:71;
    dom iter(g,n+1) = S by FUNCT_2:def 1;
    hence r.(i+1+1) in g orbit s by A43;
  end;
  consider i being Nat such that
A44: len r = i+1 by NAT_1:6;
  for n being Nat holds P[n] from NAT_1:sch 2(A34,A35);
  then r.(i+1) in g orbit s by A44;
  hence contradiction by A30,A32,A44;
end;

scheme InvariantSch {A() -> preIfWhileAlgebra, C,I() -> (Element of A()),
  S() -> non empty set, s() -> (Element of S()), T() -> Subset of S(),
  f() -> ExecutionFunction of A(),S(),T(), P,R[set] }:
  P[f().(s(),while(C(),I()))] & not R[f().(s(),while(C(),I()))]
provided
A1: P[s()] and
A2: f() iteration_terminates_for I()\;C(), f().(s(),C()) and
A3: for s being Element of S() st P[s] & s in T() & R[s] holds P[f().(s,I())]
and
A4: for s being Element of S() st P[s] holds
P[f().(s,C())] & (f().(s,C()) in T() iff R[f().(s,C())])
proof
  consider r being non empty FinSequence of S() such that
A5: r.1 = f().(s(),C()) and
A6: r.len r nin T() and
A7: for i being Nat st 1 <= i & i < len r holds r.i in T() & r.(i+1) = f
  ().(r.i, I()\;C())
  by A2;
A8: f().(s(), while(C(),I())) = r.len r by A5,A6,A7,Th86;
  defpred Q[Nat] means $1+1 in dom r implies P[r.($1+1)] &
  ($1+1 < len r implies R[r.($1+1)]) &
  ex q being Element of S() st P[q] & r.($1+1) = f().(q,C());
  0+1 < len r implies r.(0+1) in T() by A7;
  then
A9: Q[0] by A1,A4,A5;
A10: for n being Nat st Q[n] holds Q[n+1]
  proof
    let n be Nat;
    assume
A11: Q[n];
    assume
A12: n+1+1 in dom r;
    then
A13: n+1+1 <= len r by FINSEQ_3:25;
A14: n+1+1 >= 1 by NAT_1:11;
A15: n+1 >= 1 by NAT_1:11;
A16: n+1 < len r by A13,NAT_1:13;
    then
A17: n+1 in dom r by A15,FINSEQ_3:25;
A18: r.(n+1) in T() by A7,A15,A16;
A19: r.(n+1+1) = f().(r.(n+1), I()\;C( )) by A7,A15,A16;
    reconsider q1 = r.(n+1), q2 = r.(n+1+1) as Element of S()
    by A12,A17,DTCONSTR:2;
    reconsider q3 = f().(q1,I()) as Element of S();
A20: q2 = f().(q3, C()) by A19,Def29;
A21: P[q3] by A3,A11,A15,A16,A18,FINSEQ_3:25;
    hence P[r.(n+1+1)] by A4,A20;
    hereby
      assume n+1+1 < len r;
      then r.(n+1+1) in T() by A7,A14;
      hence R[r.(n+1+1)] by A4,A20,A21;
    end;
    take q3;
    thus thesis by A3,A11,A15,A16,A18,A19,Def29,FINSEQ_3:25;
  end;
A22: for n being Nat holds Q[n] from NAT_1:sch 2(A9,A10);
A23: len r >= 0+1 by NAT_1:13;
  then consider j being Nat such that
A24: len r = 1+j by NAT_1:10;
A25: j+1 in dom r by A23,A24,FINSEQ_3:25;
  hence P[f().(s(),while(C(),I()))] by A8,A22,A24;
  ex q being Element of S() st P[q] & r.(j+1) = f().(q, C()) by A22,A25;
  hence thesis by A4,A6,A8,A24;
end;

scheme coInvariantSch {A() -> preIfWhileAlgebra, C,I() -> (Element of A()),
  S() -> non empty set, s() -> (Element of S()), T() -> Subset of S(),
  f() -> ExecutionFunction of A(),S(),T(), P[set] }: P[s()]
provided
A1: P[f().(s(),while(C(),I()))] and
A2: f() iteration_terminates_for I()\;C(), f().(s(),C()) and
A3: for s being Element of S() st P[f().(f().(s,C()),I())] & f().(s,C()) in T()
holds P[f().(s,C())] and
A4: for s being Element of S() st P[f().(s,C())] holds P[s]
proof
  consider r being non empty FinSequence of S() such that
A5: r.1 = f().(s(),C()) and
A6: r.len r nin T() and
A7: for i being Nat st 1 <= i & i < len r holds r.i in T() & r.(i+1) = f
  ().(r.i, I()\;C())
  by A2;
  defpred Q[Nat] means (len r)-$1 in dom r implies P[r.((len r)-$1)];
  defpred R[Nat] means $1+1 in dom r implies
  ex q being Element of S() st r.($1+1) = f().(q,C());
A8: R[0] by A5;
A9: for n being Nat st R[n] holds R[n+1]
  proof
    let n be Nat;
    assume R[n];
    assume n+1+1 in dom r;
    then
A10: n+1+1 <= len r by FINSEQ_3:25;
A11: n+1 >= 1 by NAT_1:11;
A12: n+1 < len r by A10,NAT_1:13;
    then
A13: r.(n+1) in T() by A7,A11;
A14: r.(n+1+1) = f().(r.(n+1), I()\;C() ) by A7,A11,A12;
    reconsider q1 = r.(n+1) as Element of S() by A13;
    reconsider q3 = f().(q1,I()) as Element of S();
    take q3;
    thus thesis by A14,Def29;
  end;
A15: Q[0] by A1,A5,A6,A7,Th86;
A16: for n being Nat st Q[n] holds Q[n+1]
  proof
    let n be Nat;
    assume
A17: Q[n];
    assume
A18: (len r)-(n+1) in dom r;
    then reconsider j = (len r)-(n+1) as Element of NAT;
A19: j >= 1 by A18,FINSEQ_3:25;
    n+1 >= 0+1 by NAT_1:13;
    then j <= (len r)-1 by XREAL_1:10;
    then
A20: j+1 <= (len r)-1+1 by XREAL_1:6;
A21: 1 <= 1+j by NAT_1:11;
A22: j < len r by A20,NAT_1:13;
A23: j+1 in dom r by A20,A21,FINSEQ_3:25;
A24: r.j in T() by A7,A19,A22;
A25: r.(j+1) = f().(r.j, I()\;C()) by A7,A19,A22;
    reconsider q1 = r.j, q2 = r.(j+1) as Element of S() by A23,A24,DTCONSTR:2;
    reconsider q9 = f().(q1, I()) as Element of S();
    consider j9 being Nat such that
A26: j = 1+j9 by A19,NAT_1:10;
    for n being Nat holds R[n] from NAT_1:sch 2(A8,A9);
    then consider qq being Element of S() such that
A27: r.(j9+1) = f().(qq,C()) by A18,A26;
    q2 = f().(q9, C()) by A25,Def29;
    then P[f().(f().(qq,C()),I())] by A4,A17,A20,A21,A26,A27,FINSEQ_3:25;
    hence thesis by A3,A7,A19,A22,A26,A27;
  end;
A28: for n being Nat holds Q[n] from NAT_1:sch 2(A15,A16);
A29: len r >= 0+1 by NAT_1:13;
  then consider j being Nat such that
A30: len r = 1+j by NAT_1:10;
  (len r)-j in dom r by A29,A30,FINSEQ_3:25;
  hence thesis by A4,A5,A28,A30;
end;

theorem Th88:
  for A being free preIfWhileAlgebra for I1,I2 being Element of A
  for n being Nat st I1\;I2 in (ElementaryInstructions A)|^n
  ex i being Nat st n = i+1 &
  I1 in (ElementaryInstructions A)|^i & I2 in (ElementaryInstructions A)|^i
proof
  let A be free preIfWhileAlgebra;
  set B = ElementaryInstructions A;
A1: B is GeneratorSet of A by Def25;
  let I1,I2 be Element of A;
A2: I1\;I2 <> I1 by Th73;
  I1\;I2 <> I2 by Th73;
  then I1\;I2 nin B by A2,Th50;
  then
A3: I1\;I2 nin B|^0 by Th18;
  let n be Nat;
  assume
A4: I1\;I2 in B|^n;
  then n > 0 by A3;
  then n >= 0+1 by NAT_1:13;
  then consider i being Nat such that
A5: n = 1+i by NAT_1:10;
  take i;
  thus n = i+1 by A5;
A6: dom Den(In(2, dom the charact of A), A) = 2-tuples_on the carrier of A
  by Th44;
A7: for o being OperSymbol of A, p being FinSequence st p in dom Den(o,A)
  holds Den(o,A).p in B implies o <> In(2, dom the charact of A)
  proof
    let o be OperSymbol of A;
    let p be FinSequence;
    assume that
A8: p in dom Den(o,A) and
A9: Den(o,A).p in B and
A10: o = In(2, dom the charact of A);
    consider a,b being object such that
A11: a in the carrier of A and
A12: b in the carrier of A and
A13: p = <*a,b*> by A6,A8,A10,FINSEQ_2:137;
    reconsider a,b as Element of A by A11,A12;
A14: a\;b <> a by Th73;
    a\;b <> b by Th73;
    hence contradiction by A9,A10,A13,A14,Th50;
  end;
  <*I1,I2*> in dom Den(In(2, dom the charact of A),A) by A6,FINSEQ_2:137;
  then rng <*I1,I2*> c= B|^i by A1,A4,A5,A7,Th39;
  then {I1,I2} c= B|^i by FINSEQ_2:127;
  hence thesis by ZFMISC_1:32;
end;

theorem Th89:
  for A being free preIfWhileAlgebra for C,I1,I2 being Element of A
  for n being Nat st if-then-else(C,I1,I2) in (ElementaryInstructions A)|^n
  ex i being Nat st n = i+1 & C in (ElementaryInstructions A)|^i &
  I1 in (ElementaryInstructions A)|^i & I2 in (ElementaryInstructions A)|^i
proof
  let A be free preIfWhileAlgebra;
  set B = ElementaryInstructions A;
A1: B is GeneratorSet of A by Def25;
  let C,I1,I2 be Element of A;
  if-then-else(C,I1,I2) nin B by Th51;
  then
A2: if-then-else(C,I1,I2) nin B|^0 by Th18;
  let n be Nat;
  assume
A3: if-then-else(C,I1,I2) in B|^n;
  then consider i being Nat such that
A4: n = i+1 by A2,NAT_1:6;
  take i;
  thus n = i+1 by A4;
A5: dom Den(In(3, dom the charact of A), A) = 3-tuples_on the carrier of A
  by Th47;
A6: for o being OperSymbol of A, p being FinSequence st p in dom Den(o,A)
  holds Den(o,A).p in B implies o <> In(3, dom the charact of A)
  proof
    let o be OperSymbol of A;
    let p be FinSequence;
    assume that
A7: p in dom Den(o,A) and
A8: Den(o,A).p in B and
A9: o = In(3, dom the charact of A);
    consider a,b,c being object such that
A10: a in the carrier of A and
A11: b in the carrier of A and
A12: c in the carrier of A and
A13: p = <*a,b,c*> by A5,A7,A9,FINSEQ_2:139;
    reconsider a,b,c as Element of A by A10,A11,A12;
    Den(o,A).p = if-then-else(a,b,c) by A9,A13;
    hence contradiction by A8,Th51;
  end;
  <*C,I1,I2*> in dom Den(In(3, dom the charact of A),A) by A5,FINSEQ_2:139;
  then rng <*C,I1,I2*> c= B|^i by A1,A3,A4,A6,Th39;
  then
A14: {C,I1,I2} c= B|^i by FINSEQ_2:128;
A15: C in {C,I1,I2} by ENUMSET1:def 1;
A16: I1 in {C,I1,I2} by ENUMSET1:def 1;
  I2 in {C,I1,I2 } by ENUMSET1:def 1;
  hence thesis by A14,A15,A16;
end;

theorem Th90:
  for A being free preIfWhileAlgebra for C,I being Element of A
  for n being Nat st while(C,I) in (ElementaryInstructions A)|^n
  ex i being Nat st n = i+1 &
  C in (ElementaryInstructions A)|^i & I in (ElementaryInstructions A)|^i
proof
  let A be free preIfWhileAlgebra;
  set B = ElementaryInstructions A;
A1: B is GeneratorSet of A by Def25;
  let C,I be Element of A;
  while(C,I) nin B by Th52;
  then
A2: while(C,I) nin B|^0 by Th18;
  let n be Nat;
  assume
A3: while(C,I) in B|^n;
  then consider i being Nat such that
A4: n = i+1 by A2,NAT_1:6;
  take i;
  thus n = i+1 by A4;
A5: dom Den(In(4, dom the charact of A), A) = 2-tuples_on the carrier of A
  by Th48;
A6: for o being OperSymbol of A, p being FinSequence st p in dom Den(o,A)
  holds Den(o,A).p in B implies o <> In(4, dom the charact of A)
  proof
    let o be OperSymbol of A;
    let p be FinSequence;
    assume that
A7: p in dom Den(o,A) and
A8: Den(o,A).p in B and
A9: o = In(4, dom the charact of A);
    consider a,b being object such that
A10: a in the carrier of A and
A11: b in the carrier of A and
A12: p = <*a,b*> by A5,A7,A9,FINSEQ_2:137;
    reconsider a,b as Element of A by A10,A11;
    Den(o,A).p = while(a,b) by A9,A12;
    hence contradiction by A8,Th52;
  end;
  <*C,I*> in dom Den(In(4, dom the charact of A),A) by A5,FINSEQ_2:137;
  then rng <*C,I*> c= B|^i by A1,A3,A4,A6,Th39;
  then {C,I} c= B|^i by FINSEQ_2:127;
  hence thesis by ZFMISC_1:32;
end;

begin :: Existence and uniqueness of execution function and termination

scheme IndDef {A() -> free ECIW-strict preIfWhileAlgebra,
  S() -> non empty set, Emp() -> (Element of S()), ElemF(set) -> set,
  ConF, WhiF(set,set) -> (Element of S()),
  IfF(set,set,set) -> Element of S()}:
  ex f being Function of the carrier of A(), S() st
  (for I being Element of A() st I in ElementaryInstructions A()
  holds f.I = ElemF(I)) & f.EmptyIns A() = Emp() &
  (for I1,I2 being Element of A() holds f.(I1\;I2) = ConF(f.I1,f.I2)) &
  (for C,I1,I2 being Element of A()
  holds f.if-then-else(C,I1,I2) = IfF(f.C,f.I1,f.I2)) &
  for C,I being Element of A() holds f.while(C,I) = WhiF(f.C,f.I)
provided
A1: for I being Element of A() st I in ElementaryInstructions A()
holds ElemF(I) in S()
proof
  set B = ElementaryInstructions A();
A2: B|^0 = B by Th18;
  set FB = {[I,ElemF(I)] where I is Element of A(): I in B};
  deffunc CF(Nat,set) = {[I1\;I2, ConF(fI1,fI2)]
  where I1,I2 is (Element of A()),fI1,fI2 is Element of S():
  I1 in B|^$1 & I2 in B|^$1 & [I1,fI1] in $2 & [I2,fI2] in $2};
  deffunc IF(Nat,set) = {[if-then-else(C,I1,I2), IfF(fC,fI1,fI2)]
  where C,I1,I2 is (Element of A()),fC,fI1,fI2 is (Element of S()):
  C in B|^$1 & I1 in B|^$1 & I2 in B|^$1 &
  [C,fC] in $2 & [I1,fI1] in $2 & [I2,fI2] in $2};
  deffunc WF(Nat,set) = {[while(C,I), WhiF(gC,gI)]
  where C,I is (Element of A()),gC,gI is Element of S():
  C in B|^$1 & I in B|^$1 & [C,gC] in $2 & [I,gI] in $2};
  deffunc F(Nat,set) = $2 \/ {[EmptyIns A(), Emp()]} \/
  CF($1,$2) \/ IF($1,$2) \/ WF($1,$2);
  consider FF being Function such that
A3: dom FF = NAT & FF.0 = FB and
A4: for n being Nat holds FF.(n+1) = F(n,FF.n) from NAT_1:sch 11;
  set f = Union FF;
A5: for n,m being Nat st n <= m holds FF.n c= FF.m
  proof
    let n,m be Nat;
    assume n <= m;
    then consider i being Nat such that
A6: m = n+i by NAT_1:10;
    reconsider i as Element of NAT by ORDINAL1:def 12;
A7: m = n+i by A6;
    defpred I[Nat] means FF.n c= FF.(n+$1);
A8: I[0];
A9: now
      let i be Nat;
      reconsider n9 =n as Element of NAT by ORDINAL1:def 12;
      FF.(n9+i+1) = F(n9+i, FF.(n9+i)) by A4
        .= FF.(n+i) \/ {[EmptyIns A(), Emp()]} \/ CF(n+i, FF.(n+i)) \/
      (IF(n+i, FF.(n+i)) \/ WF(n+i, FF.(n+i))) by XBOOLE_1:4
        .= FF.(n+i) \/ {[EmptyIns A(), Emp()]} \/ (CF(n+i, FF.(n+i)) \/
      (IF(n+i, FF.(n+i)) \/ WF(n+i, FF.(n+i)))) by XBOOLE_1:4
        .= FF.(n+i) \/ ({[EmptyIns A(), Emp()]} \/ (CF(n+i, FF.(n+i)) \/
      (IF(n+i, FF.(n+i)) \/ WF(n+i, FF.(n+i))))) by XBOOLE_1:4;
      then FF.(n+i) c= FF.(n+i+1) by XBOOLE_1:7;
      hence I[i] implies I[i+1] by XBOOLE_1:1;
    end;
    for i being Nat holds I[i] from NAT_1:sch 2(A8,A9);
    hence thesis by A7;
  end;
  defpred P[Nat] means ex g being Function of B|^$1, S() st g = FF.$1 &
  (EmptyIns A() in B|^$1 implies g.EmptyIns A() = Emp()) &
  (for I1,I2 being Element of A() st I1\;I2 in B|^$1
  holds g.(I1\;I2) = ConF(g.I1,g.I2)) &
  (for C,I1,I2 being Element of A() st if-then-else(C,I1,I2) in B|^$1
  holds g.if-then-else(C,I1,I2) = IfF(g.C,g.I1,g.I2)) &
  (for C,I being Element of A() st while(C,I) in B|^$1
  holds g.while(C,I) = WhiF(g.C,g.I));
  defpred p[set] means $1 in B;
  reconsider f0 = {[I,ElemF(I)] where I is Element of A(): p[I]} as Function
  from ALTCAT_2:sch 1;
A10: dom f0 = B
  proof
    thus dom f0 c= B
    proof
      let x be object;
      assume x in dom f0;
      then [x,f0.x] in f0 by FUNCT_1:def 2;
      then ex I being Element of A() st [x,f0.x] = [I,ElemF(I)] & p[I];
      hence thesis by XTUPLE_0:1;
    end;
    let x be object;
    assume
A11: x in B;
    then reconsider I = x as Element of A();
    [I,ElemF(I)] in f0 by A11;
    hence thesis by XTUPLE_0:def 12;
  end;
  rng f0 c= S()
  proof
    let y be object;
    assume y in rng f0;
    then consider x being object such that
A12: [x,y] in f0 by XTUPLE_0:def 13;
    consider I being Element of A() such that
A13: [x,y] = [I,ElemF(I)] and
A14: p[I] by A12;
    y = ElemF(I) by A13,XTUPLE_0:1;
    hence thesis by A1,A14;
  end;
  then reconsider f0 as Function of B|^0, S() by A2,A10,FUNCT_2:2;
A15: P[0]
  proof
    take f0;
    thus f0 = FF.0 by A3;
    now
      let I1,I2 be Element of A();
A16:  I1\;I2 <> I1 by Th73;
      I1\;I2 <> I2 by Th73;
      hence I1\;I2 nin B by A16,Th50;
    end;
    hence thesis by A2,Th49,Th51,Th52;
  end;
A17: for i being Nat st P[i] holds P[i+1]
  proof
    let i be Nat;
    given g being Function of B|^i, S() such that
A18: g = FF.i and
A19: EmptyIns A() in B|^i implies g.EmptyIns A() = Emp() and
A20: for I1,I2 being Element of A() st I1\;I2 in B|^i holds g.(I1\;I2)
    = ConF(g.I1,g.I2) and
A21: for C,I1,I2 being Element of A() st if-then-else(C,I1,I2) in B|^i
    holds g.if-then-else(C,I1,I2) = IfF(g.C,g.I1,g.I2) and
A22: for C,I being Element of A() st while(C,I) in B|^i holds g.while(C,
    I) = WhiF(g.C,g.I);
    set h = FF.(i+1);
A23: i < i+1 by NAT_1:13;
A24: h = F(i, g) by A4,A18;
A25: dom g = B|^i by FUNCT_2:def 1;
A26: B|^i c= B|^(i+1) by A23,Th21;
A27: now
      let x be set;
      assume x in h;
      then x in g \/ {[EmptyIns A(), Emp()]} \/ CF(i, g) \/ IF(i, g) or
      x in WF(i, g) by A24,XBOOLE_0:def 3;
      then x in g \/ {[EmptyIns A(), Emp()]} \/ CF(i, g) or x in IF(i, g) or
      x in WF(i, g) by XBOOLE_0:def 3;
      then x in g \/ {[EmptyIns A(), Emp()]} or x in CF(i,g) or x in IF(i, g
      ) or x in WF(i, g) by XBOOLE_0:def 3;
      hence x in g or x in {[EmptyIns A(), Emp()]} or x in CF(i,g) or
      x in IF(i, g) or x in WF(i, g) by XBOOLE_0:def 3;
    end;
    h is Relation-like
    proof
      let x be object;
      assume x in h;
      then x in g or x in {[EmptyIns A(), Emp()]} or
      x in CF(i,g) or x in IF(i,g) or x in WF(i,g) by A27;
      then (ex a,b being object st x = [a,b]) or x = [EmptyIns A(), Emp()] or
      (ex I1,I2 being (Element of A()), fI1,fI2 being Element of S() st
      x = [I1\;I2, ConF(fI1,fI2)] & I1 in B|^i & I2 in B|^i &
      [I1,fI1] in g & [I2,fI2] in g) or
      (ex C,I1,I2 being (Element of A()),a,b,c being Element of S() st
      x = [if-then-else(C,I1,I2), IfF(a,b,c)] & C in B|^i & I1 in B|^i &
      I2 in B|^i & [C,a] in g & [I1,b] in g & [I2,c] in g) or
      (ex C,I being (Element of A()), a,b being Element of S() st
      x = [while(C,I), WhiF(a,b)] & C in B|^i & I in B|^i & [C,a] in g &
      [I,b] in g) by RELAT_1:def 1;
      hence thesis;
    end;
    then reconsider h as Relation;
    h is Function-like
    proof
      let x,y1,y2 be object;
      set x1 = [x,y1], x2 = [x,y2];
      assume
A28:  [x,y1] in h;
      assume
A29:  [x,y2] in h;
      per cases by A27,A28;
      suppose
A30:    x1 in g;
        then
A31:    x in dom g by FUNCT_1:1;
A32:    y1 = g.x by A30,FUNCT_1:1;
        per cases by A27,A29;
        suppose x2 in g;
          hence thesis by A30,FUNCT_1:def 1;
        end;
        suppose x2 in {[EmptyIns A(), Emp()]};
          then
A33:      x2 = [EmptyIns A(), Emp()] by TARSKI:def 1;
          then x = EmptyIns A() by XTUPLE_0:1;
          hence thesis by A19,A31,A32,A33,XTUPLE_0:1;
        end;
        suppose x2 in CF(i,g);
          then consider J1,J2 being (Element of A()), gJ1,gJ2 being Element
          of S() such that
A34:      x2 = [J1\;J2, ConF(gJ1,gJ2)] and J1 in B|^i
          and J2 in B|^i and
A35:      [J1,gJ1] in g and
A36:      [J2,gJ2] in g;
A37:      x = J1\;J2 by A34,XTUPLE_0:1;
A38:      y2 = ConF(gJ1,gJ2) by A34,XTUPLE_0:1;
A39:      g.J1 = gJ1 by A35,FUNCT_1:1;
          g.J2 = gJ2 by A36,FUNCT_1:1;
          hence thesis by A20,A31,A32,A37,A38,A39;
        end;
        suppose x2 in IF(i,g);
          then consider D,J1,J2 being (Element of A()), a,b,c being Element
          of S() such that
A40:      x2 = [if-then-else(D,J1,J2), IfF(a,b,c)] and D in B|^i
          and J1 in B|^i
          and J2 in B|^i and
A41:      [D,a] in g and
A42:      [J1,b] in g and
A43:      [J2,c] in g;
A44:      x = if-then-else(D,J1,J2) by A40,XTUPLE_0:1;
A45:      y2 = IfF(a,b,c) by A40,XTUPLE_0:1;
A46:      g.D = a by A41,FUNCT_1:1;
A47:      g.J1 = b by A42,FUNCT_1:1;
          g.J2 = c by A43,FUNCT_1:1;
          hence thesis by A21,A31,A32,A44,A45,A46,A47;
        end;
        suppose x2 in WF(i,g);
          then consider D,J being (Element of A()), a,b being Element of S()
          such that
A48:      x2 = [while(D,J), WhiF(a,b)] and D in B|^i
          and J in B|^i and
A49:      [D,a] in g and
A50:      [J,b] in g;
A51:      x = while(D,J) by A48,XTUPLE_0:1;
A52:      y2 = WhiF(a,b) by A48,XTUPLE_0:1;
A53:      g.D = a by A49,FUNCT_1:1;
          g.J = b by A50,FUNCT_1:1;
          hence thesis by A22,A31,A32,A51,A52,A53;
        end;
      end;
      suppose x1 in {[EmptyIns A(), Emp()]};
        then
A54:    x1 = [EmptyIns A(), Emp()] by TARSKI:def 1;
        then
A55:    x = EmptyIns A() by XTUPLE_0:1;
A56:    y1 = Emp() by A54,XTUPLE_0:1;
        per cases by A27,A29;
        suppose
A57:      x2 in g;
          then x in dom g by FUNCT_1:1;
          hence thesis by A19,A55,A56,A57,FUNCT_1:1;
        end;
        suppose x2 in {[EmptyIns A(), Emp()]};
          then x2 = [EmptyIns A(), Emp()] by TARSKI:def 1;
          hence thesis by A54,XTUPLE_0:1;
        end;
        suppose x2 in CF(i,g);
          then consider J1,J2 being (Element of A()), a,b being Element of S(
          ) such that
A58:      x2 = [J1\;J2, ConF(a,b)] and J1 in B|^i
          and J2 in B|^i
          and [J1,a] in g
          and [J2,b] in g;
          x = J1\;J2 by A58,XTUPLE_0:1;
          hence thesis by A55,Th72;
        end;
        suppose x2 in IF(i,g);
          then consider D,J1,J2 being (Element of A()),a,b,c being Element of
          S() such that
A59:      x2 = [if-then-else(D,J1,J2), IfF(a,b,c)] and D in B|^i
          and J1 in B|^i
          and J2 in B|^i
          and [D,a] in g
          and [J1,b] in g
          and [J2,c] in g;
          x = if-then-else(D,J1,J2) by A59,XTUPLE_0:1;
          hence thesis by A55,Def24;
        end;
        suppose x2 in WF(i,g);
          then consider D,J being (Element of A()),a,b being Element of S()
          such that
A60:      x2 = [while(D,J), WhiF(a,b)] and D in B|^i
          and J in B|^i
          and [D,a] in g
          and [J,b] in g;
          x = while(D,J) by A60,XTUPLE_0:1;
          hence thesis by A55,Def24;
        end;
      end;
      suppose x1 in CF(i,g);
        then consider I1,I2 being (Element of A()), gI1,gI2 being Element of
        S() such that
A61:    x1 = [I1\;I2, ConF(gI1,gI2)] and I1 in B|^i
        and I2 in B|^i and
A62:    [I1,gI1] in g and
A63:    [I2,gI2] in g;
A64:    x = I1\;I2 by A61,XTUPLE_0:1;
A65:    y1 = ConF(gI1,gI2) by A61,XTUPLE_0:1;
A66:    g.I1 = gI1 by A62,FUNCT_1:1;
A67:    g.I2 = gI2 by A63,FUNCT_1:1;
        per cases by A27,A29;
        suppose
A68:      x2 in g;
          then
A69:      x in dom g by FUNCT_1:1;
          y2 = g.x by A68,FUNCT_1:1;
          hence thesis by A20,A64,A65,A66,A67,A69;
        end;
        suppose x2 in {[EmptyIns A(), Emp()]};
          then x2 = [EmptyIns A(), Emp()] by TARSKI:def 1;
          then x = EmptyIns A() by XTUPLE_0:1;
          hence thesis by A64,Th72;
        end;
        suppose x2 in CF(i,g);
          then consider J1,J2 being (Element of A()), a,b being Element of S(
          ) such that
A70:      x2 = [J1\;J2, ConF(a,b)] and J1 in B|^i
          and J2 in B|^i and
A71:      [J1,a] in g and
A72:      [J2,b] in g;
A73:      x = J1\;J2 by A70,XTUPLE_0:1;
A74:      y2 = ConF(a,b) by A70,XTUPLE_0:1;
A75:      g.J1 = a by A71,FUNCT_1:1;
A76:      g.J2 = b by A72,FUNCT_1:1;
          I1 = J1 by A64,A73,Th73;
          hence thesis by A64,A65,A66,A67,A73,A74,A75,A76,Th73;
        end;
        suppose x2 in IF(i,g);
          then consider D,J1,J2 being (Element of A()),a,b,c being Element of
          S() such that
A77:      x2 = [if-then-else(D,J1,J2), IfF(a,b,c)] and D in B|^i
          and J1 in B|^i
          and J2 in B|^i
          and [D,a] in g
          and [J1,b] in g
          and [J2,c] in g;
          x = if-then-else(D,J1,J2) by A77,XTUPLE_0:1;
          hence thesis by A64,Th73;
        end;
        suppose x2 in WF(i,g);
          then consider D,J being (Element of A()),a,b being Element of S()
          such that
A78:      x2 = [while(D,J), WhiF(a,b)] and D in B|^i
          and J in B|^i
          and [D,a] in g
          and [J,b] in g;
          x = while(D,J) by A78,XTUPLE_0:1;
          hence thesis by A64,Th73;
        end;
      end;
      suppose x1 in IF(i,g);
        then consider C,I1,I2 being (Element of A()), gC,gI1,gI2 being
        Element of S() such that
A79:    x1 = [if-then-else(C,I1,I2), IfF(gC,gI1,gI2)] and C in B|^i
        and I1 in B|^i
        and I2 in B|^i and
A80:    [C,gC] in g and
A81:    [I1,gI1] in g and
A82:    [I2,gI2] in g;
A83:    x = if-then-else(C,I1,I2) by A79,XTUPLE_0:1;
A84:    y1 = IfF(gC,gI1,gI2) by A79,XTUPLE_0:1;
A85:    g.I1 = gI1 by A81,FUNCT_1:1;
A86:    g.I2 = gI2 by A82,FUNCT_1:1;
A87:    g.C = gC by A80,FUNCT_1:1;
        per cases by A27,A29;
        suppose
A88:      x2 in g;
          then
A89:      x in dom g by FUNCT_1:1;
          y2 = g.x by A88,FUNCT_1:1;
          hence thesis by A21,A83,A84,A85,A86,A87,A89;
        end;
        suppose x2 in {[EmptyIns A(), Emp()]};
          then x2 = [EmptyIns A(), Emp()] by TARSKI:def 1;
          then x = EmptyIns A() by XTUPLE_0:1;
          hence thesis by A83,Th72;
        end;
        suppose x2 in CF(i,g);
          then consider J1,J2 being (Element of A()),a,b being Element of S()
          such that
A90:      x2 = [J1\;J2, ConF(a,b)] and J1 in B|^i
          and J2 in B|^i
          and [J1,a] in g
          and [J2,b] in g;
          x = J1\;J2 by A90,XTUPLE_0:1;
          hence thesis by A83,Th73;
        end;
        suppose x2 in IF(i,g);
          then consider D,J1,J2 being (Element of A()),a,b,c being Element of
          S() such that
A91:      x2 = [if-then-else(D,J1,J2), IfF(a,b,c)] and D in B|^i
          and J1 in B|^i
          and J2 in B|^i and
A92:      [D,a] in g and
A93:      [J1,b] in g and
A94:      [J2,c] in g;
A95:      x = if-then-else(D,J1,J2) by A91,XTUPLE_0:1;
A96:      y2 = IfF(a,b,c) by A91,XTUPLE_0:1;
A97:      g.D = a by A92,FUNCT_1:1;
A98:      g.J1 = b by A93,FUNCT_1:1;
A99:      g.J2 = c by A94,FUNCT_1:1;
A100:     C = D by A83,A95,Th74;
          I1 = J1 by A83,A95,Th74;
          hence thesis by A83,A84,A85,A86,A87,A95,A96,A97,A98,A99,A100,Th74;
        end;
        suppose x2 in WF(i,g);
          then consider D,J being (Element of A()),a,b being Element of S()
          such that
A101:     x2 = [while(D,J), WhiF(a,b)] and D in B|^i
          and J in B|^i
          and [D,a] in g
          and [J,b] in g;
          x = while(D,J) by A101,XTUPLE_0:1;
          hence thesis by A83,Th74;
        end;
      end;
      suppose x1 in WF(i,g);
        then consider C,I being (Element of A()), gC,gI being Element of S()
        such that
A102:   x1 = [while(C,I), WhiF(gC,gI)] and C in B|^i
        and I in B|^i and
A103:   [C,gC] in g and
A104:   [I,gI] in g;
A105:   x = while(C,I) by A102,XTUPLE_0:1;
A106:   y1 = WhiF(gC,gI) by A102,XTUPLE_0:1;
A107:   g.C = gC by A103,FUNCT_1:1;
A108:   g.I = gI by A104,FUNCT_1:1;
        per cases by A27,A29;
        suppose
A109:     x2 in g;
          then
A110:     x in dom g by FUNCT_1:1;
          y2 = g.x by A109,FUNCT_1:1;
          hence thesis by A22,A105,A106,A107,A108,A110;
        end;
        suppose x2 in {[EmptyIns A(), Emp()]};
          then x2 = [EmptyIns A(), Emp()] by TARSKI:def 1;
          then x = EmptyIns A() by XTUPLE_0:1;
          hence thesis by A105,Th72;
        end;
        suppose x2 in CF(i,g);
          then consider J1,J2 being (Element of A()),a,b being Element of S()
          such that
A111:     x2 = [J1\;J2, ConF(a,b)] and J1 in B|^i
          and J2 in B|^i
          and [J1,a] in g
          and [J2,b] in g;
          x = J1\;J2 by A111,XTUPLE_0:1;
          hence thesis by A105,Th73;
        end;
        suppose x2 in IF(i,g);
          then consider D,J1,J2 being (Element of A()), a,b,c being Element
          of S() such that
A112:     x2 = [if-then-else(D,J1,J2), IfF(a,b,c)] and D in B|^i
          and J1 in B|^i
          and J2 in B|^i
          and [D,a] in g
          and [J1,b] in g
          and [J2,c] in g;
          x = if-then-else(D,J1,J2) by A112,XTUPLE_0:1;
          hence thesis by A105,Th74;
        end;
        suppose x2 in WF(i,g);
          then consider D,J being (Element of A()),a,b being Element of S()
          such that
A113:     x2 = [while(D,J), WhiF(a,b)] and D in B|^i
          and J in B|^i and
A114:     [D,a] in g and
A115:     [J,b] in g;
A116:     x = while(D,J) by A113,XTUPLE_0:1;
A117:     y2 = WhiF(a,b) by A113,XTUPLE_0:1;
A118:     g.D = a by A114,FUNCT_1:1;
A119:     g.J = b by A115,FUNCT_1:1;
          D = C by A105,A116,Th75;
          hence thesis by A105,A106,A107,A108,A116,A117,A118,A119,Th75;
        end;
      end;
    end;
    then reconsider h as Function;
A120: dom h = B|^(i+1)
    proof
      thus dom h c= B|^(i+1)
      proof
        let a be object;
        set ah = [a,h.a];
        assume a in dom h;
        then
A121:   [a,h.a] in h by FUNCT_1:def 2;
        per cases by A27,A121;
        suppose ah in g;
          then a in dom g by FUNCT_1:1;
          hence thesis by A26;
        end;
        suppose ah in {[EmptyIns A(), Emp()]};
          then ah = [EmptyIns A(), Emp()] by TARSKI:def 1;
          then a = EmptyIns A() by XTUPLE_0:1;
          hence thesis by Th76;
        end;
        suppose ah in CF(i,g);
          then consider I,J being (Element of A()),e,b being Element of S()
          such that
A122:     ah = [I\;J, ConF(e,b)] and
A123:     I in B|^i and
A124:     J in B|^i and [I,e] in g
          and [J,b] in g;
          a = I\;J by A122,XTUPLE_0:1;
          hence thesis by A123,A124,Th76;
        end;
        suppose ah in IF(i,g);
          then consider C,I,J being (Element of A()),e,b,c being Element of S
          () such that
A125:     ah = [if-then-else(C,I,J), IfF(e,b,c)] and
A126:     C in B|^i and
A127:     I in B|^i and
A128:     J in B|^i and [C,e] in g
          and [I,b] in g
          and [J,c] in g;
          a = if-then-else(C,I,J) by A125,XTUPLE_0:1;
          hence thesis by A126,A127,A128,Th76;
        end;
        suppose ah in WF(i,g);
          then consider I,J being (Element of A()),e,b being Element of S()
          such that
A129:     ah = [while(I,J), WhiF(e,b)] and
A130:     I in B|^i and
A131:     J in B|^i and [I,e] in g
          and [J,b] in g;
          a = while(I,J) by A129,XTUPLE_0:1;
          hence thesis by A130,A131,Th76;
        end;
      end;
      let x be object;
      assume
A132: x in B|^(i+1);
      per cases by A132,Th77;
      suppose x in B|^i;
        then [x,g.x] in g by A25,FUNCT_1:def 2;
        then [x,g.x] in g \/ {[EmptyIns A(), Emp()]} by XBOOLE_0:def 3;
        then [x,g.x] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g)
        by XBOOLE_0:def 3;
        then [x,g.x] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g) \/ IF(i,g)
        by XBOOLE_0:def 3;
        then [x,g.x] in h by A24,XBOOLE_0:def 3;
        hence thesis by XTUPLE_0:def 12;
      end;
      suppose x = EmptyIns A();
        then [x,Emp()] in {[EmptyIns A(), Emp()]} by TARSKI:def 1;
        then [x,Emp()] in g \/ {[EmptyIns A(), Emp()]} by XBOOLE_0:def 3;
        then [x,Emp()] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g)
        by XBOOLE_0:def 3;
        then [x,Emp()] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g) \/ IF(i,g)
        by XBOOLE_0:def 3;
        then [x,Emp()] in h by A24,XBOOLE_0:def 3;
        hence thesis by XTUPLE_0:def 12;
      end;
      suppose ex I1,I2 being Element of A() st x = I1\;I2 &
        I1 in B|^i & I2 in B|^i;
        then consider I1,I2 being Element of A() such that
A133:   x = I1\;I2 and
A134:   I1 in B|^i and
A135:   I2 in B|^i;
        reconsider a = g.I1, b = g.I2 as Element of S() by A134,A135,FUNCT_2:5;
A136:   [I1,a] in g by A25,A134,FUNCT_1:def 2;
        [I2,b] in g by A25,A135,FUNCT_1:def 2;
        then [x,ConF(a,b)] in CF(i,g) by A133,A134,A135,A136;
        then [x,ConF(a,b)] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g)
        by XBOOLE_0:def 3;
        then [x,ConF(a,b)] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g) \/ IF(
        i,g) by XBOOLE_0:def 3;
        then [x,ConF(a,b)] in h by A24,XBOOLE_0:def 3;
        hence thesis by XTUPLE_0:def 12;
      end;
      suppose
        ex C,I1,I2 being Element of A() st x = if-then-else(C,I1,I2) &
        C in B|^i & I1 in B|^i & I2 in B|^i;
        then consider C,I1,I2 being Element of A() such that
A137:   x = if-then-else(C,I1,I2) and
A138:   C in B|^i and
A139:   I1 in B|^i and
A140:   I2 in B|^i;
        reconsider a = g.I1, b = g.I2, c = g.C as Element of S()
        by A138,A139,A140,FUNCT_2:5;
A141:   [I1,a] in g by A25,A139,FUNCT_1:def 2;
A142:   [I2,b] in g by A25,A140,FUNCT_1:def 2;
        [C,c] in g by A25,A138,FUNCT_1:def 2;
        then [x,IfF(c,a,b)] in IF(i,g) by A137,A138,A139,A140,A141,A142;
        then [x,IfF(c,a,b)] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g) \/ IF
        (i,g) by XBOOLE_0:def 3;
        then [x,IfF(c,a,b)] in h by A24,XBOOLE_0:def 3;
        hence thesis by XTUPLE_0:def 12;
      end;
      suppose ex C,I being Element of A() st
        x = while(C,I) & C in B|^i & I in B|^i;
        then consider C,I being Element of A() such that
A143:   x = while(C,I) and
A144:   C in B|^i and
A145:   I in B|^i;
        reconsider a = g.C, b = g.I as Element of S() by A144,A145,FUNCT_2:5;
A146:   [C,a] in g by A25,A144,FUNCT_1:def 2;
        [I,b] in g by A25,A145,FUNCT_1:def 2;
        then [x,WhiF(a,b)] in WF(i,g) by A143,A144,A145,A146;
        then [x,WhiF(a,b)] in h by A24,XBOOLE_0:def 3;
        hence thesis by XTUPLE_0:def 12;
      end;
    end;
    rng h c= S()
    proof
      let a be object;
      assume a in rng h;
      then consider x being object such that
A147: [x,a] in h by XTUPLE_0:def 13;
      set ah = [x,a];
      per cases by A27,A147;
      suppose ah in g;
        hence thesis by ZFMISC_1:87;
      end;
      suppose ah in {[EmptyIns A(), Emp()]};
        then ah = [EmptyIns A(), Emp()] by TARSKI:def 1;
        then a = Emp() by XTUPLE_0:1;
        hence thesis;
      end;
      suppose ah in CF(i,g);
        then consider I,J being (Element of A()),e,b being Element of S() such
        that
A148:   ah = [I\;J, ConF(e,b)] and I in B|^i
        and J in B|^i
        and [I,e] in g
        and [J,b] in g;
        a = ConF(e,b) by A148,XTUPLE_0:1;
        hence thesis;
      end;
      suppose ah in IF(i,g);
        then consider C,I,J being (Element of A()),e,b,c being Element of S()
        such that
A149:   ah = [if-then-else(C,I,J), IfF(e,b,c)] and C in B|^i
        and I in B|^i
        and J in B|^i
        and [C,e] in g
        and [I,b] in g
        and [J,c] in g;
        a = IfF(e,b,c) by A149,XTUPLE_0:1;
        hence thesis;
      end;
      suppose ah in WF(i,g);
        then consider I,J being (Element of A()),e,b being Element of S() such
        that
A150:   ah = [while(I,J), WhiF(e,b)] and I in B|^i
        and J in B|^i
        and [I,e] in g
        and [J,b] in g;
        a = WhiF(e,b) by A150,XTUPLE_0:1;
        hence thesis;
      end;
    end;
    then reconsider h as Function of B|^(i+1), S() by A120,FUNCT_2:2;
    h = g\/{[EmptyIns A(), Emp()]}\/CF(i,g)\/(IF(i,g)\/WF(i,g))
    by A24,XBOOLE_1:4
      .= g\/{[EmptyIns A(), Emp()]}\/(CF(i,g)\/(IF(i,g)\/WF(i,g)))
    by XBOOLE_1:4
      .= g\/({[EmptyIns A(), Emp()]}\/(CF(i,g)\/(IF(i,g)\/WF(i,g))))
    by XBOOLE_1:4;
    then
A151: g c= h by XBOOLE_1:7;
    take h;
    thus h = FF.(i+1);
    hereby
      set x = EmptyIns A();
      assume x in B|^(i+1);
      [x,Emp()] in {[EmptyIns A(), Emp()]} by TARSKI:def 1;
      then [x,Emp()] in g \/ {[EmptyIns A(), Emp()]} by XBOOLE_0:def 3;
      then [x,Emp()] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g)
      by XBOOLE_0:def 3;
      then [x,Emp()] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g) \/ IF(i,g)
      by XBOOLE_0:def 3;
      then [x,Emp()] in h by A24,XBOOLE_0:def 3;
      hence h.EmptyIns A() = Emp() by FUNCT_1:1;
    end;
    hereby
      let I1,I2 be Element of A();
      set x = I1\;I2;
      set y = ConF(h.I1,h.I2);
      assume I1\;I2 in B|^(i+1);
      then
A152: ex i0 being Nat st ( i+1 = i0+1)&( I1 in B|^i0)&( I2 in B|^ i0) by Th88;
      then reconsider gI1 = g.I1, gI2 = g.I2 as Element of S() by FUNCT_2:5;
A153: [I1,gI1] in g by A25,A152,FUNCT_1:def 2;
A154: [I2,gI2] in g by A25,A152,FUNCT_1:def 2;
A155: g.I1 = h.I1 by A151,A153,FUNCT_1:1;
      g.I2 = h.I2 by A151,A154,FUNCT_1:1;
      then [x,y] in CF(i,g) by A152,A153,A154,A155;
      then [x,y] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g) by XBOOLE_0:def 3;
      then [x,y] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g) \/ IF(i,g)
      by XBOOLE_0:def 3;
      then [x,y] in h by A24,XBOOLE_0:def 3;
      hence h.(I1\;I2) = ConF(h.I1,h.I2) by FUNCT_1:1;
    end;
    hereby
      let C,I1,I2 be Element of A();
      set x = if-then-else(C,I1,I2);
      set y = IfF(h.C,h.I1,h.I2);
      assume if-then-else(C,I1,I2) in B|^(i+1);
      then
A156: ex i0 being Nat st ( i+1 = i0+1)&( C in B|^i0)&( I1 in B|^
      i0)&( I2 in B|^i0) by Th89;
      then reconsider gC = g.C, gI1 = g.I1, gI2 = g.I2 as Element of S()
      by FUNCT_2:5;
A157: [C,gC] in g by A25,A156,FUNCT_1:def 2;
A158: [I1,gI1] in g by A25,A156,FUNCT_1:def 2;
A159: [I2,gI2] in g by A25,A156,FUNCT_1:def 2;
A160: g.C = h.C by A151,A157,FUNCT_1:1;
A161: g.I1 = h.I1 by A151,A158,FUNCT_1:1;
      g.I2 = h.I2 by A151,A159,FUNCT_1:1;
      then [x,y] in IF(i,g) by A156,A157,A158,A159,A160,A161;
      then [x,y] in g \/ {[EmptyIns A(), Emp()]} \/ CF(i,g) \/ IF(i,g)
      by XBOOLE_0:def 3;
      then [x,y] in h by A24,XBOOLE_0:def 3;
      hence h.if-then-else(C,I1,I2) = IfF(h.C,h.I1,h.I2) by FUNCT_1:1;
    end;
    let C,I be Element of A();
    set x = while(C,I);
    set y = WhiF(h.C,h.I);
    assume while(C,I) in B|^(i+1);
    then
A162: ex i0 being Nat st ( i+1 = i0+1)&( C in B|^i0)&( I in B|^i0 ) by Th90;
    then reconsider gC = g.C, gI = g.I as Element of S() by FUNCT_2:5;
A163: [C,gC] in g by A25,A162,FUNCT_1:def 2;
A164: [I,gI] in g by A25,A162,FUNCT_1:def 2;
A165: g.C = h.C by A151,A163,FUNCT_1:1;
    g.I = h.I by A151,A164,FUNCT_1:1;
    then [x,y] in WF(i,g) by A162,A163,A164,A165;
    then [x,y] in h by A24,XBOOLE_0:def 3;
    hence thesis by FUNCT_1:1;
  end;
A166: for i being Nat holds P[i] from NAT_1:sch 2(A15,A17);
  f is Relation-like Function-like
  proof
    hereby
      let x be object;
      assume x in f;
      then consider n being object such that
A167: n in dom FF and
A168: x in FF.n by CARD_5:2;
      reconsider n as Element of NAT by A3,A167;
      P[n] by A166;
      hence ex a,b being object st x = [a,b] by A168,RELAT_1:def 1;
    end;
    let x,y1,y2 be object;
    assume [x,y1] in f;
    then consider n1 being object such that
A169: n1 in dom FF and
A170: [x,y1] in FF.n1 by CARD_5:2;
    assume [x,y2] in f;
    then consider n2 being object such that
A171: n2 in dom FF and
A172: [x,y2] in FF.n2 by CARD_5:2;
    reconsider n1,n2 as Element of NAT by A3,A169,A171;
    n1 <= n2 or n2 <= n1;
    then FF.n1 c= FF.n2 or FF.n2 c= FF.n1 by A5;
    then [x,y1] in FF.n2 & P[n2] or [x,y2] in FF.n1 & P[n1] by A166,A170,A172;
    hence thesis by A170,A172,FUNCT_1:def 1;
  end;
  then reconsider f as Function;
A173: dom f = the carrier of A()
  proof
    thus dom f c= the carrier of A()
    proof
      let x be object;
      assume x in dom f;
      then [x,f.x] in f by FUNCT_1:def 2;
      then consider n being object such that
A174: n in dom FF and
A175: [x,f.x] in FF.n by CARD_5:2;
      reconsider n as Element of NAT by A3,A174;
      P[n] by A166;
      then x in B|^n by A175,ZFMISC_1:87;
      hence thesis;
    end;
    let x be object;
    assume x in the carrier of A();
    then reconsider I = x as Element of A();
    consider n being Nat such that
A176: I in B|^n by Th79;
    reconsider n as Element of NAT by ORDINAL1:def 12;
    P[n] by A166;
    then reconsider g = FF.n as Function of B|^n, S();
    dom g = B|^n by FUNCT_2:def 1;
    then [I,g.I] in g by A176,FUNCT_1:def 2;
    then [I,g.I] in f by A3,CARD_5:2;
    hence thesis by XTUPLE_0:def 12;
  end;
  rng f c= S()
  proof
    let b be object;
    assume b in rng f;
    then consider a being object such that
A177: a in dom f and
A178: b = f.a by FUNCT_1:def 3;
    reconsider a as Element of A() by A173,A177;
    consider n being Nat such that
A179: a in B|^n by Th79;
    reconsider n as Element of NAT by ORDINAL1:def 12;
    P[n] by A166;
    then reconsider g = FF.n as Function of B|^n, S();
A180: dom g = B|^n by FUNCT_2:def 1;
    then [a,g.a] in g by A179,FUNCT_1:def 2;
    then [a,g.a] in f by A3,CARD_5:2;
    then
A181: b = g.a by A178,FUNCT_1:1;
    g.a in rng g by A179,A180,FUNCT_1:3;
    hence thesis by A181;
  end;
  then reconsider f as Function of the carrier of A(), S() by A173,FUNCT_2:2;
  take f;
  hereby
    let I be Element of A();
    assume I in ElementaryInstructions A();
    then [I,ElemF(I)] in FF.0 by A3;
    then [I,ElemF(I)] in f by A3,CARD_5:2;
    hence f.I = ElemF(I) by FUNCT_1:1;
  end;
A182: now
    let n be Nat;
    let I be Element of A();
    let g be Function of B|^n, S();
    assume that
A183: I in B|^n and
A184: g = FF.n;
    dom g = B|^n by FUNCT_2:def 1;
    then
A185: [I,g.I] in g by A183,FUNCT_1:def 2;
    n in NAT by ORDINAL1:def 12;
    then [I,g.I] in f by A3,A184,A185,CARD_5:2;
    hence g.I = f.I by FUNCT_1:1;
  end;
  consider n0 being Nat such that
A186: EmptyIns A() in B|^n0 by Th79;
  reconsider n0 as Element of NAT by ORDINAL1:def 12;
  consider g0 being Function of B|^n0, S() such that
A187: g0 = FF.n0 and
A188: EmptyIns A() in B|^n0 implies g0.EmptyIns A() = Emp() and
  for I1,I2 being Element of A() st I1\;I2 in B|^n0 holds g0.(I1\;I2) =
  ConF(g0.I1,g0.I2)
  and for C,I1,I2 being Element of A() st if-then-else(C,I1,I2) in B|^
  n0 holds g0.if-then-else(C,I1,I2) = IfF(g0.C,g0.I1,g0.I2)
  and for C,I being Element of A() st while(C,I) in B|^n0 holds g0.while
  (C,I) = WhiF(g0.C,g0.I)
  by A166;
  dom g0 = B|^n0 by FUNCT_2:def 1;
  then [EmptyIns A(), Emp()] in g0 by A186,A188,FUNCT_1:def 2;
  then [EmptyIns A(), Emp()] in f by A3,A187,CARD_5:2;
  hence f.EmptyIns A() = Emp() by FUNCT_1:1;
  hereby
    let I1,I2 be Element of A();
    consider n0 being Nat such that
A189: I1\;I2 in B|^n0 by Th79;
    reconsider n0 as Element of NAT by ORDINAL1:def 12;
    consider g0 being Function of B|^n0, S() such that
A190: g0 = FF.n0 and
    EmptyIns A() in B|^n0 implies g0.EmptyIns A() = Emp() and
A191: for I1,I2 being Element of A() st I1\;I2 in B|^n0
    holds g0.(I1\;I2) = ConF(g0.I1,g0.I2) and
    for C,I1,I2 being Element of A() st if-then-else(C,I1,I2) in B|^n0
    holds g0.if-then-else(C,I1,I2) = IfF(g0.C,g0.I1,g0.I2)
    and for C,I being Element of A() st while(C,I) in B|^n0 holds g0.while
    (C,I) = WhiF(g0.C,g0.I)
    by A166;
    consider i0 being Nat such that
A192: n0 = i0+1 and
A193: I1 in B|^i0 and
A194: I2 in B|^i0 by A189,Th88;
    n0 > i0 by A192,NAT_1:13;
    then
A195: B|^i0 c= B|^n0 by Th21;
A196: dom g0 = B|^n0 by FUNCT_2:def 1;
A197: g0.I1 = f.I1 by A182,A190,A193,A195;
A198: g0.I2 = f.I2 by A182,A190,A194,A195;
A199: [I1\;I2, g0.(I1\;I2)] in g0 by A189,A196,FUNCT_1:1;
    g0.(I1\;I2) = ConF(f.I1,f.I2) by A189,A191,A197,A198;
    then [I1\;I2, ConF(f.I1,f.I2)] in f by A3,A190,A199,CARD_5:2;
    hence f.(I1\;I2) = ConF(f.I1,f.I2) by FUNCT_1:1;
  end;
  hereby
    let C,I1,I2 be Element of A();
    set IF = if-then-else(C,I1,I2);
    consider n0 being Nat such that
A200: IF in B|^n0 by Th79;
    reconsider n0 as Element of NAT by ORDINAL1:def 12;
    consider g0 being Function of B|^n0, S() such that
A201: g0 = FF.n0 and
    EmptyIns A() in B|^n0 implies g0.EmptyIns A() = Emp() and
    for I1,I2 being Element of A() st I1\;I2 in B|^n0
    holds g0.(I1\;I2) = ConF(g0.I1,g0.I2) and
A202: for C,I1,I2 being Element of A() st if-then-else(C,I1,I2) in B|^n0
    holds g0.if-then-else(C,I1,I2) = IfF(g0.C,g0.I1,g0.I2) and
    for C,I being Element of A() st while(C,I) in B|^n0
    holds g0.while(C,I) = WhiF(g0.C,g0.I) by A166;
    consider i0 being Nat such that
A203: n0 = i0+1 and
A204: C in B|^i0 and
A205: I1 in B|^i0 and
A206: I2 in B|^i0 by A200,Th89;
    n0 > i0 by A203,NAT_1:13;
    then
A207: B|^i0 c= B|^n0 by Th21;
A208: dom g0 = B|^n0 by FUNCT_2:def 1;
A209: g0.C = f.C by A182,A201,A204,A207;
A210: g0.I1 = f.I1 by A182,A201,A205,A207;
A211: g0.I2 = f.I2 by A182,A201,A206,A207;
A212: [IF, g0.IF] in g0 by A200,A208,FUNCT_1:1;
    g0.IF = IfF(f.C,f.I1,f.I2) by A200,A202,A209,A210,A211;
    then [IF, IfF(f.C,f.I1,f.I2)] in f by A3,A201,A212,CARD_5:2;
    hence f.if-then-else(C,I1,I2) = IfF(f.C,f.I1,f.I2) by FUNCT_1:1;
  end;
  let C,I be Element of A();
  set WH = while(C,I);
  consider n0 being Nat such that
A213: WH in B|^n0 by Th79;
  reconsider n0 as Element of NAT by ORDINAL1:def 12;
  consider g0 being Function of B|^n0, S() such that
A214: g0 = FF.n0 and
  EmptyIns A() in B|^n0 implies g0.EmptyIns A() = Emp() and
  for I1,I2 being Element of A() st I1\;I2 in B|^n0
  holds g0.(I1\;I2) = ConF(g0.I1,g0.I2) and
  for C,I1,I2 being Element of A() st if-then-else(C,I1,I2) in B|^n0
  holds g0.if-then-else(C,I1,I2) = IfF(g0.C,g0.I1,g0.I2) and
A215: for C,I being Element of A() st while(C,I) in B|^n0
  holds g0.while(C,I) = WhiF(g0.C,g0.I) by A166;
  consider i0 being Nat such that
A216: n0 = i0+1 and
A217: C in B|^i0 and
A218: I in B|^i0 by A213,Th90;
  n0 > i0 by A216,NAT_1:13;
  then
A219: B|^i0 c= B|^n0 by Th21;
A220: dom g0 = B|^n0 by FUNCT_2:def 1;
A221: g0.C = f.C by A182,A214,A217,A219;
A222: g0.I = f.I by A182,A214,A218,A219;
A223: [WH, g0.WH] in g0 by A213,A220,FUNCT_1:1;
  g0.WH = WhiF(f.C,f.I) by A213,A215,A221,A222;
  then [WH, WhiF(f.C,f.I)] in f by A3,A214,A223,CARD_5:2;
  hence thesis by FUNCT_1:1;
end;

theorem
  for A being free ECIW-strict preIfWhileAlgebra
  for g being Function of [:S, ElementaryInstructions A:], S
  for s0 being Element of S ex f being ExecutionFunction of A, S, T
  st f|[:S, ElementaryInstructions A:] = g & for s being Element of S
  for C,I being Element of A st not f iteration_terminates_for I\;C, f.(s,C)
  holds f.(s, while(C,I)) = s0
proof
  let A be free ECIW-strict preIfWhileAlgebra;
  let g be Function of [:S, ElementaryInstructions A:], S;
  let s0 be Element of S;
  reconsider Ss0 = S-->s0 as Element of Funcs(S,S) by FUNCT_2:9;
  set Z = Funcs(S,S);
  deffunc ElemF(Element of A) = (curry' g).$1;
A1: for I being Element of A st I in ElementaryInstructions A
  holds ElemF(I) in Z
  proof
    let I be Element of A;
    assume
A2: I in ElementaryInstructions A;
    then reconsider B = ElementaryInstructions A as non empty set;
    reconsider I as Element of B by A2;
    reconsider g as Function of [:S,B:],S;
    (curry' g).I is Element of Z;
    hence thesis;
  end;
  reconsider idS = id S as Element of Z by FUNCT_2:126;
  deffunc ConF((Element of Z), Element of Z) = $2*$1 qua Element of Z;
  deffunc IfF((Element of Z), (Element of Z), Element of Z)
  = (($2,T)+*$3)*$1 qua Element of Z;
  deffunc WhiF((Element of Z), Element of Z)
  = ((T,Ss0) iter ($1*$2))*$1 qua Element of Z;
  consider h being Function of the carrier of A, Z such that
A3: for I being Element of A st I in ElementaryInstructions A
  holds h.I = ElemF(I) and
A4: h.EmptyIns A = idS and
A5: for I1,I2 being Element of A holds h.(I1\;I2) = ConF(h.I1,h.I2) and
A6: for C,I1,I2 being Element of A
  holds h.if-then-else(C,I1,I2) = IfF(h.C,h.I1,h.I2) and
A7: for C,I being Element of A holds h.while(C,I) = WhiF(h.C,h.I)
  from IndDef(A1);
  h in Funcs(the carrier of A, Z) by FUNCT_2:8;
  then uncurry' h in Funcs([:S, the carrier of A:], S) by FUNCT_6:11;
  then reconsider f = uncurry' h as Function of [:S, the carrier of A:], S
  by FUNCT_2:66;
A8: dom h = the carrier of A by FUNCT_2:def 1;
A9: f is complying_with_empty-instruction
  proof
    let s be Element of S;
    idS.s = s;
    hence thesis by A4,A8,FUNCT_5:39;
  end;
A10: f is complying_with_catenation
  proof
    let s be Element of S;
    let I1,I2 be Element of A;
A11: dom (h.(I1\;I2)) = S by FUNCT_2:def 1;
A12: dom (h.I1) = S by FUNCT_2:def 1;
A13: dom (h.I2) = S by FUNCT_2:def 1;
    thus f.(s,I1 \; I2) = (h.(I1\;I2)).s by A8,A11,FUNCT_5:39
      .= ((h.I2)*(h.I1)).s by A5
      .= (h.I2).((h.I1).s) by FUNCT_2:15
      .= (h.I2).(f.(s,I1)) by A8,A12,FUNCT_5:39
      .= f.(f.(s,I1),I2) by A8,A13,FUNCT_5:39;
  end;
A14: f complies_with_if_wrt T
  proof
    let s be Element of S;
    let C, I1,I2 be Element of A;
A15: dom (h.if-then-else(C,I1,I2)) = S by FUNCT_2:def 1;
A16: dom (h.C) = S by FUNCT_2:def 1;
A17: dom (h.I1) = S by FUNCT_2:def 1;
A18: dom (h.I2) = S by FUNCT_2:def 1;
A19: f.(s,if-then-else(C,I1,I2))
    = (h.if-then-else(C,I1,I2)).s by A8,A15,FUNCT_5:39
      .= IfF(h.C,h.I1,h.I2).s by A6
      .= ((h.I1,T)+*(h.I2)).((h.C).s) by FUNCT_2:15;
A20: f.(s,C) = (h.C).s by A8,A16,FUNCT_5:39;
    hereby
      assume f.(s,C) in T;
      hence f.(s,if-then-else(C,I1,I2)) = (h.I1).(f.(s,C)) by A17,A19,A20,Th4
        .= f.(f.(s,C),I1) by A8,A17,FUNCT_5:39;
    end;
    assume f.(s,C) nin T;
    hence f.(s,if-then-else(C,I1,I2)) = (h.I2).(f.(s,C)) by A18,A19,A20,Th5
      .= f.(f.(s,C),I2) by A8,A18,FUNCT_5:39;
  end;
  f complies_with_while_wrt T
  proof
    let s be Element of S;
    let C, I be Element of A;
A21: dom (h.while(C,I)) = S by FUNCT_2:def 1;
A22: dom (h.C) = S by FUNCT_2:def 1;
A23: dom (h.I) = S by FUNCT_2:def 1;
A24: dom ((h.C)*(h.I)) = S by FUNCT_2:def 1;
A25: f.(s,while(C,I)) = (h.while(C,I)).s by A8,A21,FUNCT_5:39
      .= WhiF(h.C,h.I).s by A7
      .= ((T,Ss0) iter ((h.C)*(h.I))).((h.C).s) by FUNCT_2:15;
A26: f.(s,C) = (h.C).s by A8,A22,FUNCT_5:39;
A27: rng ((h.C)*(h.I)) c= S;
    A28: now
      let z be Element of S;
      thus (Ss0*((h.C)*(h.I))).z = Ss0.(((h.C)*(h.I)).z) by FUNCT_2:15
        .= s0 by FUNCOP_1:7
        .= Ss0.z by FUNCOP_1:7;
    end;
    hereby
      assume f.(s,C) in T;
      hence f.(s,while(C,I))
      = ((T,Ss0) iter ((h.C)*(h.I))).(((h.C)*(h.I)).(f.(s,C)))
      by A24,A25,A26,A27,A28,Th11,FUNCT_2:63
        .= ((T,Ss0) iter ((h.C)*(h.I))).((h.C).((h.I).(f.(s,C))))
      by FUNCT_2:15
        .= (((T,Ss0) iter ((h.C)*(h.I)))*(h.C)).((h.I).(f.(s,C)))
      by FUNCT_2:15
        .= (((T,Ss0) iter ((h.C)*(h.I)))*(h.C)).(f.(f.(s,C),I))
      by A8,A23,FUNCT_5:39
        .= (h.while(C,I)).(f.(f.(s,C),I)) by A7
        .= f.(f.(f.(s,C),I),while(C,I)) by A8,A21,FUNCT_5:39;
    end;
    thus thesis by A24,A25,A26,A27,Th12;
  end;
  then reconsider f as ExecutionFunction of A, S, T by A9,A10,A14,Def32;
  take f;
  dom f = [:S, the carrier of A:] by FUNCT_2:def 1;
  then
A29: [:S, ElementaryInstructions A:] c= dom f by ZFMISC_1:95;
A30: dom g = [:S, ElementaryInstructions A:] by FUNCT_2:def 1;
A31: dom f /\ [:S, ElementaryInstructions A:] = [:S, ElementaryInstructions
  A:] by A29,XBOOLE_1:28;
  now
    let a be object;
    assume
A32: a in dom g;
    then consider s,I being object such that
A33: s in S and
A34: I in ElementaryInstructions A and
A35: a = [s,I] by ZFMISC_1:def 2;
    reconsider s as Element of S by A33;
    reconsider I as Element of A by A34;
    reconsider EI = (curry' g).I as Element of Z by A1,A34;
    g in Funcs([:S, ElementaryInstructions A:], S) by FUNCT_2:8;
    then curry' g in Funcs(ElementaryInstructions A, Z) by A32,FUNCT_6:10;
    then
A36: dom curry' g = ElementaryInstructions A by FUNCT_2:92;
A37: dom EI = S by FUNCT_2:92;
A38: dom (h.I) = S by FUNCT_2:92;
    thus g.a = g.(s,I) by A35
      .= EI.s by A34,A36,A37,FUNCT_5:34
      .= (h.I).s by A3,A34
      .= f.(s,I) by A8,A38,FUNCT_5:39
      .= f.a by A35;
  end;
  hence f|[:S, ElementaryInstructions A:] = g by A30,A31,FUNCT_1:46;
  let s be Element of S;
  let C,I be Element of A;
  assume
A39: not f iteration_terminates_for I\;C, f.(s,C);
A40: dom (h.while(C,I)) = S by FUNCT_2:def 1;
A41: dom (h.C) = S by FUNCT_2:def 1;
A42: dom ((h.C)*(h.I)) = S by FUNCT_2:def 1;
A43: f.(s,while(C,I)) = (h.while(C,I)).s by A8,A40,FUNCT_5:39
    .= WhiF(h.C,h.I).s by A7
    .= ((T,Ss0) iter ((h.C)*(h.I))).((h.C).s) by FUNCT_2:15;
A44: f.(s,C) = (h.C).s by A8,A41,FUNCT_5:39;
A45: rng ((h.C)*(h.I)) c= S;
  rng h c= Z;
  then h = curry' f by FUNCT_5:48;
  then (curry' f).(I\;C) = (h.C)*(h.I) by A5;
  then (h.C)*(h.I) orbit f.(s,C) c= T by A39,Th87;
  hence f.(s, while(C,I)) = Ss0.(f.(s,C)) by A42,A43,A44,A45,Def7
    .= s0 by FUNCOP_1:7;
end;

theorem
  for A being free ECIW-strict preIfWhileAlgebra
  for g being Function of [:S, ElementaryInstructions A:], S
  for F being Function of Funcs(S,S), Funcs(S,S)
  st for h being Element of Funcs(S,S) holds (F.h)*h = F.h
  ex f being ExecutionFunction of A, S, T
  st f|[:S, ElementaryInstructions A:] = g & for C,I being Element of A
  for s being Element of S st not f iteration_terminates_for I\;C, f.(s, C)
  holds f.(s, while(C, I)) = F.((curry' f).(I\;C)).(f.(s,C))
proof
  let A be free ECIW-strict preIfWhileAlgebra;
  let g be Function of [:S, ElementaryInstructions A:], S;

  let F being Function of Funcs(S,S), Funcs(S,S) such that
A1: for h being Element of Funcs(S,S) holds (F.h)*h = F.h;
  set Z = Funcs(S,S);
  deffunc ElemF(Element of A) = (curry' g).$1;
A2: for I being Element of A st I in ElementaryInstructions A
  holds ElemF(I) in Z
  proof
    let I be Element of A;
    assume
A3: I in ElementaryInstructions A;
    then reconsider B = ElementaryInstructions A as non empty set;
    reconsider I as Element of B by A3;
    reconsider g as Function of [:S,B:],S;
    (curry' g).I is Element of Z;
    hence thesis;
  end;
  reconsider idS = id S as Element of Z by FUNCT_2:126;
  deffunc ConF((Element of Z), Element of Z) = $2*$1 qua Element of Z;
  deffunc IfF((Element of Z), (Element of Z), Element of Z)
  = (($2,T)+*$3)*$1 qua Element of Z;
  deffunc WhiF((Element of Z), Element of Z)
  = ((T, F.($1*$2)) iter ($1*$2))*$1 qua Element of Z;
  consider h being Function of the carrier of A, Z such that
A4: for I being Element of A st I in ElementaryInstructions A
  holds h.I = ElemF(I) and
A5: h.EmptyIns A = idS and
A6: for I1,I2 being Element of A holds h.(I1\;I2) = ConF(h.I1,h.I2) and
A7: for C,I1,I2 being Element of A
  holds h.if-then-else(C,I1,I2) = IfF(h.C,h.I1,h.I2) and
A8: for C,I being Element of A holds h.while(C,I) = WhiF(h.C,h.I)
  from IndDef(A2);
  h in Funcs(the carrier of A, Z) by FUNCT_2:8;
  then uncurry' h in Funcs([:S, the carrier of A:], S) by FUNCT_6:11;
  then reconsider f = uncurry' h as Function of [:S, the carrier of A:], S
  by FUNCT_2:66;
A9: dom h = the carrier of A by FUNCT_2:def 1;
A10: f is complying_with_empty-instruction
  proof
    let s be Element of S;
    idS.s = s;
    hence thesis by A5,A9,FUNCT_5:39;
  end;
A11: f is complying_with_catenation
  proof
    let s be Element of S;
    let I1,I2 be Element of A;
A12: dom (h.(I1\;I2)) = S by FUNCT_2:def 1;
A13: dom (h.I1) = S by FUNCT_2:def 1;
A14: dom (h.I2) = S by FUNCT_2:def 1;
    thus f.(s,I1 \; I2) = (h.(I1\;I2)).s by A9,A12,FUNCT_5:39
      .= ((h.I2)*(h.I1)).s by A6
      .= (h.I2).((h.I1).s) by FUNCT_2:15
      .= (h.I2).(f.(s,I1)) by A9,A13,FUNCT_5:39
      .= f.(f.(s,I1),I2) by A9,A14,FUNCT_5:39;
  end;
A15: f complies_with_if_wrt T
  proof
    let s be Element of S;
    let C, I1,I2 be Element of A;
A16: dom (h.if-then-else(C,I1,I2)) = S by FUNCT_2:def 1;
A17: dom (h.C) = S by FUNCT_2:def 1;
A18: dom (h.I1) = S by FUNCT_2:def 1;
A19: dom (h.I2) = S by FUNCT_2:def 1;
A20: f.(s,if-then-else(C,I1,I2))
    = (h.if-then-else(C,I1,I2)).s by A9,A16,FUNCT_5:39
      .= IfF(h.C,h.I1,h.I2).s by A7
      .= ((h.I1,T)+*(h.I2)).((h.C).s) by FUNCT_2:15;
A21: f.(s,C) = (h.C).s by A9,A17,FUNCT_5:39;
    hereby
      assume f.(s,C) in T;
      hence f.(s,if-then-else(C,I1,I2)) = (h.I1).(f.(s,C)) by A18,A20,A21,Th4
        .= f.(f.(s,C),I1) by A9,A18,FUNCT_5:39;
    end;
    assume f.(s,C) nin T;
    hence f.(s,if-then-else(C,I1,I2)) = (h.I2).(f.(s,C)) by A19,A20,A21,Th5
      .= f.(f.(s,C),I2) by A9,A19,FUNCT_5:39;
  end;
  f complies_with_while_wrt T
  proof
    let s be Element of S;
    let C, I be Element of A;
A22: dom (h.while(C,I)) = S by FUNCT_2:def 1;
A23: dom (h.C) = S by FUNCT_2:def 1;
A24: dom (h.I) = S by FUNCT_2:def 1;
A25: dom ((h.C)*(h.I)) = S by FUNCT_2:def 1;
A26: f.(s,while(C,I)) = (h.while(C,I)).s by A9,A22,FUNCT_5:39
      .= WhiF(h.C,h.I).s by A8
      .= ((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I))).((h.C).s) by FUNCT_2:15;
A27: f.(s,C) = (h.C).s by A9,A23,FUNCT_5:39;
A28: rng ((h.C)*(h.I)) c= S;
A29: (F.((h.C)*(h.I)))*((h.C)*(h.I)) = F.((h.C)*(h.I)) by A1;
    hereby
      assume f.(s,C) in T;
      hence f.(s,while(C,I))
      = ((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I))).(((h.C)*(h.I)).(f.(s,C)))
      by A25,A26,A27,A28,A29,Th11
        .= ((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I))).((h.C).((h.I).(f.(s,C))))
      by FUNCT_2:15
        .= (((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I)))*(h.C)).((h.I).(f.(s,C)))
      by FUNCT_2:15
        .= (((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I)))*(h.C)).(f.(f.(s,C),I))
      by A9,A24,FUNCT_5:39
        .= (h.while(C,I)).(f.(f.(s,C),I)) by A8
        .= f.(f.(f.(s,C),I),while(C,I)) by A9,A22,FUNCT_5:39;
    end;
    thus thesis by A25,A26,A27,A28,Th12;
  end;
  then reconsider f as ExecutionFunction of A, S, T by A10,A11,A15,Def32;
  take f;
  dom f = [:S, the carrier of A:] by FUNCT_2:def 1;
  then
A30: [:S, ElementaryInstructions A:] c= dom f by ZFMISC_1:95;
A31: dom g = [:S, ElementaryInstructions A:] by FUNCT_2:def 1;
A32: dom f /\ [:S, ElementaryInstructions A:] = [:S, ElementaryInstructions
  A:] by A30,XBOOLE_1:28;
  now
    let a be object;
    assume
A33: a in dom g;
    then consider s,I being object such that
A34: s in S and
A35: I in ElementaryInstructions A and
A36: a = [s,I] by ZFMISC_1:def 2;
    reconsider s as Element of S by A34;
    reconsider I as Element of A by A35;
    reconsider EI = (curry' g).I as Element of Z by A2,A35;
    g in Funcs([:S, ElementaryInstructions A:], S) by FUNCT_2:8;
    then curry' g in Funcs(ElementaryInstructions A, Z) by A33,FUNCT_6:10;
    then
A37: dom curry' g = ElementaryInstructions A by FUNCT_2:92;
A38: dom EI = S by FUNCT_2:92;
A39: dom (h.I) = S by FUNCT_2:92;
    thus g.a = g.(s,I) by A36
      .= EI.s by A35,A37,A38,FUNCT_5:34
      .= (h.I).s by A4,A35
      .= f.(s,I) by A9,A39,FUNCT_5:39
      .= f.a by A36;
  end;
  hence f|[:S, ElementaryInstructions A:] = g by A31,A32,FUNCT_1:46;
  let C,I be Element of A;
  let s be Element of S;
  assume
A40: not f iteration_terminates_for I\;C, f.(s,C);
A41: dom (h.while(C,I)) = S by FUNCT_2:def 1;
A42: dom (h.C) = S by FUNCT_2:def 1;
A43: dom ((h.C)*(h.I)) = S by FUNCT_2:def 1;
A44: f.(s,while(C,I)) = (h.while(C,I)).s by A9,A41,FUNCT_5:39
    .= WhiF(h.C,h.I).s by A8
    .= ((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I))).((h.C).s) by FUNCT_2:15;
A45: f.(s,C) = (h.C).s by A9,A42,FUNCT_5:39;
A46: rng ((h.C)*(h.I)) c= S;
  rng h c= Z;
  then h = curry' f by FUNCT_5:48;
  then
A47: (curry' f).(I\;C) = (h.C)*(h.I) by A6;
  then (h.C)*(h.I) orbit f.(s,C) c= T by A40,Th87;
  hence thesis by A43,A44,A45,A46,A47,Def7;
end;

theorem
  for A being free ECIW-strict preIfWhileAlgebra
  for f1,f2 being ExecutionFunction of A, S, T
  st f1|[:S, ElementaryInstructions A:] = f2|[:S, ElementaryInstructions A:] &
  for s being Element of S for C,I being Element of A
  st not f1 iteration_terminates_for I\;C, f1.(s,C)
  holds f1.(s, while(C,I)) = f2.(s, while(C,I)) holds f1 = f2
proof
  let A be free ECIW-strict preIfWhileAlgebra;
  let f1,f2 be ExecutionFunction of A, S, T;
  assume
A1: f1|[:S, ElementaryInstructions A:] = f2|[:S, ElementaryInstructions A:];
  set g = f1|[:S, ElementaryInstructions A:];
  assume
A2: for s being Element of S for C,I being Element of A
  st not f1 iteration_terminates_for I\;C, f1.(s,C)
  holds f1.(s, while(C,I)) = f2.(s, while(C,I));
  defpred P[set] means for s being Element of S holds f1.(s, $1) = f2.(s, $1);
A3: for I being Element of A st I in ElementaryInstructions A holds P[I]
  proof
    let I be Element of A such that
A4: I in ElementaryInstructions A;
    let s be Element of S;
A5: [s,I] in [:S, ElementaryInstructions A:] by A4,ZFMISC_1:87;
    hence f1.(s,I) = g.[s,I] by FUNCT_1:49
      .= f2.(s,I) by A1,A5,FUNCT_1:49;
  end;
A6: P[EmptyIns A]
  proof
    let s be Element of S;
    thus f1.(s, EmptyIns A) = s by Def28
      .= f2.(s, EmptyIns A) by Def28;
  end;
A7: for I1,I2 being Element of A st P[I1] & P[I2] holds P[I1\;I2]
  proof
    let I1,I2 be Element of A such that
A8: P[I1] and
A9: P[I2];
    let s be Element of S;
    thus f1.(s, I1\;I2) = f1.(f1.(s, I1), I2) by Def29
      .= f1.(f2.(s, I1), I2) by A8
      .= f2.(f2.(s, I1), I2) by A9
      .= f2.(s, I1\;I2) by Def29;
  end;
A10: for C,I1,I2 being Element of A st P[C] & P[I1] & P[I2]
  holds P[if-then-else(C,I1,I2)]
  proof
    let C,I1,I2 be Element of A such that
A11: P[C] and
A12: P[I1] and
A13: P[I2];
    let s be Element of S;
A14: f1 complies_with_if_wrt T by Def32;
A15: f2 complies_with_if_wrt T by Def32;
A16: f1.(s, C) = f2.(s, C) by A11;
    per cases;
    suppose
A17:  f1.(s,C) in T;
      hence f1.(s, if-then-else(C,I1,I2)) = f1.(f1.(s, C), I1) by A14
        .= f2.(f1.(s, C), I1) by A12
        .= f2.(s, if-then-else(C,I1,I2)) by A15,A16,A17;
    end;
    suppose
A18:  f1.(s,C) nin T;
      hence f1.(s, if-then-else(C,I1,I2)) = f1.(f1.(s, C), I2) by A14
        .= f2.(f1.(s, C), I2) by A13
        .= f2.(s, if-then-else(C,I1,I2)) by A15,A16,A18;
    end;
  end;
A19: for C,I being Element of A st P[C] & P[I] holds P[while(C,I)]
  proof
    let C,I be Element of A such that
A20: P[C] and
A21: P[I];
    let s be Element of S;
    now
      assume f1 iteration_terminates_for I\;C, f1.(s,C);
      then consider r being non empty FinSequence of S such that
A22:  r.1 = f1.(s, C) and
A23:  r.len r nin T and
A24:  for i being Nat st 1 <= i & i < len r
      holds r.i in T & r.(i+1) = f1.(r.i, I\;C);
A25:  f1.(s, C) = f2.(s, C) by A20;
A26:  now
        let i be Nat;
        assume that
A27:    1 <= i and
A28:    i < len r;
        thus r.i in T by A24,A27,A28;
        then reconsider si = r.i as Element of S;
        thus r.(i+1) = f1.(si, I\;C) by A24,A27,A28
          .= f1.(f1.(si,I),C) by Def29
          .= f1.(f2.(si,I),C) by A21
          .= f2.(f2.(si,I),C) by A20
          .= f2.(r.i, I\;C) by Def29;
      end;
      thus f1.(s, while(C,I)) = r.len r by A22,A23,A24,Th86
        .= f2.(s, while(C,I)) by A22,A23,A25,A26,Th86;
    end;
    hence thesis by A2;
  end;
  now
    let sI be Element of [:S, the carrier of A:];
    consider s,I being object such that
A29: s in S and
A30: I in the carrier of A and
A31: sI = [s,I] by ZFMISC_1:def 2;
    reconsider I as Element of A by A30;
    reconsider s as Element of S by A29;
    P[I] from StructInd(A3,A6,A7,A10,A19);
    then f1.(s,I) = f2.(s,I);
    hence f1.sI = f2.sI by A31;
  end;
  hence thesis by FUNCT_2:63;
end;

definition
  let A be preIfWhileAlgebra;
  let S be non empty set;
  let T be Subset of S;
  let f be ExecutionFunction of A, S, T;
  defpred Q[set] means
  [:S, ElementaryInstructions A:] c= $1 & [:S, {EmptyIns A}:] c= $1 &
  for s being Element of S for C,I,J being Element of A holds
  ([s,I] in $1 & [f.(s,I), J] in $1 implies [s, I\;J] in $1) &
  ([s,C] in $1 & [f.(s,C), I] in $1 & f.(s, C) in T
  implies [s, if-then-else(C,I,J)] in $1) &
  ([s,C] in $1 & [f.(s,C), J] in $1 & f.(s, C) nin T
  implies [s, if-then-else(C,I,J)] in $1) & ([s,C] in $1 &
  (ex r being non empty FinSequence of S st r.1 = f.(s,C) & r.len r nin T &
  for i being Nat st 1 <= i & i < len r
  holds r.i in T & [r.i, I\;C] in $1 & r.(i+1) = f.(r.i, I\;C))
  implies [s, while(C,I)] in $1);
  func TerminatingPrograms(A,S,T,f) -> Subset of [:S, the carrier of A:] means
  :
  Def35: ([:S, ElementaryInstructions A:] c= it & [:S, {EmptyIns A}:] c= it &
  for s being Element of S for C,I,J being Element of A holds
  ([s,I] in it & [f.(s,I), J] in it implies [s, I\;J] in it) &
  ([s,C] in it & [f.(s,C), I] in it & f.(s, C) in T
  implies [s, if-then-else(C,I,J)] in it) &
  ([s,C] in it & [f.(s,C), J] in it & f.(s, C) nin T
  implies [s, if-then-else(C,I,J)] in it) & ([s,C] in it &
  (ex r being non empty FinSequence of S st r.1 = f.(s,C) & r.len r nin T &
  for i being Nat st 1 <= i & i < len r
  holds r.i in T & [r.i, I\;C] in it & r.(i+1) = f.(r.i, I\;C))
  implies [s, while(C,I)] in it) ) &
  for P being Subset of [:S, the carrier of A:] st
  [:S, ElementaryInstructions A:] c= P & [:S, {EmptyIns A}:] c= P &
  for s being Element of S for C,I,J being Element of A holds
  ([s,I] in P & [f.(s,I), J] in P implies [s, I\;J] in P) &
  ([s,C] in P & [f.(s,C), I] in P & f.(s, C) in T
  implies [s, if-then-else(C,I,J)] in P) &
  ([s,C] in P & [f.(s,C), J] in P & f.(s, C) nin T
  implies [s, if-then-else(C,I,J)] in P) & ([s,C] in P &
  (ex r being non empty FinSequence of S st r.1 = f.(s,C) & r.len r nin T &
  for i being Nat st 1 <= i & i < len r
  holds r.i in T & [r.i, I\;C] in P & r.(i+1) = f.(r.i, I\;C))
  implies [s, while(C,I)] in P) holds it c= P;
  existence
  proof
    set QQ = {Z where Z is Subset of [:S, the carrier of A:]: Q[Z]};
    set IT = meet QQ;
    Q[ [#] [:S, the carrier of A:] ]
    proof
      set Y = [#] [:S, the carrier of A:];
      {EmptyIns A} c= the carrier of A by ZFMISC_1:31;
      hence
      [:S, ElementaryInstructions A:] c= Y & [:S, {EmptyIns A}:] c= Y
      by ZFMISC_1:95;
      thus thesis by ZFMISC_1:87;
    end;
    then
A1: [:S, the carrier of A:] in QQ;
    then reconsider IT as Subset of [:S, the carrier of A:] by SETFAM_1:3;
    take IT;
    now
      let a be set;
      assume a in QQ;
      then ex Z being Subset of [:S, the carrier of A:] st a = Z & Q[Z];
      hence [:S, ElementaryInstructions A:] c= a;
    end;
    hence [:S, ElementaryInstructions A:] c= IT by A1,SETFAM_1:5;
    now
      let a be set;
      assume a in QQ;
      then ex Z being Subset of [:S, the carrier of A:] st a = Z & Q[Z];
      hence [:S, {EmptyIns A}:] c= a;
    end;
    hence [:S, {EmptyIns A}:] c= IT by A1,SETFAM_1:5;
    hereby
      let s be Element of S;
      let C,I,J be Element of A;
      hereby
        assume that
A2:     [s,I] in IT and
A3:     [f.(s,I), J] in IT;
        now
          let a be set;
          assume
A4:       a in QQ;
          then
A5:       [s,I] in a by A2,SETFAM_1:def 1;
A6:       [f.(s,I), J] in a by A3,A4,SETFAM_1:def 1;
          ex Z being Subset of [:S, the carrier of A:] st a = Z & Q[Z] by A4;
          hence [s, I\;J] in a by A5,A6;
        end;
        hence [s, I\;J] in IT by A1,SETFAM_1:def 1;
      end;
      hereby
        assume that
A7:     [s,C] in IT and
A8:     [f.(s,C), I] in IT and
A9:     f.(s, C) in T;
        now
          let a be set;
          assume
A10:      a in QQ;
          then
A11:      [s,C] in a by A7,SETFAM_1:def 1;
A12:      [f.(s,C), I] in a by A8,A10,SETFAM_1:def 1;
          ex Z being Subset of [:S, the carrier of A:] st a = Z & Q[Z] by A10;
          hence [s, if-then-else(C,I,J)] in a by A9,A11,A12;
        end;
        hence [s, if-then-else(C,I,J)] in IT by A1,SETFAM_1:def 1;
      end;
      hereby
        assume that
A13:    [s,C] in IT and
A14:    [f.(s,C), J] in IT and
A15:    f.(s, C) nin T;
        now
          let a be set;
          assume
A16:      a in QQ;
          then
A17:      [s,C] in a by A13,SETFAM_1:def 1;
A18:      [f.(s,C), J] in a by A14,A16,SETFAM_1:def 1;
          ex Z being Subset of [:S, the carrier of A:] st a = Z & Q[Z] by A16;
          hence [s, if-then-else(C,I,J)] in a by A15,A17,A18;
        end;
        hence [s, if-then-else(C,I,J)] in IT by A1,SETFAM_1:def 1;
      end;
      assume
A19:  [s,C] in IT;
      given r being non empty FinSequence of S such that
A20:  r.1 = f.(s,C) and
A21:  r.len r nin T and
A22:  for i being Nat st 1 <= i & i < len r holds r.i in T & [r.i, I\;C]
      in IT & r.(i+1) = f.(r.i, I\;C);
      now
        let a be set;
        assume
A23:    a in QQ;
A24:    now
          let i be Nat;
          assume that
A25:      1 <= i and
A26:      i < len r;
          [r.i, I\;C] in IT by A22,A25,A26;
          hence r.i in T & [r.i, I\;C] in a & r.(i+1) = f.(r.i, I\;C)
          by A22,A23,A25,A26,SETFAM_1:def 1;
        end;
A27:    [s,C] in a by A19,A23,SETFAM_1:def 1;
        ex Z being Subset of [:S, the carrier of A:] st a = Z & Q[Z] by A23;
        hence [s, while(C,I)] in a by A20,A21,A24,A27;
      end;
      hence [s, while(C,I)] in IT by A1,SETFAM_1:def 1;
    end;
    let Y be Subset of [:S, the carrier of A:];
    assume Q[Y];
    then Y in QQ;
    hence thesis by SETFAM_1:3;
  end;
  uniqueness
  proof
    let Y1,Y2 being Subset of [:S, the carrier of A:] such that
A28: Q[Y1] and
A29: for Y being Subset of [:S, the carrier of A:] st Q[Y] holds Y1 c= Y and
A30: Q[Y2] and
A31: for Y being Subset of [:S, the carrier of A:] st Q[Y] holds Y2 c= Y;
    thus Y1 c= Y2 by A29,A30;
    thus thesis by A28,A31;
  end;
end;

definition
  let A be preIfWhileAlgebra;
  let I be Element of A;
  attr I is absolutely-terminating means
  :
  Def36: for S being non empty set, s being Element of S
  for T being Subset of S for f being ExecutionFunction of A, S, T
  holds [s,I] in TerminatingPrograms(A,S,T,f);
end;

definition
  let A be preIfWhileAlgebra;
  let S be non empty set;
  let T be Subset of S;
  let I be Element of A;
  let f be ExecutionFunction of A, S, T;
  pred I is_terminating_wrt f means

  for s being Element of S holds [s,I] in TerminatingPrograms(A, S, T, f);
end;

definition
  let A be preIfWhileAlgebra;
  let S be non empty set;
  let T be Subset of S;
  let I be Element of A;
  let f be ExecutionFunction of A, S, T;
  let Z be set;
  pred I is_terminating_wrt f, Z means
   for s being Element of S st s in Z
  holds [s,I] in TerminatingPrograms(A, S, T, f);
  pred Z is_invariant_wrt I, f means
   for s being Element of S st s in Z holds f.(s, I) in Z;
end;

theorem Th94:
  I in ElementaryInstructions A implies [s, I] in TerminatingPrograms(A,S,T,f)
proof
  assume I in ElementaryInstructions A;
  then
A1: [s, I] in [:S, ElementaryInstructions A:] by ZFMISC_1:87;
  [:S, ElementaryInstructions A:] c= TerminatingPrograms(A,S,T,f) by Def35;
  hence thesis by A1;
end;

theorem
  I in ElementaryInstructions A implies I is absolutely-terminating
by Th94;

theorem Th96:
  [s, EmptyIns A] in TerminatingPrograms(A,S,T,f)
proof
  set I = EmptyIns A;
  I in {I} by TARSKI:def 1;
  then
A1: [s, I] in [:S, {I}:] by ZFMISC_1:87;
  [:S, {I}:] c= TerminatingPrograms(A,S,T,f) by Def35;
  hence thesis by A1;
end;

registration
  let A;
  cluster EmptyIns A -> absolutely-terminating;
  coherence
  by Th96;
end;

registration
  let A;
  cluster absolutely-terminating for Element of A;
  existence
  proof
    take EmptyIns A;
    thus thesis;
  end;
end;

theorem Th97:
  A is free & [s, I\;J] in TerminatingPrograms(A,S,T,f) implies
  [s,I] in TerminatingPrograms(A,S,T,f) &
  [f.(s,I), J] in TerminatingPrograms(A,S,T,f)
proof
  set TP = TerminatingPrograms(A,S,T,f);
  assume that
A1: A is free and
A2: [s, I\;J] in TP;
  reconsider P = TP \ {[s, I\;J]} as Subset of [:S, the carrier of A:];
A3: [:S, ElementaryInstructions A:] c= P
  proof
    let x,y be object;
    assume
A4: [x,y] in [:S, ElementaryInstructions A:];
A5: I <> I\;J by A1,Th73;
A6: J <> I\;J by A1,Th73;
    y in ElementaryInstructions A by A4,ZFMISC_1:87;
    then
A7: y <> I\;J by A5,A6,Th50;
A8: [:S, ElementaryInstructions A:] c= TP by Def35;
    [x,y] <> [s, I\;J] by A7,XTUPLE_0:1;
    then [x,y] nin {[s, I\;J]} by TARSKI:def 1;
    hence thesis by A4,A8,XBOOLE_0:def 5;
  end;
A9: [:S, {EmptyIns A}:] c= P
  proof
    let x,y be object;
    assume
A10: [x,y] in [:S, {EmptyIns A}:];
    then y in {EmptyIns A} by ZFMISC_1:87;
    then y = EmptyIns A by TARSKI:def 1;
    then
A11: y <> I\;J by A1,Th72;
A12: [:S, {EmptyIns A}:] c= TP by Def35;
    [x,y] <> [s, I\;J] by A11,XTUPLE_0:1;
    then [x,y] nin {[s, I\;J]} by TARSKI:def 1;
    hence thesis by A10,A12,XBOOLE_0:def 5;
  end;
  set rr = s, IJ = I\;J;
A13: now
    let s be Element of S;
    let C,I,J be Element of A;
    hereby
      assume that
A14:  [s,C] in P and
A15:  [f.(s,C), I] in P and
A16:  f.(s, C) in T;
A17:  [s,C] in TP by A14,ZFMISC_1:56;
A18:  [f.(s,C), I] in TP by A15,ZFMISC_1:56;
A19:  IJ <> if-then-else(C,I,J) by A1,Th73;
A20:  [s, if-then-else(C,I,J)] in TP by A16,A17,A18,Def35;
      [rr,IJ] <> [s, if-then-else(C,I, J)] by A19,XTUPLE_0:1;
      hence [s, if-then-else(C,I,J)] in P by A20,ZFMISC_1:56;
    end;
    hereby
      assume that
A21:  [s,C] in P and
A22:  [f.(s,C), J] in P and
A23:  f.(s, C) nin T;
A24:  [s,C] in TP by A21,ZFMISC_1:56;
A25:  [f.(s,C), J] in TP by A22,ZFMISC_1:56;
A26:  IJ <> if-then-else(C,I,J) by A1,Th73;
A27:  [s, if-then-else(C,I,J)] in TP by A23,A24,A25,Def35;
      [rr,IJ] <> [s, if-then-else(C,I, J)] by A26,XTUPLE_0:1;
      hence [s, if-then-else(C,I,J)] in P by A27,ZFMISC_1:56;
    end;
    assume
A28: [s,C] in P;
    given r being non empty FinSequence of S such that
A29: r.1 = f.(s,C) and
A30: r.len r nin T and
A31: for i being Nat st 1 <= i & i < len r
    holds r.i in T & [r.i, I\;C] in P & r.(i+1) = f.(r.i, I\;C);
A32: now
      let i be Nat;
      assume that
A33:  1 <= i and
A34:  i < len r;
      [r.i, I\;C] in P by A31,A33,A34;
      hence r.i in T & [r.i, I\;C] in TP & r.(i+1) = f.(r.i, I\;C)
      by A31,A33,A34,ZFMISC_1:56;
    end;
A35: [s,C] in TP by A28,ZFMISC_1:56;
A36: while(C,I) <> IJ by A1,Th73;
A37: [s, while(C,I)] in TP by A29,A30,A32,A35,Def35;
    [s, while(C,I)] <> [rr,IJ] by A36,XTUPLE_0:1;
    hence [s, while(C,I)] in P by A37,ZFMISC_1:56;
  end;
  hereby
    assume
A38: [rr,I] nin TP;
    now
      let q be Element of S;
      let C,I9,J9 be Element of A;
      assume that
A39:  [q,I9] in P and
A40:  [f.(q,I9), J9] in P;
A41:  [q,I9] in TP by A39,ZFMISC_1:56;
A42:  [f.(q,I9), J9] in TP by A40,ZFMISC_1:56;
A43:  q <> rr or I9\;J9 <> I\;J by A1,A38,A41,Th73;
A44:  [q, I9\;J9] in TP by A41,A42,Def35;
      [q,I9\;J9] <> [rr,I\;J] by A43,XTUPLE_0:1;
      hence [q, I9\;J9] in P by A44,ZFMISC_1:56;
    end;
    then for s being Element of S for C,I,J being Element of A holds
    ([s,I] in P & [f.(s,I), J] in P implies [s, I\;J] in P) &
    ([s,C] in P & [f.(s,C), I] in P & f.(s, C) in T
    implies [s, if-then-else(C,I,J)] in P) &
    ([s,C] in P & [f.(s,C), J] in P & f.(s, C) nin T
    implies [s, if-then-else(C,I,J)] in P) & ([s,C] in P &
    (ex r being non empty FinSequence of S st r.1 = f.(s,C) & r.len r nin T &
    for i being Nat st 1 <= i & i < len r
    holds r.i in T & [r.i, I\;C] in P & r.(i+1) = f.(r.i, I\;C))
    implies [s, while(C,I)] in P) by A13;
    then TP c= P by A3,A9,Def35;
    hence contradiction by A2,ZFMISC_1:56;
  end;
  assume
A45: [f.(s,I), J] nin TP;
  now
    let q be Element of S;
    let C,I9,J9 be Element of A;
    assume that
A46: [q,I9] in P and
A47: [f.(q,I9), J9] in P;
A48: [q,I9] in TP by A46,ZFMISC_1:56;
A49: [f.(q,I9), J9] in TP by A47,ZFMISC_1:56;
    f.(q,I9) <> f.(s,I) or J9 <> J by A45,A47,ZFMISC_1:56;
    then
A50: q <> s or I9\;J9 <> I\;J by A1,Th73;
A51: [q, I9\;J9] in TP by A48,A49,Def35;
    [q,I9\;J9] <> [rr,I\;J] by A50,XTUPLE_0:1;
    hence [q, I9\;J9] in P by A51,ZFMISC_1:56;
  end;
  then for s being Element of S for C,I,J being Element of A holds
  ([s,I] in P & [f.(s,I), J] in P implies [s, I\;J] in P) &
  ([s,C] in P & [f.(s,C), I] in P & f.(s, C) in T
  implies [s, if-then-else(C,I,J)] in P) &
  ([s,C] in P & [f.(s,C), J] in P & f.(s, C) nin T
  implies [s, if-then-else(C,I,J)] in P) & ([s,C] in P &
  (ex r being non empty FinSequence of S st r.1 = f.(s,C) & r.len r nin T &
  for i being Nat st 1 <= i & i < len r
  holds r.i in T & [r.i, I\;C] in P & r.(i+1) = f.(r.i, I\;C))
  implies [s, while(C,I)] in P) by A13;
  then TP c= P by A3,A9,Def35;
  hence contradiction by A2,ZFMISC_1:56;
end;

registration
  let A;
  let I,J be absolutely-terminating Element of A;
  cluster I\;J -> absolutely-terminating;
  coherence
  proof
    let S,s,T,f;
A1: [s,I] in TerminatingPrograms(A,S,T,f) by Def36;
    [f.(s,I),J] in TerminatingPrograms(A,S,T,f) by Def36;
    hence thesis by A1,Def35;
  end;
end;

theorem Th98:
  A is free & [s, if-then-else(C,I,J)] in TerminatingPrograms(A,S,T,f)
  implies [s,C] in TerminatingPrograms(A,S,T,f) &
  (f.(s,C) in T implies [f.(s,C), I] in TerminatingPrograms(A,S,T,f)) &
  (f.(s,C) nin T implies [f.(s,C), J] in TerminatingPrograms(A,S,T,f))
proof
  set TP = TerminatingPrograms(A,S,T,f);
  set rr = s, IJ = if-then-else(C,I,J);
  assume that
A1: A is free and
A2: [s, IJ] in TP;
  reconsider P = TP \ {[s, IJ]} as Subset of [:S, the carrier of A:];
A3: [:S, ElementaryInstructions A:] c= P
  proof
    let x,y be object;
    assume
A4: [x,y] in [:S, ElementaryInstructions A:];
    then y in ElementaryInstructions A by ZFMISC_1:87;
    then
A5: y <> IJ by Th51;
A6: [:S, ElementaryInstructions A:] c= TP by Def35;
    [x,y] <> [s, IJ] by A5,XTUPLE_0:1;
    then [x,y] nin {[s, IJ]} by TARSKI:def 1;
    hence thesis by A4,A6,XBOOLE_0:def 5;
  end;
A7: [:S, {EmptyIns A}:] c= P
  proof
    let x,y be object;
    assume
A8: [x,y] in [:S, {EmptyIns A}:];
    then y in {EmptyIns A} by ZFMISC_1:87;
    then y = EmptyIns A by TARSKI:def 1;
    then
A9: y <> IJ by A1,Th72;
A10: [:S, {EmptyIns A}:] c= TP by Def35;
    [x,y] <> [s, IJ] by A9,XTUPLE_0:1;
    then [x,y] nin {[s, IJ]} by TARSKI:def 1;
    hence thesis by A8,A10,XBOOLE_0:def 5;
  end;
A11: now
    let s be Element of S;
    let C,I,J be Element of A;
    hereby
      assume that
A12:  [s,I] in P and
A13:  [f.(s,I), J] in P;
A14:  [s,I] in TP by A12,ZFMISC_1:56;
A15:  [f.(s,I), J] in TP by A13,ZFMISC_1:56;
A16:  IJ <> I\;J by A1,Th73;
A17:  [s, I\;J] in TP by A14,A15,Def35;
      [rr,IJ] <> [s, I\;J] by A16,XTUPLE_0:1;
      hence [s, I\;J] in P by A17,ZFMISC_1:56;
    end;
    assume
A18: [s,C] in P;
    given r being non empty FinSequence of S such that
A19: r.1 = f.(s,C) and
A20: r.len r nin T and
A21: for i being Nat st 1 <= i & i < len r
    holds r.i in T & [r.i, I\;C] in P & r.(i+1) = f.(r.i, I\;C);
A22: now
      let i be Nat;
      assume that
A23:  1 <= i and
A24:  i < len r;
      [r.i, I\;C] in P by A21,A23,A24;
      hence r.i in T & [r.i, I\;C] in TP & r.(i+1) = f.(r.i, I\;C)
      by A21,A23,A24,ZFMISC_1:56;
    end;
A25: [s,C] in TP by A18,ZFMISC_1:56;
A26: while(C,I) <> IJ by A1,Th74;
A27: [s, while(C,I)] in TP by A19,A20,A22,A25,Def35;
    [s, while(C,I)] <> [rr,IJ] by A26,XTUPLE_0:1;
    hence [s, while(C,I)] in P by A27,ZFMISC_1:56;
  end;
  hereby
    assume
A28: [s,C] nin TerminatingPrograms(A,S,T,f);
A29: now
      let s be Element of S;
      let C9,I,J be Element of A;
      assume that
A30:  [s,C9] in P and
A31:  [f.(s,C9), I] in P and
A32:  f.(s, C9) in T;
A33:  [s,C9] in TP by A30,ZFMISC_1:56;
A34:  [f.(s,C9), I] in TP by A31,ZFMISC_1:56;
A35:  IJ <> if-then-else(C9,I,J) or rr <> s by A1,A28,A33,Th74;
A36:  [s, if-then-else(C9,I,J)] in TP by A32,A33,A34,Def35;
      [rr,IJ] <> [s, if-then-else(C9, I,J)] by A35,XTUPLE_0:1;
      hence [s, if-then-else(C9,I,J)] in P by A36,ZFMISC_1:56;
    end;
    now
      let s be Element of S;
      let C9,I,J be Element of A;
      assume that
A37:  [s,C9] in P and
A38:  [f.(s,C9), J] in P and
A39:  f.(s, C9) nin T;
A40:  [s,C9] in TP by A37,ZFMISC_1:56;
A41:  [f.(s,C9), J] in TP by A38,ZFMISC_1:56;
A42:  IJ <> if-then-else(C9,I,J) or rr <> s by A1,A28,A40,Th74;
A43:  [s, if-then-else(C9,I,J)] in TP by A39,A40,A41,Def35;
      [rr,IJ] <> [s, if-then-else(C9, I,J)] by A42,XTUPLE_0:1;
      hence [s, if-then-else(C9,I,J)] in P by A43,ZFMISC_1:56;
    end;
    then TP c= P by A3,A7,A11,A29,Def35;
    hence contradiction by A2,ZFMISC_1:56;
  end;
  thus
  f.(s,C) in T implies [f.(s,C), I] in TerminatingPrograms(A,S,T,f)
  proof
    assume that
A44: f.(s,C) in T and
A45: [f.(s,C), I] nin TP;
A46: now
      let s be Element of S;
      let C9,I9,J be Element of A;
      assume that
A47:  [s,C9] in P and
A48:  [f.(s,C9), I9] in P and
A49:  f.(s, C9) in T;
A50:  [s,C9] in TP by A47,ZFMISC_1:56;
A51:  [f.(s,C9), I9] in TP by A48,ZFMISC_1:56;
      f.(s,C9) <> f.(rr,C) or I <> I9 by A45,A48,ZFMISC_1:56;
      then
A52:  IJ <> if-then-else(C9,I9,J) or rr <> s by A1,Th74;
A53:  [s,if-then-else(C9,I9,J)] in TP by A49,A50,A51,Def35;
      [rr,IJ] <> [s,if-then-else(C9, I9,J)] by A52,XTUPLE_0:1;
      hence [s, if-then-else(C9,I9,J)] in P by A53,ZFMISC_1:56;
    end;
    now
      let s be Element of S;
      let C9,I,J9 be Element of A;
      assume that
A54:  [s,C9] in P and
A55:  [f.(s,C9), J9] in P and
A56:  f.(s, C9) nin T;
A57:  [s,C9] in TP by A54,ZFMISC_1:56;
A58:  [f.(s,C9), J9] in TP by A55,ZFMISC_1:56;
A59:  IJ <> if-then-else(C9,I,J9) or rr <> s by A1,A44,A56,Th74;
A60:  [s,if-then-else(C9,I,J9)] in TP by A56,A57,A58,Def35;
      [rr,IJ] <> [s,if-then-else(C9,I,J9)] by A59,XTUPLE_0:1;
      hence [s, if-then-else(C9,I,J9)] in P by A60,ZFMISC_1:56;
    end;
    then TP c= P by A3,A7,A11,A46,Def35;
    hence contradiction by A2,ZFMISC_1:56;
  end;
  assume that
A61: f.(s,C) nin T and
A62: [f.(s,C), J] nin TP;
A63: now
    let s be Element of S;
    let C9,I9,J be Element of A;
    assume that
A64: [s,C9] in P and
A65: [f.(s,C9), I9] in P and
A66: f.(s, C9) in T;
A67: [s,C9] in TP by A64,ZFMISC_1:56;
A68: [f.(s,C9), I9] in TP by A65,ZFMISC_1:56;
A69: IJ <> if-then-else(C9,I9,J) or rr <> s by A1,A61,A66,Th74;
A70: [s,if-then-else(C9,I9,J)] in TP by A66,A67,A68,Def35;
    [rr,IJ] <> [s,if-then-else(C9,I9, J)] by A69,XTUPLE_0:1;
    hence [s, if-then-else(C9,I9,J)] in P by A70,ZFMISC_1:56;
  end;
  now
    let s be Element of S;
    let C9,I,J9 be Element of A;
    assume that
A71: [s,C9] in P and
A72: [f.(s,C9), J9] in P and
A73: f.(s, C9) nin T;
A74: [s,C9] in TP by A71,ZFMISC_1:56;
A75: [f.(s,C9), J9] in TP by A72,ZFMISC_1:56;
    f.(s,C9) <> f.(rr,C) or J <> J9 by A62,A72,ZFMISC_1:56;
    then
A76: IJ <> if-then-else(C9,I,J9) or rr <> s by A1,Th74;
A77: [s,if-then-else(C9,I,J9)] in TP by A73,A74,A75,Def35;
    [rr,IJ] <> [s,if-then-else(C9,I, J9)] by A76,XTUPLE_0:1;
    hence [s, if-then-else(C9,I,J9)] in P by A77,ZFMISC_1:56;
  end;
  then TP c= P by A3,A7,A11,A63,Def35;
  hence contradiction by A2,ZFMISC_1:56;
end;

registration
  let A;
  let C,I,J be absolutely-terminating Element of A;
  cluster if-then-else(C,I,J) -> absolutely-terminating;
  coherence
  proof
    let S,s,T,f;
A1: [s,C] in TerminatingPrograms(A,S,T,f) by Def36;
A2: f.(s,C) in T or f.(s,C) nin T;
A3: [f.(s,C),I] in TerminatingPrograms(A,S,T,f) by Def36;
    [f.(s,C),J] in TerminatingPrograms(A,S,T,f) by Def36;
    hence thesis by A1,A2,A3,Def35;
  end;
end;

registration
  let A;
  let C,I be absolutely-terminating Element of A;
  cluster if-then(C,I) -> absolutely-terminating;
  coherence;
end;

theorem Th99:
  A is free & [s, while(C,I)] in TerminatingPrograms(A,S,T,f)
  implies [s,C] in TerminatingPrograms(A,S,T,f) &
  ex r being non empty FinSequence of S st r.1 = f.(s,C) & r.len r nin T &
  for i being Nat st 1 <= i & i < len r
  holds r.i in T & [r.i, I\;C] in TerminatingPrograms(A,S,T,f) &
  r.(i+1) = f.(r.i, I\;C)
proof
  set TP = TerminatingPrograms(A,S,T,f);
  set rr = s, IJ = while(C,I);
  assume that
A1: A is free and
A2: [s, IJ] in TP;
  reconsider P = TP \ {[s, IJ]} as Subset of [:S, the carrier of A:];
A3: [:S, ElementaryInstructions A:] c= P
  proof
    let x,y be object;
    assume
A4: [x,y] in [:S, ElementaryInstructions A:];
    then y in ElementaryInstructions A by ZFMISC_1:87;
    then
A5: y <> IJ by Th52;
A6: [:S, ElementaryInstructions A:] c= TP by Def35;
    [x,y] <> [s, IJ] by A5,XTUPLE_0:1;
    then [x,y] nin {[s, IJ]} by TARSKI:def 1;
    hence thesis by A4,A6,XBOOLE_0:def 5;
  end;
A7: [:S, {EmptyIns A}:] c= P
  proof
    let x,y be object;
    assume
A8: [x,y] in [:S, {EmptyIns A}:];
    then y in {EmptyIns A} by ZFMISC_1:87;
    then y = EmptyIns A by TARSKI:def 1;
    then
A9: y <> IJ by A1,Th72;
A10: [:S, {EmptyIns A}:] c= TP by Def35;
    [x,y] <> [s, IJ] by A9,XTUPLE_0:1;
    then [x,y] nin {[s, IJ]} by TARSKI:def 1;
    hence thesis by A8,A10,XBOOLE_0:def 5;
  end;
A11: now
    let s be Element of S;
    let C,I,J be Element of A;
    hereby
      assume that
A12:  [s,I] in P and
A13:  [f.(s,I), J] in P;
A14:  [s,I] in TP by A12,ZFMISC_1:56;
A15:  [f.(s,I), J] in TP by A13,ZFMISC_1:56;
A16:  IJ <> I\;J by A1,Th73;
A17:  [s, I\;J] in TP by A14,A15,Def35;
      [rr,IJ] <> [s, I\;J] by A16,XTUPLE_0:1;
      hence [s, I\;J] in P by A17,ZFMISC_1:56;
    end;
    hereby
      assume that
A18:  [s,C] in P and
A19:  [f.(s,C), I] in P and
A20:  f.(s, C) in T;
A21:  [s,C] in TP by A18,ZFMISC_1:56;
A22:  [f.(s,C), I] in TP by A19,ZFMISC_1:56;
A23:  IJ <> if-then-else(C,I,J) by A1,Th74;
A24:  [s, if-then-else(C,I,J)] in TP by A20,A21,A22,Def35;
      [rr,IJ] <> [s, if-then-else(C,I, J)] by A23,XTUPLE_0:1;
      hence [s, if-then-else(C,I,J)] in P by A24,ZFMISC_1:56;
    end;
    hereby
      assume that
A25:  [s,C] in P and
A26:  [f.(s,C), J] in P and
A27:  f.(s, C) nin T;
A28:  [s,C] in TP by A25,ZFMISC_1:56;
A29:  [f.(s,C), J] in TP by A26,ZFMISC_1:56;
A30:  IJ <> if-then-else(C,I,J) by A1,Th74;
A31:  [s, if-then-else(C,I,J)] in TP by A27,A28,A29,Def35;
      [rr,IJ] <> [s, if-then-else(C,I, J)] by A30,XTUPLE_0:1;
      hence [s, if-then-else(C,I,J)] in P by A31,ZFMISC_1:56;
    end;
  end;
  hereby
    assume
A32: [s,C] nin TerminatingPrograms(A,S,T,f);
    now
      let s be Element of S;
      let C9,I9,J be Element of A;
      assume
A33:  [s,C9] in P;
      given r being non empty FinSequence of S such that
A34:  r.1 = f.(s,C9) and
A35:  r.len r nin T and
A36:  for i being Nat st 1 <= i & i < len r
      holds r.i in T & [r.i, I9\;C9] in P & r.(i+1) = f.(r.i, I9\;C9);
A37:  now
        let i be Nat;
        assume that
A38:    1 <= i and
A39:    i < len r;
        [r.i, I9\;C9] in P by A36,A38,A39;
        hence r.i in T & [r.i, I9\;C9] in TP & r.(i+1) = f.(r.i, I9\;C9)
        by A36,A38,A39,ZFMISC_1:56;
      end;
A40:  [s,C9] in TP by A33,ZFMISC_1:56;
      then
A41:  while(C9,I9) <> IJ or s <> rr by A1,A32,Th75;
A42:  [s, while(C9,I9)] in TP by A34,A35,A37,A40,Def35;
      [s, while(C9,I9)] <> [rr,IJ] by A41,XTUPLE_0:1;
      hence [s, while(C9,I9)] in P by A42,ZFMISC_1:56;
    end;
    then for s being Element of S for C,I,J being Element of A holds
    ([s,I] in P & [f.(s,I), J] in P implies [s, I\;J] in P) &
    ([s,C] in P & [f.(s,C), I] in P & f.(s, C) in T
    implies [s, if-then-else(C,I,J)] in P) &
    ([s,C] in P & [f.(s,C), J] in P & f.(s, C) nin T
    implies [s, if-then-else(C,I,J)] in P) & ([s,C] in P &
    (ex r being non empty FinSequence of S st r.1 = f.(s,C) & r.len r nin T &
    for i being Nat st 1 <= i & i < len r
    holds r.i in T & [r.i, I\;C] in P & r.(i+1) = f.(r.i, I\;C))
    implies [s, while(C,I)] in P) by A11;
    then TP c= P by A3,A7,Def35;
    hence contradiction by A2,ZFMISC_1:56;
  end;
  assume
A43: not ex r being non empty FinSequence of S st
  r.1 = f.(rr,C) & r.len r nin T & for i being Nat st 1 <= i & i < len r
  holds r.i in T & [r.i, I\;C] in TP & r.(i+1) = f.(r.i, I\;C);
  now
    let s be Element of S;
    let C9,I9,J be Element of A;
    assume
A44: [s,C9] in P;
    given r being non empty FinSequence of S such that
A45: r.1 = f.(s,C9) and
A46: r.len r nin T and
A47: for i being Nat st 1 <= i & i < len r
    holds r.i in T & [r.i, I9\;C9] in P & r.(i+1) = f.(r.i, I9\;C9);
A48: now
      let i be Nat;
      assume that
A49:  1 <= i and
A50:  i < len r;
      [r.i, I9\;C9] in P by A47,A49,A50;
      hence r.i in T & [r.i, I9\;C9] in TP & r.(i+1) = f.(r.i, I9\;C9)
      by A47,A49,A50,ZFMISC_1:56;
    end;
A51: [s,C9] in TP by A44,ZFMISC_1:56;
    I <> I9 or C <> C9 or s <> rr by A43,A45,A46,A48;
    then
A52: while(C9,I9) <> IJ or s <> rr by A1,Th75;
A53: [s, while(C9,I9)] in TP by A45,A46,A48,A51,Def35;
    [s, while(C9,I9)] <> [rr,IJ] by A52,XTUPLE_0:1;
    hence [s, while(C9,I9)] in P by A53,ZFMISC_1:56;
  end;
  then for s being Element of S for C,I,J being Element of A holds
  ([s,I] in P & [f.(s,I), J] in P implies [s, I\;J] in P) &
  ([s,C] in P & [f.(s,C), I] in P & f.(s, C) in T
  implies [s, if-then-else(C,I,J)] in P) &
  ([s,C] in P & [f.(s,C), J] in P & f.(s, C) nin T
  implies [s, if-then-else(C,I,J)] in P) & ([s,C] in P &
  (ex r being non empty FinSequence of S st r.1 = f.(s,C) & r.len r nin T &
  for i being Nat st 1 <= i & i < len r
  holds r.i in T & [r.i, I\;C] in P & r.(i+1) = f.(r.i, I\;C))
  implies [s, while(C,I)] in P) by A11;
  then TP c= P by A3,A7,Def35;
  hence contradiction by A2,ZFMISC_1:56;
end;

theorem
  A is free & [s, while(C,I)] in TerminatingPrograms(A,S,T,f) & f.(s,C) in T
  implies [f.(s,C), I] in TerminatingPrograms(A,S,T,f)
proof
  set TP = TerminatingPrograms(A,S,T,f);
  set IJ = while(C,I);
  assume that
A1: A is free and
A2: [s, IJ] in TP and
A3: f.(s,C) in T;
  consider r being non empty FinSequence of S such that
A4: r.1 = f.(s,C) and
A5: r.len r nin T and
A6: for i being Nat st 1 <= i & i < len r
  holds r.i in T & [r.i, I\;C] in TP & r.(i+1) = f.(r.i, I\;C) by A1,A2,Th99;
  len r >= 1 by NAT_1:14;
  then 1 < len r by A3,A4,A5,XXREAL_0:1;
  then [r.1, I\;C] in TP by A6;
  hence thesis by A1,A4,Th97;
end;

theorem
  for C,I being absolutely-terminating Element of A
  st f iteration_terminates_for I\;C, f.(s,C)
  holds [s, while(C,I)] in TerminatingPrograms(A,S,T,f)
proof
  let C,I be absolutely-terminating Element of A;
  given r being non empty FinSequence of S such that
A1: r.1 = f.(s,C) and
A2: r.len r nin T and
A3: for i being Nat st 1 <= i & i < len r
  holds r.i in T & r.(i+1) = f.(r.i, I\;C);
A4: now
    let i be Nat;
    assume that
A5: 1 <= i and
A6: i < len r;
    thus r.i in T by A3,A5,A6;
    hence [r.i, I\;C] in TerminatingPrograms(A,S,T,f) &
    r.(i+1) = f.(r.i, I\;C) by A3,A5,A6,Def36;
  end;
  [s,C] in TerminatingPrograms(A,S,T,f) by Def36;
  hence thesis by A1,A2,A4,Def35;
end;

Lm3: for A being free ECIW-strict preIfWhileAlgebra
for f1,f2 being ExecutionFunction of A, S, T
st f1|[:S, ElementaryInstructions A:] = f2|[:S, ElementaryInstructions A:]
for I being Element of A
for s being Element of S st [s,I] in TerminatingPrograms(A,S,T,f1)
holds [s,I] in TerminatingPrograms(A,S,T,f2) & f1.(s,I) = f2.(s,I)
proof
  let A be free ECIW-strict preIfWhileAlgebra;
  let f1,f2 be ExecutionFunction of A, S, T such that
A1: f1|[:S, ElementaryInstructions A:] = f2|[:S, ElementaryInstructions A:];
  set g = f1|[:S, ElementaryInstructions A:];
  set TP1 = TerminatingPrograms(A,S,T,f1);
  set TP2 = TerminatingPrograms(A,S,T,f2);
  defpred P[Element of A] means
  for s st [s,$1] in TP1 holds [s,$1] in TP2 & f1.(s,$1) = f2.(s,$1);
A2: for I being Element of A st I in ElementaryInstructions A holds P[I]
  proof
    let I be Element of A;
    assume
A3: I in ElementaryInstructions A;
    let s be Element of S;
    assume [s,I] in TP1;
    thus [s,I] in TP2 by A3,Th94;
A4: [s,I] in [:S, ElementaryInstructions A:] by A3,ZFMISC_1:87;
    hence f1.(s,I) = g.[s,I] by FUNCT_1:49
      .= f2.(s,I) by A1,A4,FUNCT_1:49;
  end;
A5: P[EmptyIns A]
  proof
    let s be Element of S;
    f1.(s,EmptyIns A) = s by Def28;
    hence thesis by Def28,Th96;
  end;
A6: for I1,I2 being Element of A st P[I1] & P[I2] holds P[I1\;I2]
  proof
    let I1,I2 be Element of A such that
A7: P[I1] and
A8: P[I2];
    let s be Element of S;
    assume
A9: [s, I1\;I2] in TP1;
    then
A10: [s, I1] in TP1 by Th97;
A11: [f1.(s,I1),I2] in TP1 by A9,Th97;
A12: [s, I1] in TP2 by A7,A10;
A13: [f1.(s,I1),I2] in TP2 by A8,A11;
A14: f1.(s,I1) = f2.(s,I1) by A7,A10;
A15: f1.(f1.(s,I1),I2) = f2.(f1.(s,I1),I2) by A8,A11;
    f1.(f1.(s,I1),I2) = f1.(s,I1\;I2) by Def29;
    hence thesis by A12,A13,A14,A15,Def29,Def35;
  end;
A16: for C,I1,I2 being Element of A st P[C] & P[I1] & P[I2]
  holds P[if-then-else(C,I1,I2)]
  proof
    let C,I1,I2 be Element of A such that
A17: P[C] and
A18: P[I1] and
A19: P[I2];
A20: f1 complies_with_if_wrt T by Def32;
A21: f2 complies_with_if_wrt T by Def32;
    set J = if-then-else(C,I1,I2);
    let s be Element of S;
    assume
A22: [s, J] in TP1;
    then
A23: [s, C] in TP1 by Th98;
A24: f1.(s,C) in T implies [f1.(s,C),I1] in TP1 by A22,Th98;
A25: f1.(s,C) nin T implies [f1.(s,C),I2] in TP1 by A22,Th98;
A26: [s, C] in TP2 by A17,A23;
A27: f1.(s,C) = f2.(s,C) by A17,A23;
A28: f1.(s,C) in T implies [f1.(s,C),I1] in TP2 & f1.(f1.(s,C),I1) = f2.(f1
    .(s,C),I1) & f1.(s,J) = f1.(f1.(s,C),I1) by A18,A20,A24;
A29: f1.(s,C) nin T implies [f1.(s,C),I2] in TP2 & f1.(f1.(s,C),I2) = f2.(
    f1.(s,C),I2) & f1.(s,J) = f1.(f1.(s,C),I2) by A19,A20,A25;
    f1.(s,C) in T or f1.(s,C) nin T;
    hence thesis by A21,A26,A27,A28,A29,Def35;
  end;
A30: for C,I being Element of A st P[C] & P[I] holds P[while(C,I)]
  proof
    let C,I be Element of A such that
A31: P[C] and
A32: P[I];
    set J = while(C,I);
    let s be Element of S;
    assume
A33: [s, J] in TP1;
    then
A34: [s, C] in TP1 by Th99;
    then
A35: [s, C] in TP2 by A31;
A36: f1.(s,C) = f2.(s,C) by A31,A34;
    consider r being non empty FinSequence of S such that
A37: r.1 = f1.(s,C) and
A38: r.len r nin T and
A39: for i being Nat st 1 <= i & i < len r holds
    r.i in T & [r.i, I\;C] in TP1 & r.(i+1) = f1.(r.i, I\;C) by A33,Th99;
    for i being Nat st 1 <= i & i < len r holds
    r.i in T & r.(i+1) = f1.(r.i, I\;C) by A39;
    then
A40: f1.(s,J) = r.len r by A37,A38,Th86;
    defpred Q[Nat] means 1 <= $1 & $1 < len r implies
    r.$1 in T & [r.$1, I\;C] in TP2 & r.($1+1) = f2.(r.$1, I\;C);
A41: for i being Nat holds Q[i]
    proof
      let i be Nat;
      assume that
A42:  1 <= i and
A43:  i < len r;
      thus
A44:  r.i in T by A39,A42,A43;
      then reconsider ri = r.i as Element of S;
A45:  [r.i, I\;C] in TP1 by A39,A42,A43;
      hence [r.i, I\;C] in TP2 by A6,A31,A32,A44;
A46:  [ri, I] in TP1 by A45,Th97;
A47:  [f1.(ri,I),C] in TP1 by A45,Th97;
      thus r.(i+1) = f1.(r.i, I\;C) by A39,A42,A43
        .= f1.(f1.(ri,I),C) by Def29
        .= f2.(f1.(ri,I),C) by A31,A47
        .= f2.(f2.(ri,I),C) by A32,A46
        .= f2.(r.i, I\;C) by Def29;
    end;
    then for i being Nat st 1 <= i & i < len r holds
    r.i in T & r.(i+1) = f2.(r.i, I\;C);
    hence thesis by A35,A36,A37,A38,A40,A41,Def35,Th86;
  end;
  let I be Element of A;
  thus P[I] from StructInd(A2,A5,A6,A16,A30);
end;

theorem
  for A being free ECIW-strict preIfWhileAlgebra
  for f1,f2 being ExecutionFunction of A, S, T
  st f1|[:S, ElementaryInstructions A:] = f2|[:S, ElementaryInstructions A:]
  holds TerminatingPrograms(A,S,T,f1) = TerminatingPrograms(A,S,T,f2)
proof
  let A be free ECIW-strict preIfWhileAlgebra;
  let f1,f2 be ExecutionFunction of A, S, T;
  assume
A1: f1|[:S, ElementaryInstructions A:] = f2|[:S, ElementaryInstructions A:];
  set TP1 = TerminatingPrograms(A,S,T,f1);
  set TP2 = TerminatingPrograms(A,S,T,f2);
  thus TP1 c= TP2
  proof
    let q,I be object;
    assume
A2: [q,I] in TP1;
    then
A3: q is Element of S by ZFMISC_1:87;
    I is Element of A by A2,ZFMISC_1:87;
    hence thesis by A1,A2,A3,Lm3;
  end;
  let q,I be object;
  assume
A4: [q,I] in TP2;
  then
A5: q is Element of S by ZFMISC_1:87;
  I is Element of A by A4,ZFMISC_1:87;
  hence thesis by A1,A4,A5,Lm3;
end;

theorem
  for A being free ECIW-strict preIfWhileAlgebra
  for f1,f2 being ExecutionFunction of A, S, T
  st f1|[:S, ElementaryInstructions A:] = f2|[:S, ElementaryInstructions A:]
  for s being Element of S
  for I being Element of A st [s,I] in TerminatingPrograms(A,S,T,f1)
  holds f1.(s, I) = f2.(s, I) by Lm3;

theorem Th104:
  for I being absolutely-terminating Element of A holds I is_terminating_wrt f
by Def36;

theorem
  for I being Element of A holds
  I is_terminating_wrt f iff I is_terminating_wrt f, S;

theorem Th106:
  for I being Element of A st I is_terminating_wrt f
  for P being set holds I is_terminating_wrt f, P;

theorem
  for I being absolutely-terminating Element of A
  for P being set holds I is_terminating_wrt f, P by Th104,Th106;

theorem
  for I being Element of A holds S is_invariant_wrt I, f;

theorem
  for P being set for I,J being Element of A
  st P is_invariant_wrt I, f & P is_invariant_wrt J, f
  holds P is_invariant_wrt I\;J, f
proof
  let P be set;
  let I,J be Element of A;
  assume that
A1: for s being Element of S st s in P holds f.(s, I) in P and
A2: for s being Element of S st s in P holds f.(s, J) in P;
  let s be Element of S;
  assume s in P;
  then
A3: f.(s, I) in P by A1;
  f.(s, I\;J) = f.(f.(s, I), J) by Def29;
  hence thesis by A2,A3;
end;

theorem
  for I,J being Element of A st I is_terminating_wrt f & J is_terminating_wrt f
  holds I\;J is_terminating_wrt f
proof
  let I,J be Element of A such that
A1: for s being Element of S holds [s,I] in TerminatingPrograms(A, S, T, f) and
A2: for s being Element of S holds [s,J] in TerminatingPrograms(A, S, T, f);
  let s be Element of S;
A3: [s,I] in TerminatingPrograms(A,S,T,f) by A1;
  [f.(s,I),J] in TerminatingPrograms(A,S,T,f) by A2;
  hence thesis by A3,Def35;
end;

theorem
  for P being set for I,J being Element of A
  st I is_terminating_wrt f,P & J is_terminating_wrt f,P &
  P is_invariant_wrt I,f holds I\;J is_terminating_wrt f,P
proof
  let P be set;
  let I,J be Element of A such that
A1: for s being Element of S st s in P
  holds [s,I] in TerminatingPrograms(A, S, T, f) and
A2: for s being Element of S st s in P
  holds [s,J] in TerminatingPrograms(A, S, T, f) and
A3: for s being Element of S st s in P holds f.(s, I) in P;
  let s be Element of S;
  assume
A4: s in P;
  then
A5: [s,I] in TerminatingPrograms(A,S,T,f) by A1;
  [f.(s,I),J] in TerminatingPrograms(A,S,T,f) by A2,A3,A4;
  hence thesis by A5,Def35;
end;

theorem
  for C,I,J being Element of A
  st C is_terminating_wrt f & I is_terminating_wrt f & J is_terminating_wrt f
  holds if-then-else(C,I,J) is_terminating_wrt f
proof
  let C,I,J be Element of A such that
A1: for s being Element of S holds [s,C] in TerminatingPrograms(A, S, T, f) and
A2: for s being Element of S holds [s,I] in TerminatingPrograms(A, S, T, f) and
A3: for s being Element of S holds [s,J] in TerminatingPrograms(A, S, T, f);
  let s be Element of S;
A4: f.(s,C) in T or f.(s,C) nin T;
A5: [s,C] in TerminatingPrograms(A,S,T,f) by A1;
A6: [f.(s,C),I] in TerminatingPrograms(A,S,T,f) by A2;
  [f.(s,C),J] in TerminatingPrograms(A,S,T,f) by A3;
  hence thesis by A4,A5,A6,Def35;
end;

theorem
  for P being set for C,I,J being Element of A
  st C is_terminating_wrt f,P & I is_terminating_wrt f,P &
  J is_terminating_wrt f,P & P is_invariant_wrt C,f
  holds if-then-else(C,I,J) is_terminating_wrt f,P
proof
  let P be set;
  let C,I,J be Element of A such that
A1: for s being Element of S st s in P
  holds [s,C] in TerminatingPrograms(A, S, T, f) and
A2: for s being Element of S st s in P
  holds [s,I] in TerminatingPrograms(A, S, T, f) and
A3: for s being Element of S st s in P
  holds [s,J] in TerminatingPrograms(A, S, T, f) and
A4: for s being Element of S st s in P holds f.(s, C) in P;
  let s be Element of S;
  assume
A5: s in P;
A6: f.(s,C) in T or f.(s,C) nin T;
A7: [s,C] in TerminatingPrograms(A,S,T,f ) by A1,A5;
A8: [f.(s,C),I] in TerminatingPrograms(A,S,T,f) by A2,A4,A5;
  [f.(s,C),J] in TerminatingPrograms(A,S,T,f) by A3,A4,A5;
  hence thesis by A6,A7,A8,Def35;
end;

theorem Th114:
  for C,I being Element of A
  st C is_terminating_wrt f & I is_terminating_wrt f &
  f iteration_terminates_for I\;C, f.(s,C) holds [s, while(C,I)] in
  TerminatingPrograms(A, S, T, f)
proof
  let C,I be Element of A such that
A1: C is_terminating_wrt f and
A2: I is_terminating_wrt f;
  given r being non empty FinSequence of S such that
A3: r.1 = f.(s,C) and
A4: r.len r nin T and
A5: for i being Nat st 1 <= i & i < len r
  holds r.i in T & r.(i+1) = f.(r.i, I\;C);
A6: now
    let i be Nat;
    assume that
A7: 1 <= i and
A8: i < len r;
    thus r.i in T by A5,A7,A8;
    then reconsider s = r.i as Element of S;
A9: [s, I] in TerminatingPrograms(A,S,T,f) by A2;
    [f.(s, I), C] in TerminatingPrograms(A,S,T,f) by A1;
    hence [r.i, I\;C] in TerminatingPrograms(A,S,T,f) &
    r.(i+1) = f.(r.i, I\;C) by A5,A7,A8,A9,Def35;
  end;
  [s,C] in TerminatingPrograms(A,S,T,f) by A1;
  hence thesis by A3,A4,A6,Def35;
end;

theorem
  for P being set for C,I being Element of A
  st C is_terminating_wrt f,P & I is_terminating_wrt f,P &
  P is_invariant_wrt C,f & P is_invariant_wrt I,f &
  f iteration_terminates_for I\;C, f.(s,C) & s in P holds [s, while(C,I)] in
  TerminatingPrograms(A, S, T, f)
proof
  let P be set;
  let C,I be Element of A such that
A1: C is_terminating_wrt f,P and
A2: I is_terminating_wrt f,P and
A3: P is_invariant_wrt C,f and
A4: P is_invariant_wrt I,f;
  given r being non empty FinSequence of S such that
A5: r.1 = f.(s,C) and
A6: r.len r nin T and
A7: for i being Nat st 1 <= i & i < len r
  holds r.i in T & r.(i+1) = f.(r.i, I\;C);
  assume
A8: s in P;
  defpred P[Nat] means $1 < len r implies r.($1+1) in P;
A9: P[0] by A3,A5,A8;
A10: for i being Nat st P[i] holds P[i+1]
  proof
    let i be Nat such that
A11: P[i] and
A12: i+1 < len r;
A13: i+1 >= 1 by NAT_1:11;
    then
A14: r.(i+1) in T by A7,A12;
A15: r.(i+1+1) = f.(r.(i+1), I\;C) by A7,A12,A13;
    reconsider s = r.(i+1) as Element of S by A14;
    f.(s,I) in P by A4,A11,A12,NAT_1:13;
    then f.(f.(s,I),C) in P by A3;
    hence r.(i+1+1) in P by A15,Def29;
  end;
A16: for i being Nat holds P[i] from NAT_1:sch 2(A9,A10);
A17: now
    let i be Nat;
    assume that
A18: 1 <= i and
A19: i < len r;
    thus r.i in T by A7,A18,A19;
    then reconsider s = r.i as Element of S;
A20: i-'1 <= i by NAT_D:35;
A21: i = (i-'1)+1 by A18,XREAL_1:235;
    i-'1 < len r by A19,A20,XXREAL_0:2;
    then
A22: s in P by A16,A21;
    then
A23: [s, I] in TerminatingPrograms(A,S,T,f) by A2;
    f.(s, I) in P by A4,A22;
    then [f.(s, I), C] in TerminatingPrograms(A,S,T,f) by A1;
    hence [r.i, I\;C] in TerminatingPrograms(A,S,T,f) &
    r.(i+1) = f.(r.i, I\;C) by A7,A18,A19,A23,Def35;
  end;
  [s,C] in TerminatingPrograms(A,S,T,f) by A1,A8;
  hence thesis by A5,A6,A17,Def35;
end;

theorem Th116:
  for P being set for C,I being Element of A
  st C is_terminating_wrt f & I is_terminating_wrt f,P &
  P is_invariant_wrt C,f & (for s st s in P & f.(f.(s,I),C) in T
  holds f.(s,I) in P) & f iteration_terminates_for I\;C, f.(s,C) & s in P
  holds [s, while(C,I)] in TerminatingPrograms(A, S, T, f)
proof
  let P be set;
  let C,I be Element of A such that
A1: C is_terminating_wrt f and
A2: I is_terminating_wrt f,P and
A3: P is_invariant_wrt C,f and
A4: for s st s in P & f.(f.(s,I),C) in T holds f.(s,I) in P;
  given r being non empty FinSequence of S such that
A5: r.1 = f.(s,C) and
A6: r.len r nin T and
A7: for i being Nat st 1 <= i & i < len r
  holds r.i in T & r.(i+1) = f.(r.i, I\;C);
  assume
A8: s in P;
  defpred P[Nat] means $1+1 < len r implies r.($1+1) in P;
A9: P[0] by A3,A5,A8;
A10: for i being Nat st P[i] holds P[i+1]
  proof
    let i be Nat such that
A11: P[i] and
A12: i+1+1 < len r;
A13: i+1 >= 1 by NAT_1:11;
A14: i+1+1 >= 1 by NAT_1:11;
A15: i+1 < len r by A12,NAT_1:13;
    then
A16: r.(i+1) in T by A7,A13;
A17: r.(i+1+1) in T by A7,A12,A14;
A18: r.(i+1+1) = f.(r.(i+1), I\;C) by A7,A13,A15;
    reconsider s = r.(i+1) as Element of S by A16;
    f.(f.(s, I), C) in T by A17,A18,Def29;
    then f.(s,I) in P by A4,A11,A12,NAT_1:13;
    then f.(f.(s,I),C) in P by A3;
    hence r.(i+1+1) in P by A18,Def29;
  end;
A19: for i being Nat holds P[i] from NAT_1:sch 2(A9,A10);
A20: now
    let i be Nat;
    assume that
A21: 1 <= i and
A22: i < len r;
    thus r.i in T by A7,A21,A22;
    then reconsider s = r.i as Element of S;
    i = (i-'1)+1 by A21,XREAL_1:235;
    then s in P by A19,A22;
    then
A23: [s, I] in TerminatingPrograms(A,S,T,f) by A2;
    [f.(s, I), C] in TerminatingPrograms(A,S,T,f) by A1;
    hence [r.i, I\;C] in TerminatingPrograms(A,S,T,f) &
    r.(i+1) = f.(r.i, I\;C) by A7,A21,A22,A23,Def35;
  end;
  [s,C] in TerminatingPrograms(A,S,T,f) by A1;
  hence thesis by A5,A6,A20,Def35;
end;

theorem
  for C,I being Element of A
  st C is_terminating_wrt f & I is_terminating_wrt f &
  for s holds f iteration_terminates_for I\;C, s
  holds while(C,I) is_terminating_wrt f
proof
  let C,I be Element of A such that
A1: C is_terminating_wrt f and
A2: I is_terminating_wrt f and
A3: for s holds f iteration_terminates_for I\;C, s;
  let s;
  f iteration_terminates_for I\;C, f.(s,C) by A3;
  hence thesis by A1,A2,Th114;
end;

theorem
  for P being set for C,I being Element of A
  st C is_terminating_wrt f & I is_terminating_wrt f,P &
  P is_invariant_wrt C,f & (for s st s in P & f.(f.(s,I),C) in T
  holds f.(s,I) in P) &
  for s st f.(s,C) in P holds f iteration_terminates_for I\;C, f.(s,C)
  holds while(C,I) is_terminating_wrt f,P
proof
  let P be set;
  let C,I be Element of A such that
A1: C is_terminating_wrt f and
A2: I is_terminating_wrt f,P and
A3: P is_invariant_wrt C,f and
A4: for s st s in P & f.(f.(s,I),C) in T holds f.(s,I) in P and
A5: for s st f.(s,C) in P holds f iteration_terminates_for I\;C, f.(s,C);
  let s;
  assume
A6: s in P;
  then f.(s,C) in P by A3;
  hence thesis by A1,A2,A3,A4,A5,A6,Th116;
end;