reserve x,y,z for boolean object;
reserve i,j,k for Nat;
reserve n for non zero Nat;
reserve x,y,z1,z2 for Tuple of n, BOOLEAN;

theorem Th21:
  for n for z1,z2 being Tuple of n,BOOLEAN holds Absval(z1+z2) +
  IFEQ(add_ovfl(z1,z2),FALSE,0,2 to_power (n)) = Absval(z1) + Absval(z2)
proof
  defpred P[non zero Nat] means for z1,z2 being Tuple of $1, BOOLEAN holds
  Absval(z1+z2) + IFEQ(add_ovfl(z1,z2),FALSE,0,2 to_power $1) = Absval(z1) +
  Absval(z2);
  set f = FALSE, t = TRUE;
A1: for n being non zero Nat st P[n] holds P[n+1]
  proof
    let n;
    assume
A2: P[n];
    let z1,z2 be Tuple of n+1,BOOLEAN;
    consider t1 being (Element of n-tuples_on BOOLEAN), d1 being Element of
    BOOLEAN such that
A3: z1 = t1^<*d1*> by FINSEQ_2:117;
    consider t2 being (Element of n-tuples_on BOOLEAN), d2 being Element of
    BOOLEAN such that
A4: z2 = t2^<*d2*> by FINSEQ_2:117;
    reconsider
    C1= IFEQ(add_ovfl(z1,z2),FALSE,0,2 to_power (n+1)), C2= IFEQ(d1
    'xor' d2 'xor' add_ovfl(t1,t2),FALSE,0,2 to_power n), C3= IFEQ(d1,FALSE,0,2
to_power n), C4= IFEQ(d2,FALSE,0,2 to_power n), C5= IFEQ(add_ovfl(t1,t2),FALSE,
    0,2 to_power(n)) as Real;
A5: add_ovfl(z1,z2) = d1 '&' ((t2^<*d2*>)/.(n+1)) 'or' ((t1^<*d1*>)/.(n+1
)) '&' (carry(t1^<*d1*>,t2^<*d2*>)/.(n+1)) 'or' ((t2^<*d2*>)/.(n+1)) '&' (carry
    (t1^<*d1*>,t2^<*d2*>)/.(n+1)) by A3,A4,Th2
      .= d1 '&' d2 'or' ((t1^<*d1*>)/.(n+1)) '&' (carry(t1^<*d1*>,t2^<*d2*>)
/.(n+1)) 'or' ((t2^<*d2*>)/.(n+1)) '&' (carry(t1^<*d1*>,t2^<*d2*>)/.(n+1)) by
Th2
      .= d1 '&' d2 'or' d1 '&' (carry(t1^<*d1*>,t2^<*d2*>)/.(n+1)) 'or' ((t2
    ^<*d2*>)/.(n+1)) '&' (carry(t1^<*d1*>,t2^<*d2*>)/.(n+1)) by Th2
      .= d1 '&' d2 'or' d1 '&' (carry(t1^<*d1*>,t2^<*d2*>)/.(n+1)) 'or' d2
    '&' (carry(t1^<*d1*>,t2^<*d2*>)/.(n+1)) by Th2
      .= d1 '&' d2 'or' d1 '&' add_ovfl(t1,t2) 'or' d2 '&' (carry(t1^<*d1*>,
    t2^<*d2*>)/.(n+1)) by Th18
      .= d1 '&' d2 'or' d1 '&' add_ovfl(t1,t2) 'or' d2 '&' add_ovfl(t1,t2)
    by Th18;
A6: C2 + C1 = C5 + C3 + C4
    proof
      now
        per cases;
        suppose
A7:       d1=f;
          then
A8:      C3=0 by FUNCOP_1:def 8;
          now
            per cases;
            suppose
A9:          d2=f;
              then C4=0 by FUNCOP_1:def 8;
              hence thesis by A5,A7,A9,FUNCOP_1:def 8;
            end;
            suppose
A10:          d2 <> f;
              then
A11:          C4=2 to_power n by FUNCOP_1:def 8;
              now
                per cases;
                suppose
A12:              add_ovfl(t1,t2)=f;
                  then C5=0 by FUNCOP_1:def 8;
                  hence thesis by A5,A7,A12,FUNCOP_1:def 8;
                end;
                suppose
A13:              add_ovfl(t1,t2)<>f;
                  d1 'xor' d2 'xor' add_ovfl(t1,t2) = t 'xor' add_ovfl(t1
                  ,t2) by A7,A10,XBOOLEAN:def 3
                    .= f by A13,XBOOLEAN:def 3;
                  then
A14:              C2=0 by FUNCOP_1:def 8;
A15:              C5=2 to_power(n) by A13,FUNCOP_1:def 8;
                  d1 '&' d2 'or' d1 '&' add_ovfl(t1,t2) 'or' d2 '&'
