Article FSCIRC_1, MML version 4.99.1005

:: FSCIRC_1:funcnot 1 => FSCIRC_1:func 1
definition
  let a1, a2, a3 be set;
  func BitSubtracterOutput(A1,A2,A3) -> Element of InnerVertices 2GatesCircStr(a1,a2,a3,'xor') equals
    2GatesCircOutput(a1,a2,a3,'xor');
end;

:: FSCIRC_1:def 1
theorem
for b1, b2, b3 being set holds
BitSubtracterOutput(b1,b2,b3) = 2GatesCircOutput(b1,b2,b3,'xor');

:: FSCIRC_1:funcnot 2 => FSCIRC_1:func 2
definition
  let a1, a2, a3 be set;
  func BitSubtracterCirc(A1,A2,A3) -> strict locally-finite gate`2=den Boolean MSAlgebra over 2GatesCircStr(a1,a2,a3,'xor') equals
    2GatesCircuit(a1,a2,a3,'xor');
end;

:: FSCIRC_1:def 2
theorem
for b1, b2, b3 being set holds
BitSubtracterCirc(b1,b2,b3) = 2GatesCircuit(b1,b2,b3,'xor');

:: FSCIRC_1:funcnot 3 => FSCIRC_1:func 3
definition
  let a1, a2, a3 be set;
  func BorrowIStr(A1,A2,A3) -> non empty strict non void unsplit gate`1=arity gate`2isBoolean ManySortedSign equals
    ((1GateCircStr(<*a1,a2*>,and2a)) +* 1GateCircStr(<*a2,a3*>,and2)) +* 1GateCircStr(<*a1,a3*>,and2a);
end;

:: FSCIRC_1:def 3
theorem
for b1, b2, b3 being set holds
BorrowIStr(b1,b2,b3) = ((1GateCircStr(<*b1,b2*>,and2a)) +* 1GateCircStr(<*b2,b3*>,and2)) +* 1GateCircStr(<*b1,b3*>,and2a);

:: FSCIRC_1:funcnot 4 => FSCIRC_1:func 4
definition
  let a1, a2, a3 be set;
  func BorrowStr(A1,A2,A3) -> non empty strict non void unsplit gate`1=arity gate`2isBoolean ManySortedSign equals
    (BorrowIStr(a1,a2,a3)) +* 1GateCircStr(<*[<*a1,a2*>,and2a],[<*a2,a3*>,and2],[<*a1,a3*>,and2a]*>,or3);
end;

:: FSCIRC_1:def 4
theorem
for b1, b2, b3 being set holds
BorrowStr(b1,b2,b3) = (BorrowIStr(b1,b2,b3)) +* 1GateCircStr(<*[<*b1,b2*>,and2a],[<*b2,b3*>,and2],[<*b1,b3*>,and2a]*>,or3);

:: FSCIRC_1:funcnot 5 => FSCIRC_1:func 5
definition
  let a1, a2, a3 be set;
  func BorrowICirc(A1,A2,A3) -> strict locally-finite gate`2=den Boolean MSAlgebra over BorrowIStr(a1,a2,a3) equals
    ((1GateCircuit(a1,a2,and2a)) +* 1GateCircuit(a2,a3,and2)) +* 1GateCircuit(a1,a3,and2a);
end;

:: FSCIRC_1:def 5
theorem
for b1, b2, b3 being set holds
BorrowICirc(b1,b2,b3) = ((1GateCircuit(b1,b2,and2a)) +* 1GateCircuit(b2,b3,and2)) +* 1GateCircuit(b1,b3,and2a);

:: FSCIRC_1:th 1
theorem
for b1, b2, b3 being set holds
InnerVertices BorrowStr(b1,b2,b3) is Relation-like set;

:: FSCIRC_1:th 2
theorem
for b1, b2, b3 being non pair set holds
InputVertices BorrowStr(b1,b2,b3) is without_pairs;

:: FSCIRC_1:th 3
theorem
for b1, b2, b3 being set
for b4 being Element of product the Sorts of BorrowICirc(b1,b2,b3)
for b5, b6 being Element of BOOLEAN
      st b5 = b4 . b1 & b6 = b4 . b2
   holds (Following b4) . [<*b1,b2*>,and2a] = ('not' b5) '&' b6;

:: FSCIRC_1:th 4
theorem
for b1, b2, b3 being set
for b4 being Element of product the Sorts of BorrowICirc(b1,b2,b3)
for b5, b6 being Element of BOOLEAN
      st b5 = b4 . b2 & b6 = b4 . b3
   holds (Following b4) . [<*b2,b3*>,and2] = b5 '&' b6;

