Article PRGCOR_1, MML version 4.99.1005

:: PRGCOR_1:th 1
theorem
for b1, b2, b3 being Element of NAT holds
(b1 + b3) -' (b2 + b3) = b1 -' b2;

:: PRGCOR_1:th 2
theorem
for b1, b2 being Element of NAT
      st 0 < b2 & b2 <= b1 mod (2 * b2)
   holds (b1 mod (2 * b2)) - b2 = b1 mod b2 &
    (b1 mod b2) + b2 = b1 mod (2 * b2);

:: PRGCOR_1:th 3
theorem
for b1, b2 being Element of NAT
      st 0 < b2 & b2 <= b1 mod (2 * b2)
   holds b1 div b2 = ((b1 div (2 * b2)) * 2) + 1;

:: PRGCOR_1:th 4
theorem
for b1, b2 being Element of NAT
      st 0 < b2 & b1 mod (2 * b2) < b2
   holds b1 mod (2 * b2) = b1 mod b2;

:: PRGCOR_1:th 5
theorem
for b1, b2 being Element of NAT
      st 0 < b2 & b1 mod (2 * b2) < b2
   holds b1 div b2 = (b1 div (2 * b2)) * 2;

:: PRGCOR_1:funcreg 1
registration
  let a1 be set;
  let a2 be Function-like Relation of a1,INT;
  let a3 be set;
  cluster a2 . a3 -> integer;
end;

:: PRGCOR_1:th 6
theorem
for b1, b2 being Element of NAT
      st 0 < b1
   holds ex b3 being Element of NAT st
      (for b4 being Element of NAT
             st b4 < b3
          holds b1 * (2 |^ b4) <= b2) &
       b2 < b1 * (2 |^ b3);

:: PRGCOR_1:th 7
theorem
for b1 being integer set
for b2 being Relation-like Function-like FinSequence-like set
      st 1 <= b1 & b1 <= len b2
   holds b1 in dom b2;

:: PRGCOR_1:funcnot 1 => PRGCOR_1:func 1
definition
  let a1, a2 be integer set;
  assume 0 <= a1 & 0 < a2;
  func idiv1_prg(A1,A2) -> integer set means
    ex b1, b2, b3 being FinSequence of INT st
       len b1 = a1 + 1 &
        len b2 = a1 + 1 &
        len b3 = a1 + 1 &
        (a2 <= a1 or it = 0) &
        (a2 <= a1 implies b1 . 1 = a2 &
         (ex b4 being integer set st
            1 <= b4 &
             b4 <= a1 &
             (for b5 being integer set
                   st 1 <= b5 & b5 < b4
                holds b1 . (b5 + 1) = (b1 . b5) * 2 &
                 b1 . (b5 + 1) <= a1) &
             b1 . (b4 + 1) = (b1 . b4) * 2 &
             a1 < b1 . (b4 + 1) &
             b3 . (b4 + 1) = 0 &
             b2 . (b4 + 1) = a1 &
             (for b5 being integer set
                   st 1 <= b5 & b5 <= b4
                holds (b1 . ((b4 + 1) - b5) <= b2 . ((b4 + 1) - (b5 - 1)) implies b2 . ((b4 + 1) - b5) = (b2 . ((b4 + 1) - (b5 - 1))) - (b1 . ((b4 + 1) - b5)) &
                  b3 . ((b4 + 1) - b5) = ((b3 . ((b4 + 1) - (b5 - 1))) * 2) + 1) &
                 (b1 . ((b4 + 1) - b5) <= b2 . ((b4 + 1) - (b5 - 1)) or b2 . ((b4 + 1) - b5) = b2 . ((b4 + 1) - (b5 - 1)) &
                  b3 . ((b4 + 1) - b5) = (b3 . ((b4 + 1) - (b5 - 1))) * 2)) &
             it = b3 . 1));
end;

:: PRGCOR_1:def 1
theorem
for b1, b2 being integer set
   st 0 <= b1 & 0 < b2