add_ovfl(t1,t2) = f 'or' f 'or' t '&' add_ovfl(t1,t2) by A7,A10,XBOOLEAN:def 3
                    .= t by A13,XBOOLEAN:def 3;
                  then C1=2 to_power(n+1) by A5,FUNCOP_1:def 8;
                  hence C2 + C1 = 2 to_power n * 2 to_power 1 by A14,POWER:27
                    .= 2 * 2 to_power n by POWER:25
                    .= C5 + C3 + C4 by A8,A11,A15;
                end;
              end;
              hence thesis;
            end;
          end;
          hence thesis;
        end;
        suppose
A16:      d1 <>f;
          then
A17:      C3=2 to_power n by FUNCOP_1:def 8;
          now
            per cases;
            suppose
A18:          d2=f;
              then
A19:          C4=0 by FUNCOP_1:def 8;
              now
                per cases;
                suppose
                  add_ovfl(t1,t2)=f;
                  hence thesis by A5,A18,A19,FUNCOP_1:def 8;
                end;
                suppose
A20:              add_ovfl(t1,t2)<>f;
                  d1 'xor' d2 'xor' add_ovfl(t1,t2) = t 'xor' add_ovfl(t1
                  ,t2) by A16,A18,XBOOLEAN:def 3
                    .= f by A20,XBOOLEAN:def 3;
                  then
A21:              C2=0 by FUNCOP_1:def 8;
A22:              C5=2 to_power(n) by A20,FUNCOP_1:def 8;
                  d1 '&' d2 'or' d1 '&' add_ovfl(t1,t2) 'or' d2 '&'
add_ovfl(t1,t2) = f 'or' t '&' add_ovfl(t1,t2) 'or' d2 '&' add_ovfl(t1,t2) by
A16,A18,XBOOLEAN:def 3
                    .= f 'or' t '&' t 'or' d2 '&' add_ovfl(t1,t2) by A20,
XBOOLEAN:def 3
                    .= t;
                  then C1=2 to_power (n+1) by A5,FUNCOP_1:def 8;
                  hence C2 + C1 = 2 to_power n * 2 to_power 1 by A21,POWER:27
                    .= 2 * 2 to_power n by POWER:25
                    .= C5 + C3 + C4 by A17,A19,A22;
                end;
              end;
              hence thesis;
            end;
            suppose
A23:          d2<>f;
              then
A24:          C4=2 to_power n by FUNCOP_1:def 8;
              now
                per cases;
                suppose
A25:              add_ovfl(t1,t2)=f;
                  d1 'xor' d2 'xor' add_ovfl(t1,t2) = t 'xor' d2 'xor'
                  add_ovfl(t1,t2) by A16,XBOOLEAN:def 3
                    .= f by A23,A25,XBOOLEAN:def 3;
                  then
A26:              C2=0 by FUNCOP_1:def 8;
A27:              C5=0 by A25,FUNCOP_1:def 8;
                  d1 '&' d2 'or' d1 '&' add_ovfl(t1,t2) 'or' d2 '&'
add_ovfl(t1,t2) = t '&' d2 'or' d1 '&' add_ovfl(t1,t2) 'or' d2 '&' add_ovfl(t1,
                  t2) by A16,XBOOLEAN:def 3
                    .= t '&' t 'or' d1 '&' add_ovfl(t1,t2) 'or' d2 '&'
                  add_ovfl(t1,t2) by A23,XBOOLEAN:def 3
                    .= t;
                  then C1=2 to_power (n+1) by A5,FUNCOP_1:def 8;
                  hence C2 + C1 = 2 to_power n * 2 to_power 1 by A26,POWER:27
                    .= 2 * 2 to_power n by POWER:25
                    .= C5 + C3 + C4 by A17,A24,A27;
                end;
                suppose
A28:              add_ovfl(t1,t2)<>f;
                  d1 'xor' d2 'xor' add_ovfl(t1,t2) = t 'xor' d2 'xor'
                  add_ovfl(t1,t2) by A16,XBOOLEAN:def 3
                    .= f 'xor' add_ovfl(t1,t2) by A23,XBOOLEAN:def 3
                    .= t by A28,XBOOLEAN:def 3;
                  then
A29:              C2=2 to_power n by FUNCOP_1:def 8;
                  d1 '&' d2 'or' d1 '&' add_ovfl(t1,t2) 'or' d2 '&'
add_ovfl(t1,t2) = t '&' d2 'or' d1 '&' add_ovfl(t1,t2) 'or' d2 '&' add_ovfl(t1,
                  t2) by A16,XBOOLEAN:def 3
                    .= t '&' t 'or' d1 '&' add_ovfl(t1,t2) 'or' d2 '&'
                  add_ovfl(t1,t2) by A23,XBOOLEAN:def 3
                    .= t;
                  then C1=2 to_power (n+1) by A5,FUNCOP_1:def 8;
                  hence
                  C2 + C1 = 2 to_power n + 2 to_power n * 2 to_power 1 by A29,
POWER:27
                    .= 2 to_power n + 2 * 2 to_power n by POWER:25
                    .= 2 to_power n + 2 to_power n + 2 to_power n
                    .= C5 + C3 + C4 by A17,A24,A28,FUNCOP_1:def 8;
                end;
              end;
              hence thesis;
            end;
          end;
          hence thesis;
        end;
      end;
      hence thesis;
    end;
    thus Absval(z1+z2) + IFEQ(add_ovfl(z1,z2),FALSE,0,2 to_power (n+1)) =
