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 Th17:
  for z1,z2 being Tuple of n,BOOLEAN holds for d1,d2 being Element
of BOOLEAN holds for i being Nat holds i in Seg n implies carry(z1^<*d1*>,z2^<*
  d2*>)/.i = carry(z1,z2)/.i
proof
  let z1,z2 be Tuple of n,BOOLEAN;
  let d1,d2 be Element of BOOLEAN;
  defpred P[Nat] means $1 in Seg n implies carry(z1^<*d1*>,z2^<*d2*>)/.$1 =
  carry(z1,z2)/.$1;
  let i be Nat;
A1: for i being non zero Nat st P[i] holds P[i+1]
  proof
    let i be non zero Nat;
    assume
A2: P[i];
    assume i+1 in Seg n;
    then i+1 > i & i+1 <= n by FINSEQ_1:1,XREAL_1:29;
    then
A3: i < n by XXREAL_0:2;
    n <= n+1 by NAT_1:11;
    then
A4: i < n+1 by A3,XXREAL_0:2;
A5: 1 <= i by NAT_1:14;
    then i in Seg n by A3;
    then (z1^<*d1*>)/.i = z1/.i & (z2^<*d2*>)/.i = z2/.i by Th1;
    hence
    carry(z1^<*d1*>,z2^<*d2*>)/.(i+1) = ((z1/.i) '&' (z2/.i)) 'or' (z1/.i
    ) '&' (carry(z1,z2)/.i) 'or' (z2/.i) '&' (carry(z1,z2)/.i) by A2,A5,A3,A4
,Def2
      .= carry(z1,z2)/.(i+1) by A5,A3,Def2;
  end;
A6: P[1]
  proof
    assume 1 in Seg n;
    thus carry(z1^<*d1*>,z2^<*d2*>)/.1 = FALSE by Def2
      .= carry(z1,z2)/.1 by Def2;
  end;
A7: for i being non zero Nat holds P[i] from NAT_1:sch 10(A6,A1);
  assume
A8: i in Seg n;
  then i is non zero by FINSEQ_1:1;
  hence thesis by A8,A7;
end;
