
theorem Th5:
  for n be Nat for p,q being FinSeqLen of n
  for p1,p2, q1,q2 being FinSequence holds
  n-BitSubtracterStr(p^p1, q^q1) = n-BitSubtracterStr(p^p2, q^q2) &
  n-BitSubtracterCirc(p^p1, q^q1) = n-BitSubtracterCirc(p^p2, q^q2) &
  n-BitBorrowOutput(p^p1, q^q1) = n-BitBorrowOutput(p^p2, q^q2)
proof
  let n be Nat;
  set c = [<*>, (0-tuples_on BOOLEAN)-->TRUE];
  let p,q be FinSeqLen of n;
  let p1,p2, q1,q2 be FinSequence;
  deffunc o(set,Nat)
  = BorrowOutput((p^p1) .($2+1), (q^q1).($2+1), $1);
  deffunc S(non empty ManySortedSign,set,Nat) =
  $1 +* BitSubtracterWithBorrowStr((p^p1) .($3+1), (q^q1).($3+1), $2);
  deffunc A(non empty ManySortedSign,non-empty MSAlgebra over $1,
  set,Nat) =
  $2 +* BitSubtracterWithBorrowCirc((p^p1) .($4+1), (q^q1).($4+1), $3);
  consider f1,g1,h1 being ManySortedSet of NAT such that
A1: n-BitSubtracterStr(p^p1,q^q1) = f1.n and
A2: n-BitSubtracterCirc(p^p1,q^q1) = g1.n and
A3: f1.0 = 1GateCircStr(<*>,(0-tuples_on BOOLEAN)-->TRUE) and
A4: g1.0 = 1GateCircuit(<*>,(0-tuples_on BOOLEAN)-->TRUE) and
A5: h1.0 = c and
A6: for n being Nat, S being non empty ManySortedSign,
  A being non-empty MSAlgebra over S
  for z be set st S = f1.n & A = g1.n & z = h1.n holds f1.(n+1) = S(S,z,n) &
  g1.(n+1) = A(S,A,z,n) & h1.(n+1) = o(z,n) by Def2;
  consider f2,g2,h2 being ManySortedSet of NAT such that
A7: n-BitSubtracterStr(p^p2,q^q2) = f2.n and
A8: n-BitSubtracterCirc(p^p2,q^q2) = g2.n and
A9: f2.0 = 1GateCircStr(<*>,(0-tuples_on BOOLEAN)-->TRUE) and
A10: g2.0 = 1GateCircuit(<*>,(0-tuples_on BOOLEAN)-->TRUE) and
A11: h2.0 = c and
A12: for n being Nat, S being non empty ManySortedSign,
  A being non-empty MSAlgebra over S
  for z be set st S = f2.n & A = g2.n & z = h2.n holds f2.(n+1) =
  S +* BitSubtracterWithBorrowStr((p^p2).(n+1), (q^q2).(n+1), z) & g2.(n+1) =
  A +* BitSubtracterWithBorrowCirc((p^p2).(n+1), (q^q2).(n+1), z) &
  h2.(n+1) = BorrowOutput((p^p2).(n+1), (q^q2).(n+1), z) by Def2;
  defpred L[Nat] means
  $1 <= n implies h1.$1 = h2.$1 & f1.$1 = f2.$1 & g1.$1 = g2.$1;
A13: L[ 0 ] by A3,A4,A5,A9,A10,A11;
A14: for i being Nat st L[i] holds L[i+1]
  proof
    let i be Nat such that
A15: i <= n implies h1.i = h2.i & f1.i = f2.i & g1.i = g2.i and
A16: i+1 <= n;
A17: len p = n by CARD_1:def 7;
A18: len q = n by CARD_1:def 7;
A19: dom p = Seg n by A17,FINSEQ_1:def 3;
A20: dom q = Seg n by A18,FINSEQ_1:def 3;
    0+1 <= i+1 by XREAL_1:6;
    then
A21: i+1 in Seg n by A16,FINSEQ_1:1;
    then
A22: (p^p1).(i+1) = p.(i+1) by A19,FINSEQ_1:def 7;
A23: (p^p2).(i+1) = p.(i+1) by A19,A21,FINSEQ_1:def 7;
A24: (q^q1).(i+1) = q.(i+1) by A20,A21,FINSEQ_1:def 7;
A25: (q^q2).(i+1) = q.(i+1) by A20,A21,FINSEQ_1:def 7;
    defpred P[set,set,set,set] means not contradiction;
A26: ex S being non empty ManySortedSign, A being non-empty MSAlgebra over S,
    x being set st S = f1.0 & A = g1.0 & x = h1.0 & P [S,A,x,0] by A3,A4;
A27: for n being Nat, S being non empty ManySortedSign,
    A being non-empty MSAlgebra over S
    for x being set st S = f1.n & A = g1.n & x = h1.n & P[S,A,x,n]
    holds P[S(S,x,n), A(S,A,x,n), o(x, n), n+1];
A28: for S being non empty ManySortedSign, A being non-empty MSAlgebra over S
    for z being set, n being Nat holds
    A(S,A,z,n) is non-empty MSAlgebra over S(S,z,n);
    for n being Nat
    ex S being non empty ManySortedSign, A being non-empty MSAlgebra over S
    st S = f1.n & A = g1.n & P[S,A,h1.n,n]
    from CIRCCMB2:sch 13(A26,A6,A27,A28);
    then consider S being non empty ManySortedSign,
    A being non-empty MSAlgebra over S such that
A29: S = f1.i and
A30: A = g1.i;
    thus h1.(i+1)
    = BorrowOutput((p^p2).(i+1), (q^q2).(i+1), h2.i) by A6,A15,A16,A22,A23,A24
,A25,A29,A30,NAT_1:13
      .= h2.(i+1) by A12,A15,A16,A29,A30,NAT_1:13;
    thus f1.(i+1)
    = S+*BitSubtracterWithBorrowStr((p^p2).(i+1), (q^q2).(i+1), h2.i)
    by A6,A15,A16,A22,A23,A24,A25,A29,A30,NAT_1:13
      .= f2.(i+1) by A12,A15,A16,A29,A30,NAT_1:13;
    thus g1.(i+1)
    = A+*BitSubtracterWithBorrowCirc((p^p2).(i+1), (q^q2).(i+1), h2.i)
    by A6,A15,A16,A22,A23,A24,A25,A29,A30,NAT_1:13
      .= g2.(i+1) by A12,A15,A16,A29,A30,NAT_1:13;
  end;
A31: for i being Nat holds L[i] from NAT_1:sch 2(A13,A14);
  hence n-BitSubtracterStr(p^p1, q^q1) = n-BitSubtracterStr(p^p2, q^q2) &
  n-BitSubtracterCirc(p^p1, q^q1) = n-BitSubtracterCirc(p^p2, q^q2) by A1,A2,A7
,A8;
A32: n-BitBorrowOutput(p^p1, q^q1) = h1.n by A3,A4,A5,A6,Th1;
  n-BitBorrowOutput(p^p2, q^q2) = h2.n by A9,A10,A11,A12,Th1;
  hence thesis by A31,A32;
end;