Absval((t1+t2)^<*d1 'xor' d2 'xor' add_ovfl(t1,t2)*>) + IFEQ(add_ovfl(z1,z2),
    FALSE,0,2 to_power (n+1)) by A3,A4,Th19
      .=Absval(t1+t2) + C2 + C1 by Th20
      .= Absval(t1+t2) + C5 + C3 + C4 by A6
      .= Absval(t1) + Absval(t2) + C3 + C4 by A2
      .= Absval(t1) + C3 + (Absval(t2) + C4 )
      .= Absval(t1)+IFEQ(d1,FALSE,0,2 to_power n) + Absval(t2^<*d2*>) by Th20
      .= Absval(z1) + Absval(z2) by A3,A4,Th20;
  end;
A30: P[1]
  proof
    reconsider T= <*t*>,F= <*f*> as Tuple of 1,BOOLEAN;
    let z1,z2 be Tuple of 1, BOOLEAN;
A31: carry(z1,z2)/.1 = f by Def2;
A32: Absval(T)=1 by Th16;
A33: Absval(F)=0 by Th15;
    per cases by Th14;
    suppose
A34:  z1=<*f*> & z2=<*f*>;
A35:  now
        let i;
        assume
A36:    i in Seg 1;
        then
A37:    i=1 by FINSEQ_1:2,TARSKI:def 1;
        thus F/.i = (z1/.1) 'xor' f 'xor' f by A34,A36,FINSEQ_1:2,TARSKI:def 1
          .= (z1/.1) 'xor' (z2/.1) 'xor' f by A34,FINSEQ_4:16
          .= (z1/.i) 'xor' (z2/.i) 'xor' (carry(z1,z2)/.i) by A37,Def2;
      end;
      add_ovfl(z1,z2) = f by A31,A34,FINSEQ_4:16;
      then IFEQ(add_ovfl(z1,z2),FALSE,0,2 to_power (1)) = 0 by FUNCOP_1:def 8;
      hence thesis by A33,A34,A35,Def5;
    end;
    suppose
A38:  z1=<*t*> & z2=<*f*>;
A39:  now
        let i;
        assume
A40:    i in Seg 1;
        then
A41:    i=1 by FINSEQ_1:2,TARSKI:def 1;
        thus T/.i = (z1/.1) 'xor' f 'xor' f by A38,A40,FINSEQ_1:2,TARSKI:def 1
          .= (z1/.1) 'xor' (z2/.1) 'xor' f by A38,FINSEQ_4:16
          .= (z1/.i) 'xor' (z2/.i) 'xor' (carry(z1,z2)/.i) by A41,Def2;
      end;
      add_ovfl(z1,z2) = f by A31,A38,FINSEQ_4:16;
      then IFEQ(add_ovfl(z1,z2),FALSE,0,2 to_power (1)) = 0 by FUNCOP_1:def 8;
      hence thesis by A33,A38,A39,Def5;
    end;
    suppose
A42:  z1=<*f*> & z2=<*t*>;
A43:  now
        let i;
        assume i in Seg 1;
        then
A44:    i=1 by FINSEQ_1:2,TARSKI:def 1;
        hence T/.i = 'not' t 'xor' t 'xor' f by FINSEQ_4:16
          .= (z1/.1) 'xor' t 'xor' f by A42,FINSEQ_4:16
          .= (z1/.1) 'xor' (z2/.1) 'xor' f by A42,FINSEQ_4:16
          .= (z1/.i) 'xor' (z2/.i) 'xor' (carry(z1,z2)/.i) by A44,Def2;
      end;
      add_ovfl(z1,z2) = f by A31,A42,FINSEQ_4:16;
      then IFEQ(add_ovfl(z1,z2),FALSE,0,2 to_power (1)) = 0 by FUNCOP_1:def 8;
      hence thesis by A33,A42,A43,Def5;
    end;
    suppose
A45:  z1=<*t*> & z2=<*t*>;
      now
        let i;
        assume i in Seg 1;
        then
A46:    i=1 by FINSEQ_1:2,TARSKI:def 1;
        hence F/.i = t 'xor' t 'xor' 'not' t by FINSEQ_4:16
          .= (z1/.1) 'xor' t 'xor' f by A45,FINSEQ_4:16
          .= (z1/.1) 'xor' (z2/.1) 'xor' f by A45,FINSEQ_4:16
          .= (z1/.i) 'xor' (z2/.i) 'xor' (carry(z1,z2)/.i) by A46,Def2;
      end;
      then
A47:  z1+z2=<*f*> by Def5;
      add_ovfl(z1,z2) = t by A31,A45,FINSEQ_4:16;
      then IFEQ(add_ovfl(z1,z2),FALSE,0,2 to_power (1)) = 2 to_power 1 by
FUNCOP_1:def 8
        .= 2 by POWER:25;
      hence thesis by A32,A33,A45,A47;
    end;
  end;
  thus for n being non zero Nat holds P[n] from NAT_1:sch 10(A30,A1);
end;