for b3 being integer set holds
      b3 = idiv1_prg(b1,b2)
   iff
      ex b4, b5, b6 being FinSequence of INT st
         len b4 = b1 + 1 &
          len b5 = b1 + 1 &
          len b6 = b1 + 1 &
          (b2 <= b1 or b3 = 0) &
          (b2 <= b1 implies b4 . 1 = b2 &
           (ex b7 being integer set st
              1 <= b7 &
               b7 <= b1 &
               (for b8 being integer set
                     st 1 <= b8 & b8 < b7
                  holds b4 . (b8 + 1) = (b4 . b8) * 2 &
                   b4 . (b8 + 1) <= b1) &
               b4 . (b7 + 1) = (b4 . b7) * 2 &
               b1 < b4 . (b7 + 1) &
               b6 . (b7 + 1) = 0 &
               b5 . (b7 + 1) = b1 &
               (for b8 being integer set
                     st 1 <= b8 & b8 <= b7
                  holds (b4 . ((b7 + 1) - b8) <= b5 . ((b7 + 1) - (b8 - 1)) implies b5 . ((b7 + 1) - b8) = (b5 . ((b7 + 1) - (b8 - 1))) - (b4 . ((b7 + 1) - b8)) &
                    b6 . ((b7 + 1) - b8) = ((b6 . ((b7 + 1) - (b8 - 1))) * 2) + 1) &
                   (b4 . ((b7 + 1) - b8) <= b5 . ((b7 + 1) - (b8 - 1)) or b5 . ((b7 + 1) - b8) = b5 . ((b7 + 1) - (b8 - 1)) &
                    b6 . ((b7 + 1) - b8) = (b6 . ((b7 + 1) - (b8 - 1))) * 2)) &
               b3 = b6 . 1));

:: PRGCOR_1:th 8
theorem
for b1, b2 being integer set
   st 0 <= b1 & 0 < b2
for b3, b4, b5 being FinSequence of INT
for b6 being integer set
      st len b3 = b1 + 1 &
         len b4 = b1 + 1 &
         len b5 = b1 + 1 &
         (b2 <= b1 implies b3 . 1 = b2 &
          1 <= b6 &
          b6 <= b1 &
          (for b7 being integer set
                st 1 <= b7 & b7 < b6
             holds b3 . (b7 + 1) = (b3 . b7) * 2 &
              b3 . (b7 + 1) <= b1) &
          b3 . (b6 + 1) = (b3 . b6) * 2 &
          b1 < b3 . (b6 + 1) &
          b5 . (b6 + 1) = 0 &
          b4 . (b6 + 1) = b1 &
          (for b7 being integer set
                st 1 <= b7 & b7 <= b6
             holds (b3 . ((b6 + 1) - b7) <= b4 . ((b6 + 1) - (b7 - 1)) implies b4 . ((b6 + 1) - b7) = (b4 . ((b6 + 1) - (b7 - 1))) - (b3 . ((b6 + 1) - b7)) &
               b5 . ((b6 + 1) - b7) = ((b5 . ((b6 + 1) - (b7 - 1))) * 2) + 1) &
              (b3 . ((b6 + 1) - b7) <= b4 . ((b6 + 1) - (b7 - 1)) or b4 . ((b6 + 1) - b7) = b4 . ((b6 + 1) - (b7 - 1)) &
               b5 . ((b6 + 1) - b7) = (b5 . ((b6 + 1) - (b7 - 1))) * 2)) &
          idiv1_prg(b1,b2) = b5 . 1)
   holds len b3 = b1 + 1 &
    len b4 = b1 + 1 &
    len b5 = b1 + 1 &
    (b2 <= b1 or idiv1_prg(b1,b2) = 0) &
    (b2 <= b1 implies 1 in dom b3 &
     b3 . 1 = b2 &
     1 <= b6 &
     b6 <= b1 &
     (for b7 being integer set
           st 1 <= b7 & b7 < b6
        holds b7 + 1 in dom b3 &
         b7 in dom b3 &
         b3 . (b7 + 1) = (b3 . b7) * 2 &
         b3 . (b7 + 1) <= b1) &
     b6 + 1 in dom b3 &
     b6 in dom b3 &
     b3 . (b6 + 1) = (b3 . b6) * 2 &
     b1 < b3 . (b6 + 1) &
     b6 + 1 in dom b5 &
     b5 . (b6 + 1) = 0 &
     b6 + 1 in dom b4 &
     b4 . (b6 + 1) = b1 &
     (for b7 being integer set
           st 1 <= b7 & b7 <= b6
        holds (b6 + 1) - (b7 - 1) in dom b4 &
         (b6 + 1) - b7 in dom b3 &
         (b3 . ((b6 + 1) - b7) <= b4 . ((b6 + 1) - (b7 - 1)) implies (b6 + 1) - b7 in dom b4 &
          (b6 + 1) - b7 in dom b3 &
          b4 . ((b6 + 1) - b7) = (b4 . ((b6 + 1) - (b7 - 1))) - (b3 . ((b6 + 1) - b7)) &
          (b6 + 1) - b7 in dom b5 &
          (b6 + 1) - (b7 - 1) in dom b5 &
          b5 . ((b6 + 1) - b7) = ((b5 . ((b6 + 1) - (b7 - 1))) * 2) + 1) &
         (b3 . ((b6 + 1) - b7) <= b4 . ((b6 + 1) - (b7 - 1)) or (b6 + 1) - b7 in dom b4 &
          (b6 + 1) - (b7 - 1) in dom b4 &
          b4 . ((b6 + 1) - b7) = b4 . ((b6 + 1) - (b7 - 1)) &
          (b6 + 1) - b7 in dom b5 &
          (b6 + 1) - (b7 - 1) in dom b5 &
          b5 . ((b6 + 1) - b7) = (b5 . ((b6 + 1) - (b7 - 1))) * 2)) &
     1 in dom b5 &
     idiv1_prg(b1,b2) = b5 . 1);