:: FSCIRC_1:th 5
theorem
for b1, b2, b3 being set
for b4 being Element of product the Sorts of BorrowICirc(b1,b2,b3)
for b5, b6 being Element of BOOLEAN
      st b5 = b4 . b1 & b6 = b4 . b3
   holds (Following b4) . [<*b1,b3*>,and2a] = ('not' b5) '&' b6;

:: FSCIRC_1:funcnot 6 => FSCIRC_1:func 6
definition
  let a1, a2, a3 be set;
  func BorrowOutput(A1,A2,A3) -> Element of InnerVertices BorrowStr(a1,a2,a3) equals
    [<*[<*a1,a2*>,and2a],[<*a2,a3*>,and2],[<*a1,a3*>,and2a]*>,or3];
end;

:: FSCIRC_1:def 6
theorem
for b1, b2, b3 being set holds
BorrowOutput(b1,b2,b3) = [<*[<*b1,b2*>,and2a],[<*b2,b3*>,and2],[<*b1,b3*>,and2a]*>,or3];

:: FSCIRC_1:funcnot 7 => FSCIRC_1:func 7
definition
  let a1, a2, a3 be set;
  func BorrowCirc(A1,A2,A3) -> strict locally-finite gate`2=den Boolean MSAlgebra over BorrowStr(a1,a2,a3) equals
    (BorrowICirc(a1,a2,a3)) +* 1GateCircuit([<*a1,a2*>,and2a],[<*a2,a3*>,and2],[<*a1,a3*>,and2a],or3);
end;

:: FSCIRC_1:def 7
theorem
for b1, b2, b3 being set holds
BorrowCirc(b1,b2,b3) = (BorrowICirc(b1,b2,b3)) +* 1GateCircuit([<*b1,b2*>,and2a],[<*b2,b3*>,and2],[<*b1,b3*>,and2a],or3);

:: FSCIRC_1:th 6
theorem
for b1, b2, b3 being set holds
b1 in the carrier of BorrowStr(b1,b2,b3) & b2 in the carrier of BorrowStr(b1,b2,b3) & b3 in the carrier of BorrowStr(b1,b2,b3);

:: FSCIRC_1:th 7
theorem
for b1, b2, b3 being set holds
[<*b1,b2*>,and2a] in InnerVertices BorrowStr(b1,b2,b3) &
 [<*b2,b3*>,and2] in InnerVertices BorrowStr(b1,b2,b3) &
 [<*b1,b3*>,and2a] in InnerVertices BorrowStr(b1,b2,b3);

:: FSCIRC_1:th 8
theorem
for b1, b2, b3 being non pair set holds
b1 in InputVertices BorrowStr(b1,b2,b3) & b2 in InputVertices BorrowStr(b1,b2,b3) & b3 in InputVertices BorrowStr(b1,b2,b3);

:: FSCIRC_1:th 9
theorem
for b1, b2, b3 being non pair set holds
InputVertices BorrowStr(b1,b2,b3) = {b1,b2,b3} &
 InnerVertices BorrowStr(b1,b2,b3) = {[<*b1,b2*>,and2a],[<*b2,b3*>,and2],[<*b1,b3*>,and2a]} \/ {BorrowOutput(b1,b2,b3)};

:: FSCIRC_1:th 10
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BorrowCirc(b1,b2,b3)
for b5, b6 being Element of BOOLEAN
      st b5 = b4 . b1 & b6 = b4 . b2
   holds (Following b4) . [<*b1,b2*>,and2a] = ('not' b5) '&' b6;

:: FSCIRC_1:th 11
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BorrowCirc(b1,b2,b3)
for b5, b6 being Element of BOOLEAN
      st b5 = b4 . b2 & b6 = b4 . b3
   holds (Following b4) . [<*b2,b3*>,and2] = b5 '&' b6;

:: FSCIRC_1:th 12
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BorrowCirc(b1,b2,b3)
for b5, b6 being Element of BOOLEAN
      st b5 = b4 . b1 & b6 = b4 . b3
   holds (Following b4) . [<*b1,b3*>,and2a] = ('not' b5) '&' b6;

:: FSCIRC_1:th 13
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BorrowCirc(b1,b2,b3)
for b5, b6, b7 being Element of BOOLEAN
      st b5 = b4 . [<*b1,b2*>,and2a] &
         b6 = b4 . [<*b2,b3*>,and2] &
         b7 = b4 . [<*b1,b3*>,and2a]
   holds (Following b4) . BorrowOutput(b1,b2,b3) = (b5 'or' b6) 'or' b7;

:: FSCIRC_1:th 14
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BorrowCirc(b1,b2,b3)
for b5, b6 being Element of BOOLEAN
      st b5 = b4 . b1 & b6 = b4 . b2
   holds (Following(b4,2)) . [<*b1,b2*>,and2a] = ('not' b5) '&' b6;

:: FSCIRC_1:th 15
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BorrowCirc(b1,b2,b3)
for b5, b6 being Element of BOOLEAN
      st b5 = b4 . b2 & b6 = b4 . b3
   holds (Following(b4,2)) . [<*b2,b3*>,and2] = b5 '&' b6;

:: FSCIRC_1:th 16
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BorrowCirc(b1,b2,b3)
for b5, b6 being Element of BOOLEAN
      st b5 = b4 . b1 & b6 = b4 . b3
   holds (Following(b4,2)) . [<*b1,b3*>,and2a] = ('not' b5) '&' b6;

:: FSCIRC_1:th 17
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BorrowCirc(b1,b2,b3)
for b5, b6, b7 being Element of BOOLEAN
      st b5 = b4 . b1 & b6 = b4 . b2 & b7 = b4 . b3
   holds (Following(b4,2)) . BorrowOutput(b1,b2,b3) = ((('not' b5) '&' b6) 'or' (b6 '&' b7)) 'or' (('not' b5) '&' b7);

:: FSCIRC_1:th 18
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BorrowCirc(b1,b2,b3) holds
   Following(b4,2) is stable(BorrowStr(b1,b2,b3), BorrowCirc(b1,b2,b3));

:: FSCIRC_1:funcnot 8 => FSCIRC_1:func 8
definition
  let a1, a2, a3 be set;
  func BitSubtracterWithBorrowStr(A1,A2,A3) -> non empty strict non void unsplit gate`1=arity gate`2isBoolean ManySortedSign equals
    (2GatesCircStr(a1,a2,a3,'xor')) +* BorrowStr(a1,a2,a3);
end;

:: FSCIRC_1:def 8
theorem
for b1, b2, b3 being set holds
BitSubtracterWithBorrowStr(b1,b2,b3) = (2GatesCircStr(b1,b2,b3,'xor')) +* BorrowStr(b1,b2,b3);

:: FSCIRC_1:th 19
theorem
for b1, b2, b3 being non pair set holds
InputVertices BitSubtracterWithBorrowStr(b1,b2,b3) = {b1,b2,b3};

:: FSCIRC_1:th 20
theorem
for b1, b2, b3 being non pair set holds
InnerVertices BitSubtracterWithBorrowStr(b1,b2,b3) = ({[<*b1,b2*>,'xor'],2GatesCircOutput(b1,b2,b3,'xor')} \/ {[<*b1,b2*>,and2a],[<*b2,b3*>,and2],[<*b1,b3*>,and2a]}) \/ {BorrowOutput(b1,b2,b3)};

:: FSCIRC_1:th 21
theorem
for b1, b2, b3 being set
for b4 being non empty ManySortedSign
      st b4 = BitSubtracterWithBorrowStr(b1,b2,b3)
   holds b1 in the carrier of b4 & b2 in the carrier of b4 & b3 in the carrier of b4;

:: FSCIRC_1:funcnot 9 => FSCIRC_1:func 9
definition
  let a1, a2, a3 be set;
  func BitSubtracterWithBorrowCirc(A1,A2,A3) -> strict locally-finite gate`2=den Boolean MSAlgebra over BitSubtracterWithBorrowStr(a1,a2,a3) equals
    (BitSubtracterCirc(a1,a2,a3)) +* BorrowCirc(a1,a2,a3);