:: PRGCOR_1:th 9
theorem
for b1, b2 being Element of NAT
      st 0 < b2
   holds idiv1_prg(b1,b2) = b1 div b2;

:: PRGCOR_1:th 10
theorem
for b1, b2 being integer set
      st 0 <= b1 & 0 < b2
   holds idiv1_prg(b1,b2) = b1 div b2;

:: PRGCOR_1:th 11
theorem
for b1, b2 being integer set
for b3, b4 being Element of NAT holds
(b2 = 0 & b3 = b1 & b4 = b2 implies b1 div b2 = 0 & b3 div b4 = 0) &
 (0 <= b1 & 0 < b2 & b3 = b1 & b4 = b2 implies b1 div b2 = b3 div b4) &
 (0 <= b1 & b2 < 0 & b3 = b1 & b4 = - b2 implies (b4 * (b3 div b4) = b3 implies b1 div b2 = - (b3 div b4)) &
  (b4 * (b3 div b4) = b3 or b1 div b2 = (- (b3 div b4)) - 1)) &
 (b1 < 0 & 0 < b2 & b3 = - b1 & b4 = b2 implies (b4 * (b3 div b4) = b3 implies b1 div b2 = - (b3 div b4)) &
  (b4 * (b3 div b4) = b3 or b1 div b2 = (- (b3 div b4)) - 1)) &
 (b1 < 0 & b2 < 0 & b3 = - b1 & b4 = - b2 implies b1 div b2 = b3 div b4);

:: PRGCOR_1:funcnot 2 => PRGCOR_1:func 2
definition
  let a1, a2 be integer set;
  func idiv_prg(A1,A2) -> integer set means
    ex b1 being integer set st
       (a2 = 0 implies it = 0) &
        (a2 = 0 or (0 <= a1 & 0 < a2 implies it = idiv1_prg(a1,a2)) &
         (0 <= a1 & 0 < a2 or (0 <= a1 & a2 < 0 implies b1 = idiv1_prg(a1,- a2) &
           ((- a2) * b1 = a1 implies it = - b1) &
           ((- a2) * b1 = a1 or it = (- b1) - 1)) &
          (0 <= a1 & a2 < 0 or (a1 < 0 & 0 < a2 implies b1 = idiv1_prg(- a1,a2) &
            (a2 * b1 = - a1 implies it = - b1) &
            (a2 * b1 = - a1 or it = (- b1) - 1)) &
           (a1 < 0 & 0 < a2 or it = idiv1_prg(- a1,- a2)))));
end;

:: PRGCOR_1:def 2
theorem
for b1, b2, b3 being integer set holds
   b3 = idiv_prg(b1,b2)
iff
   ex b4 being integer set st
      (b2 = 0 implies b3 = 0) &
       (b2 = 0 or (0 <= b1 & 0 < b2 implies b3 = idiv1_prg(b1,b2)) &
        (0 <= b1 & 0 < b2 or (0 <= b1 & b2 < 0 implies b4 = idiv1_prg(b1,- b2) &
          ((- b2) * b4 = b1 implies b3 = - b4) &
          ((- b2) * b4 = b1 or b3 = (- b4) - 1)) &
         (0 <= b1 & b2 < 0 or (b1 < 0 & 0 < b2 implies b4 = idiv1_prg(- b1,b2) &
           (b2 * b4 = - b1 implies b3 = - b4) &
           (b2 * b4 = - b1 or b3 = (- b4) - 1)) &
          (b1 < 0 & 0 < b2 or b3 = idiv1_prg(- b1,- b2)))));

:: PRGCOR_1:th 12
theorem
for b1, b2 being integer set holds
idiv_prg(b1,b2) = b1 div b2;