end;

:: FSCIRC_1:def 9
theorem
for b1, b2, b3 being set holds
BitSubtracterWithBorrowCirc(b1,b2,b3) = (BitSubtracterCirc(b1,b2,b3)) +* BorrowCirc(b1,b2,b3);

:: FSCIRC_1:th 22
theorem
for b1, b2, b3 being set holds
InnerVertices BitSubtracterWithBorrowStr(b1,b2,b3) is Relation-like set;

:: FSCIRC_1:th 23
theorem
for b1, b2, b3 being non pair set holds
InputVertices BitSubtracterWithBorrowStr(b1,b2,b3) is without_pairs;

:: FSCIRC_1:th 25
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BitSubtracterWithBorrowCirc(b1,b2,b3)
for b5, b6, b7 being Element of BOOLEAN
      st b5 = b4 . b1 & b6 = b4 . b2 & b7 = b4 . b3
   holds (Following(b4,2)) . BitSubtracterOutput(b1,b2,b3) = (b5 'xor' b6) 'xor' b7 &
    (Following(b4,2)) . BorrowOutput(b1,b2,b3) = ((('not' b5) '&' b6) 'or' (b6 '&' b7)) 'or' (('not' b5) '&' b7);

:: FSCIRC_1:th 26
theorem
for b1, b2, b3 being non pair set
for b4 being Element of product the Sorts of BitSubtracterWithBorrowCirc(b1,b2,b3) holds
   Following(b4,2) is stable(BitSubtracterWithBorrowStr(b1,b2,b3), BitSubtracterWithBorrowCirc(b1,b2,b3));