Article SCMPDS_2, MML version 4.99.1005

:: SCMPDS_2:funcnot 1 => SCMPDS_2:func 1
definition
  func SCMPDS -> strict AMI-Struct over NAT,{INT} equals
    AMI-Struct(#SCM-Memory,In(NAT,SCM-Memory),SCMPDS-Instr,SCMPDS-OK,SCMPDS-Exec#);
end;

:: SCMPDS_2:def 1
theorem
SCMPDS = AMI-Struct(#SCM-Memory,In(NAT,SCM-Memory),SCMPDS-Instr,SCMPDS-OK,SCMPDS-Exec#);

:: SCMPDS_2:funcreg 1
registration
  cluster SCMPDS -> non empty strict stored-program standard-ins;
end;

:: SCMPDS_2:th 1
theorem
for b1 being set holds
      ex b2 being Element of NAT st
         b1 = b2
   iff
      b1 in NAT;

:: SCMPDS_2:th 3
theorem
SCMPDS is definite(NAT, {INT});

:: SCMPDS_2:funcreg 2
registration
  cluster SCMPDS -> strict IC-Ins-separated definite;
end;

:: SCMPDS_2:th 4
theorem
the Instructions of SCMPDS <> INT & NAT <> the Instructions of SCMPDS;

:: SCMPDS_2:th 6
theorem
IC SCMPDS = NAT;

:: SCMPDS_2:modenot 1 => SCMPDS_2:mode 1
definition
  mode Int_position -> Element of the carrier of SCMPDS means
    it in SCM-Data-Loc;
end;

:: SCMPDS_2:dfs 2
definiens
  let a1 be Element of the carrier of SCMPDS;
To prove
     a1 is Int_position
it is sufficient to prove
  thus a1 in SCM-Data-Loc;

:: SCMPDS_2:def 2
theorem
for b1 being Element of the carrier of SCMPDS holds
      b1 is Int_position
   iff
      b1 in SCM-Data-Loc;

:: SCMPDS_2:th 9
theorem
for b1 being set
      st b1 in SCM-Data-Loc
   holds b1 is Int_position;

:: SCMPDS_2:th 11
theorem
NAT is infinite;

:: SCMPDS_2:th 12
theorem
for b1 being Int_position holds
   b1 is Data-Location;

:: SCMPDS_2:th 13
theorem
for b1 being Int_position holds
   ObjectKind b1 = INT;

:: SCMPDS_2:funcreg 3
registration
  let a1 be Element of the Instructions of SCMPDS;
  cluster a1 `1 -> natural;
end;

:: SCMPDS_2:th 15
theorem
for b1 being Element of the Instructions of SCMPDS holds
   InsCode b1 <= 13;

:: SCMPDS_2:funcnot 2 => SCMPDS_2:func 2
definition
  let a1 be Element of product the Object-Kind of SCMPDS;
  let a2 be Int_position;
  redefine func a1 . a2 -> integer set;
end;

:: SCMPDS_2:funcnot 3 => SCMPDS_2:func 3
definition
  let a1, a2 be integer set;
  func DataLoc(A1,A2) -> Int_position equals
    [1,abs (a1 + a2)];
end;

:: SCMPDS_2:def 4
theorem
for b1, b2 being integer set holds
DataLoc(b1,b2) = [1,abs (b1 + b2)];

:: SCMPDS_2:th 16
theorem
for b1 being integer set holds
   [{},<*b1*>] in SCMPDS-Instr;

:: SCMPDS_2:th 17
theorem
for b1 being Element of SCM-Data-Loc holds
   [1,<*b1*>] in SCMPDS-Instr;

:: SCMPDS_2:th 18
theorem
for b1 being set
for b2 being Element of SCM-Data-Loc
for b3 being integer set
      st b1 in {2,3}
   holds [b1,<*b2,b3*>] in SCMPDS-Instr;

:: SCMPDS_2:th 19
theorem
for b1 being set
for b2 being Element of SCM-Data-Loc
for b3, b4 being integer set
      st b1 in {4,5,6,7,8}
   holds [b1,<*b2,b3,b4*>] in SCMPDS-Instr;

:: SCMPDS_2:th 20
theorem
for b1 being set
for b2, b3 being Element of SCM-Data-Loc
for b4, b5 being integer set
      st b1 in {9,10,11,12,13}
   holds [b1,<*b2,b3,b4,b5*>] in SCMPDS-Instr;

:: SCMPDS_2:funcnot 4 => SCMPDS_2:func 4
definition
  let a1 be integer set;
  func goto A1 -> Element of the Instructions of SCMPDS equals
    [{},<*a1*>];
end;

:: SCMPDS_2:def 5
theorem
for b1 being integer set holds
   goto b1 = [{},<*b1*>];

:: SCMPDS_2:funcnot 5 => SCMPDS_2:func 5
definition
  let a1 be Int_position;
  func return A1 -> Element of the Instructions of SCMPDS equals
    [1,<*a1*>];
end;

:: SCMPDS_2:def 6
theorem
for b1 being Int_position holds
   return b1 = [1,<*b1*>];

:: SCMPDS_2:funcnot 6 => SCMPDS_2:func 6
definition
  let a1 be Int_position;
  let a2 be integer set;
  func A1 := A2 -> Element of the Instructions of SCMPDS equals
    [2,<*a1,a2*>];
end;

:: SCMPDS_2:def 7
theorem
for b1 being Int_position
for b2 being integer set holds
   b1 := b2 = [2,<*b1,b2*>];

:: SCMPDS_2:funcnot 7 => SCMPDS_2:func 7
definition
  let a1 be Int_position;
  let a2 be integer set;
  func saveIC(A1,A2) -> Element of the Instructions of SCMPDS equals
    [3,<*a1,a2*>];
end;

:: SCMPDS_2:def 8
theorem
for b1 being Int_position
for b2 being integer set holds
   saveIC(b1,b2) = [3,<*b1,b2*>];

:: SCMPDS_2:funcnot 8 => SCMPDS_2:func 8
definition
  let a1 be Int_position;
  let a2, a3 be integer set;
  func (A1,A2)<>0_goto A3 -> Element of the Instructions of SCMPDS equals
    [4,<*a1,a2,a3*>];
end;

:: SCMPDS_2:def 9
theorem
for b1 being Int_position
for b2, b3 being integer set holds
(b1,b2)<>0_goto b3 = [4,<*b1,b2,b3*>];

:: SCMPDS_2:funcnot 9 => SCMPDS_2:func 9
definition
  let a1 be Int_position;
  let a2, a3 be integer set;
  func (A1,A2)<=0_goto A3 -> Element of the Instructions of SCMPDS equals
    [5,<*a1,a2,a3*>];
end;

:: SCMPDS_2:def 10
theorem
for b1 being Int_position
for b2, b3 being integer set holds
(b1,b2)<=0_goto b3 = [5,<*b1,b2,b3*>];

:: SCMPDS_2:funcnot 10 => SCMPDS_2:func 10
definition
  let a1 be Int_position;
  let a2, a3 be integer set;
  func (A1,A2)>=0_goto A3 -> Element of the Instructions of SCMPDS equals
    [6,<*a1,a2,a3*>];
end;

:: SCMPDS_2:def 11
theorem
for b1 being Int_position
for b2, b3 being integer set holds
(b1,b2)>=0_goto b3 = [6,<*b1,b2,b3*>];

:: SCMPDS_2:funcnot 11 => SCMPDS_2:func 11
definition
  let a1 be Int_position;
  let a2, a3 be integer set;
  func (A1,A2):= A3 -> Element of the Instructions of SCMPDS equals
    [7,<*a1,a2,a3*>];
end;

:: SCMPDS_2:def 12
theorem
for b1 being Int_position
for b2, b3 being integer set holds
(b1,b2):= b3 = [7,<*b1,b2,b3*>];

:: SCMPDS_2:funcnot 12 => SCMPDS_2:func 12
definition
  let a1 be Int_position;
  let a2, a3 be integer set;
  func AddTo(A1,A2,A3) -> Element of the Instructions of SCMPDS equals
    [8,<*a1,a2,a3*>];
end;

:: SCMPDS_2:def 13
theorem
for b1 being Int_position
for b2, b3 being integer set holds
AddTo(b1,b2,b3) = [8,<*b1,b2,b3*>];

:: SCMPDS_2:funcnot 13 => SCMPDS_2:func 13
definition
  let a1, a2 be Int_position;
  let a3, a4 be integer set;
  func AddTo(A1,A3,A2,A4) -> Element of the Instructions of SCMPDS equals
    [9,<*a1,a2,a3,a4*>];
end;

:: SCMPDS_2:def 14
theorem
for b1, b2 being Int_position
for b3, b4 being integer set holds
AddTo(b1,b3,b2,b4) = [9,<*b1,b2,b3,b4*>];

:: SCMPDS_2:funcnot 14 => SCMPDS_2:func 14
definition
  let a1, a2 be Int_position;
  let a3, a4 be integer set;
  func SubFrom(A1,A3,A2,A4) -> Element of the Instructions of SCMPDS equals
    [10,<*a1,a2,a3,a4*>];
end;

:: SCMPDS_2:def 15
theorem
for b1, b2 being Int_position
for b3, b4 being integer set holds
SubFrom(b1,b3,b2,b4) = [10,<*b1,b2,b3,b4*>];

:: SCMPDS_2:funcnot 15 => SCMPDS_2:func 15
definition
  let a1, a2 be Int_position;
  let a3, a4 be integer set;
  func MultBy(A1,A3,A2,A4) -> Element of the Instructions of SCMPDS equals
    [11,<*a1,a2,a3,a4*>];
end;

:: SCMPDS_2:def 16
theorem
for b1, b2 being Int_position
for b3, b4 being integer set holds
MultBy(b1,b3,b2,b4) = [11,<*b1,b2,b3,b4*>];

:: SCMPDS_2:funcnot 16 => SCMPDS_2:func 16
definition
  let a1, a2 be Int_position;
  let a3, a4 be integer set;
  func Divide(A1,A3,A2,A4) -> Element of the Instructions of SCMPDS equals
    [12,<*a1,a2,a3,a4*>];
end;

:: SCMPDS_2:def 17
theorem
for b1, b2 being Int_position
for b3, b4 being integer set holds
Divide(b1,b3,b2,b4) = [12,<*b1,b2,b3,b4*>];

:: SCMPDS_2:funcnot 17 => SCMPDS_2:func 17
definition
  let a1, a2 be Int_position;
  let a3, a4 be integer set;
  func (A1,A3):=(A2,A4) -> Element of the Instructions of SCMPDS equals
    [13,<*a1,a2,a3,a4*>];
end;

:: SCMPDS_2:def 18
theorem
for b1, b2 being Int_position
for b3, b4 being integer set holds
(b1,b3):=(b2,b4) = [13,<*b1,b2,b3,b4*>];

:: SCMPDS_2:th 21
theorem
for b1 being integer set holds
   InsCode goto b1 = {};

:: SCMPDS_2:th 22
theorem
for b1 being Int_position holds
   InsCode return b1 = 1;

:: SCMPDS_2:th 23
theorem
for b1 being integer set
for b2 being Int_position holds
   InsCode (b2 := b1) = 2;

:: SCMPDS_2:th 24
theorem
for b1 being integer set
for b2 being Int_position holds
   InsCode saveIC(b2,b1) = 3;

:: SCMPDS_2:th 25
theorem
for b1, b2 being integer set
for b3 being Int_position holds
   InsCode ((b3,b1)<>0_goto b2) = 4;

:: SCMPDS_2:th 26
theorem
for b1, b2 being integer set
for b3 being Int_position holds
   InsCode ((b3,b1)<=0_goto b2) = 5;

:: SCMPDS_2:th 27
theorem
for b1, b2 being integer set
for b3 being Int_position holds
   InsCode ((b3,b1)>=0_goto b2) = 6;

:: SCMPDS_2:th 28
theorem
for b1, b2 being integer set
for b3 being Int_position holds
   InsCode ((b3,b1):= b2) = 7;

:: SCMPDS_2:th 29
theorem
for b1, b2 being integer set
for b3 being Int_position holds
   InsCode AddTo(b3,b1,b2) = 8;

:: SCMPDS_2:th 30
theorem
for b1, b2 being integer set
for b3, b4 being Int_position holds
InsCode AddTo(b3,b1,b4,b2) = 9;

:: SCMPDS_2:th 31
theorem
for b1, b2 being integer set
for b3, b4 being Int_position holds
InsCode SubFrom(b3,b1,b4,b2) = 10;

:: SCMPDS_2:th 32
theorem
for b1, b2 being integer set
for b3, b4 being Int_position holds
InsCode MultBy(b3,b1,b4,b2) = 11;

:: SCMPDS_2:th 33
theorem
for b1, b2 being integer set
for b3, b4 being Int_position holds
InsCode Divide(b3,b1,b4,b2) = 12;

:: SCMPDS_2:th 34
theorem
for b1, b2 being integer set
for b3, b4 being Int_position holds
InsCode ((b3,b1):=(b4,b2)) = 13;

:: SCMPDS_2:th 35
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = {}
   holds ex b2 being integer set st
      b1 = goto b2;

:: SCMPDS_2:th 36
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 1
   holds ex b2 being Int_position st
      b1 = return b2;

:: SCMPDS_2:th 37
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 2
   holds ex b2 being Int_position st
      ex b3 being integer set st
         b1 = b2 := b3;

:: SCMPDS_2:th 38
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 3
   holds ex b2 being Int_position st
      ex b3 being integer set st
         b1 = saveIC(b2,b3);

:: SCMPDS_2:th 39
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 4
   holds ex b2 being Int_position st
      ex b3, b4 being integer set st
         b1 = (b2,b3)<>0_goto b4;

:: SCMPDS_2:th 40
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 5
   holds ex b2 being Int_position st
      ex b3, b4 being integer set st
         b1 = (b2,b3)<=0_goto b4;

:: SCMPDS_2:th 41
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 6
   holds ex b2 being Int_position st
      ex b3, b4 being integer set st
         b1 = (b2,b3)>=0_goto b4;

:: SCMPDS_2:th 42
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 7
   holds ex b2 being Int_position st
      ex b3, b4 being integer set st
         b1 = (b2,b3):= b4;

:: SCMPDS_2:th 43
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 8
   holds ex b2 being Int_position st
      ex b3, b4 being integer set st
         b1 = AddTo(b2,b3,b4);

:: SCMPDS_2:th 44
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 9
   holds ex b2, b3 being Int_position st
      ex b4, b5 being integer set st
         b1 = AddTo(b2,b4,b3,b5);

:: SCMPDS_2:th 45
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 10
   holds ex b2, b3 being Int_position st
      ex b4, b5 being integer set st
         b1 = SubFrom(b2,b4,b3,b5);

:: SCMPDS_2:th 46
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 11
   holds ex b2, b3 being Int_position st
      ex b4, b5 being integer set st
         b1 = MultBy(b2,b4,b3,b5);

:: SCMPDS_2:th 47
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 12
   holds ex b2, b3 being Int_position st
      ex b4, b5 being integer set st
         b1 = Divide(b2,b4,b3,b5);

:: SCMPDS_2:th 48
theorem
for b1 being Element of the Instructions of SCMPDS
      st InsCode b1 = 13
   holds ex b2, b3 being Int_position st
      ex b4, b5 being integer set st
         b1 = (b2,b4):=(b3,b5);

:: SCMPDS_2:th 49
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2 being Int_position holds
   b2 in proj1 b1;

:: SCMPDS_2:th 50
theorem
for b1 being Element of product the Object-Kind of SCMPDS holds
   SCM-Data-Loc c= proj1 b1;

:: SCMPDS_2:th 51
theorem
for b1 being Element of product the Object-Kind of SCMPDS holds
   proj1 (b1 | SCM-Data-Loc) = SCM-Data-Loc;

:: SCMPDS_2:th 52
theorem
for b1 being Int_position holds
   b1 <> IC SCMPDS;

:: SCMPDS_2:th 53
theorem
for b1 being Instruction-Location of SCMPDS
for b2 being Int_position holds
   b1 <> b2;

:: SCMPDS_2:th 54
theorem
for b1, b2 being Element of product the Object-Kind of SCMPDS
      st IC b1 = IC b2 &
         (for b3 being Int_position holds
            b1 . b3 = b2 . b3) &
         (for b3 being Instruction-Location of SCMPDS holds
            b1 . b3 = b2 . b3)
   holds b1 = b2;

:: SCMPDS_2:th 57
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2 being integer set
for b3 being Int_position holds
   (Exec(b3 := b2,b1)) . IC SCMPDS = succ IC b1 &
    (Exec(b3 := b2,b1)) . b3 = b2 &
    (for b4 being Int_position
          st b4 <> b3
       holds (Exec(b3 := b2,b1)) . b4 = b1 . b4);

:: SCMPDS_2:th 58
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2, b3 being integer set
for b4 being Int_position holds
   (Exec((b4,b2):= b3,b1)) . IC SCMPDS = succ IC b1 &
    (Exec((b4,b2):= b3,b1)) . DataLoc(b1 . b4,b2) = b3 &
    (for b5 being Int_position
          st b5 <> DataLoc(b1 . b4,b2)
       holds (Exec((b4,b2):= b3,b1)) . b5 = b1 . b5);

:: SCMPDS_2:th 59
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2, b3 being integer set
for b4, b5 being Int_position holds
(Exec((b4,b2):=(b5,b3),b1)) . IC SCMPDS = succ IC b1 &
 (Exec((b4,b2):=(b5,b3),b1)) . DataLoc(b1 . b4,b2) = b1 . DataLoc(b1 . b5,b3) &
 (for b6 being Int_position
       st b6 <> DataLoc(b1 . b4,b2)
    holds (Exec((b4,b2):=(b5,b3),b1)) . b6 = b1 . b6);

:: SCMPDS_2:th 60
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2, b3 being integer set
for b4 being Int_position holds
   (Exec(AddTo(b4,b2,b3),b1)) . IC SCMPDS = succ IC b1 &
    (Exec(AddTo(b4,b2,b3),b1)) . DataLoc(b1 . b4,b2) = (b1 . DataLoc(b1 . b4,b2)) + b3 &
    (for b5 being Int_position
          st b5 <> DataLoc(b1 . b4,b2)
       holds (Exec(AddTo(b4,b2,b3),b1)) . b5 = b1 . b5);

:: SCMPDS_2:th 61
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2, b3 being integer set
for b4, b5 being Int_position holds
(Exec(AddTo(b4,b2,b5,b3),b1)) . IC SCMPDS = succ IC b1 &
 (Exec(AddTo(b4,b2,b5,b3),b1)) . DataLoc(b1 . b4,b2) = (b1 . DataLoc(b1 . b4,b2)) + (b1 . DataLoc(b1 . b5,b3)) &
 (for b6 being Int_position
       st b6 <> DataLoc(b1 . b4,b2)
    holds (Exec(AddTo(b4,b2,b5,b3),b1)) . b6 = b1 . b6);

:: SCMPDS_2:th 62
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2, b3 being integer set
for b4, b5 being Int_position holds
(Exec(SubFrom(b4,b2,b5,b3),b1)) . IC SCMPDS = succ IC b1 &
 (Exec(SubFrom(b4,b2,b5,b3),b1)) . DataLoc(b1 . b4,b2) = (b1 . DataLoc(b1 . b4,b2)) - (b1 . DataLoc(b1 . b5,b3)) &
 (for b6 being Int_position
       st b6 <> DataLoc(b1 . b4,b2)
    holds (Exec(SubFrom(b4,b2,b5,b3),b1)) . b6 = b1 . b6);

:: SCMPDS_2:th 63
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2, b3 being integer set
for b4, b5 being Int_position holds
(Exec(MultBy(b4,b2,b5,b3),b1)) . IC SCMPDS = succ IC b1 &
 (Exec(MultBy(b4,b2,b5,b3),b1)) . DataLoc(b1 . b4,b2) = (b1 . DataLoc(b1 . b4,b2)) * (b1 . DataLoc(b1 . b5,b3)) &
 (for b6 being Int_position
       st b6 <> DataLoc(b1 . b4,b2)
    holds (Exec(MultBy(b4,b2,b5,b3),b1)) . b6 = b1 . b6);

:: SCMPDS_2:th 64
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2, b3 being integer set
for b4, b5 being Int_position holds
(Exec(Divide(b4,b2,b5,b3),b1)) . IC SCMPDS = succ IC b1 &
 (DataLoc(b1 . b4,b2) = DataLoc(b1 . b5,b3) or (Exec(Divide(b4,b2,b5,b3),b1)) . DataLoc(b1 . b4,b2) = (b1 . DataLoc(b1 . b4,b2)) div (b1 . DataLoc(b1 . b5,b3))) &
 (Exec(Divide(b4,b2,b5,b3),b1)) . DataLoc(b1 . b5,b3) = (b1 . DataLoc(b1 . b4,b2)) mod (b1 . DataLoc(b1 . b5,b3)) &
 (for b6 being Int_position
       st b6 <> DataLoc(b1 . b4,b2) & b6 <> DataLoc(b1 . b5,b3)
    holds (Exec(Divide(b4,b2,b5,b3),b1)) . b6 = b1 . b6);

:: SCMPDS_2:th 65
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2 being integer set
for b3 being Int_position holds
   (Exec(Divide(b3,b2,b3,b2),b1)) . IC SCMPDS = succ IC b1 &
    (Exec(Divide(b3,b2,b3,b2),b1)) . DataLoc(b1 . b3,b2) = (b1 . DataLoc(b1 . b3,b2)) mod (b1 . DataLoc(b1 . b3,b2)) &
    (for b4 being Int_position
          st b4 <> DataLoc(b1 . b3,b2)
       holds (Exec(Divide(b3,b2,b3,b2),b1)) . b4 = b1 . b4);

:: SCMPDS_2:funcnot 18 => SCMPDS_2:func 18
definition
  let a1 be Element of product the Object-Kind of SCMPDS;
  let a2 be integer set;
  func ICplusConst(A1,A2) -> Instruction-Location of SCMPDS means
    ex b1 being Element of NAT st
       b1 = IC a1 & it = abs (b1 + a2);
end;

:: SCMPDS_2:def 20
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2 being integer set
for b3 being Instruction-Location of SCMPDS holds
      b3 = ICplusConst(b1,b2)
   iff
      ex b4 being Element of NAT st
         b4 = IC b1 & b3 = abs (b4 + b2);

:: SCMPDS_2:th 66
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2 being integer set holds
   (Exec(goto b2,b1)) . IC SCMPDS = ICplusConst(b1,b2) &
    (for b3 being Int_position holds
       (Exec(goto b2,b1)) . b3 = b1 . b3);

:: SCMPDS_2:th 67
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2, b3 being integer set
for b4, b5 being Int_position holds
(b1 . DataLoc(b1 . b4,b2) = {} or (Exec((b4,b2)<>0_goto b3,b1)) . IC SCMPDS = ICplusConst(b1,b3)) &
 (b1 . DataLoc(b1 . b4,b2) = {} implies (Exec((b4,b2)<>0_goto b3,b1)) . IC SCMPDS = succ IC b1) &
 (Exec((b4,b2)<>0_goto b3,b1)) . b5 = b1 . b5;

:: SCMPDS_2:th 68
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2, b3 being integer set
for b4, b5 being Int_position holds
(b1 . DataLoc(b1 . b4,b2) <= {} implies (Exec((b4,b2)<=0_goto b3,b1)) . IC SCMPDS = ICplusConst(b1,b3)) &
 (b1 . DataLoc(b1 . b4,b2) <= {} or (Exec((b4,b2)<=0_goto b3,b1)) . IC SCMPDS = succ IC b1) &
 (Exec((b4,b2)<=0_goto b3,b1)) . b5 = b1 . b5;

:: SCMPDS_2:th 69
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2, b3 being integer set
for b4, b5 being Int_position holds
({} <= b1 . DataLoc(b1 . b4,b2) implies (Exec((b4,b2)>=0_goto b3,b1)) . IC SCMPDS = ICplusConst(b1,b3)) &
 ({} <= b1 . DataLoc(b1 . b4,b2) or (Exec((b4,b2)>=0_goto b3,b1)) . IC SCMPDS = succ IC b1) &
 (Exec((b4,b2)>=0_goto b3,b1)) . b5 = b1 . b5;

:: SCMPDS_2:th 70
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2 being Int_position holds
   (Exec(return b2,b1)) . IC SCMPDS = (abs (b1 . DataLoc(b1 . b2,RetIC))) + 2 &
    (Exec(return b2,b1)) . b2 = b1 . DataLoc(b1 . b2,RetSP) &
    (for b3 being Int_position
          st b2 <> b3
       holds (Exec(return b2,b1)) . b3 = b1 . b3);

:: SCMPDS_2:th 71
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2 being integer set
for b3 being Int_position holds
   (Exec(saveIC(b3,b2),b1)) . IC SCMPDS = succ IC b1 &
    (Exec(saveIC(b3,b2),b1)) . DataLoc(b1 . b3,b2) = IC b1 &
    (for b4 being Int_position
          st DataLoc(b1 . b3,b2) <> b4
       holds (Exec(saveIC(b3,b2),b1)) . b4 = b1 . b4);

:: SCMPDS_2:th 72
theorem
for b1 being integer set holds
   ex b2 being Function-like quasi_total Relation of SCM-Data-Loc,INT st
      for b3 being Element of SCM-Data-Loc holds
         b2 . b3 = b1;

:: SCMPDS_2:th 73
theorem
for b1 being integer set holds
   ex b2 being Element of product the Object-Kind of SCMPDS st
      for b3 being Int_position holds
         b2 . b3 = b1;

:: SCMPDS_2:th 74
theorem
for b1 being integer set
for b2 being Instruction-Location of SCMPDS holds
   ex b3 being Element of product the Object-Kind of SCMPDS st
      b3 . NAT = b2 &
       (for b4 being Int_position holds
          b3 . b4 = b1);

:: SCMPDS_2:th 75
theorem
goto {} is halting(NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 76
theorem
for b1 being Element of the Instructions of SCMPDS
      st ex b2 being Element of product the Object-Kind of SCMPDS st
           (Exec(b1,b2)) . IC SCMPDS = succ IC b2
   holds b1 is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 77
theorem
for b1 being integer set
for b2 being Int_position holds
   b2 := b1 is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 78
theorem
for b1, b2 being integer set
for b3 being Int_position holds
   (b3,b1):= b2 is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 79
theorem
for b1, b2 being integer set
for b3, b4 being Int_position holds
(b3,b1):=(b4,b2) is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 80
theorem
for b1, b2 being integer set
for b3 being Int_position holds
   AddTo(b3,b1,b2) is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 81
theorem
for b1, b2 being integer set
for b3, b4 being Int_position holds
AddTo(b3,b1,b4,b2) is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 82
theorem
for b1, b2 being integer set
for b3, b4 being Int_position holds
SubFrom(b3,b1,b4,b2) is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 83
theorem
for b1, b2 being integer set
for b3, b4 being Int_position holds
MultBy(b3,b1,b4,b2) is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 84
theorem
for b1, b2 being integer set
for b3, b4 being Int_position holds
Divide(b3,b1,b4,b2) is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 85
theorem
for b1 being integer set
      st b1 <> {}
   holds goto b1 is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 86
theorem
for b1, b2 being integer set
for b3 being Int_position holds
   (b3,b1)<>0_goto b2 is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 87
theorem
for b1, b2 being integer set
for b3 being Int_position holds
   (b3,b1)<=0_goto b2 is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 88
theorem
for b1, b2 being integer set
for b3 being Int_position holds
   (b3,b1)>=0_goto b2 is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 89
theorem
for b1 being Int_position holds
   return b1 is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 90
theorem
for b1 being integer set
for b2 being Int_position holds
   saveIC(b2,b1) is halting(not NAT, {INT}, SCMPDS);

:: SCMPDS_2:th 91
theorem
for b1 being set holds
      b1 is Element of the Instructions of SCMPDS
   iff
      ((for b2 being integer set holds
          b1 <> goto b2) &
       (for b2 being Int_position holds
          b1 <> return b2) &
       (for b2 being Int_position
       for b3 being integer set holds
          b1 <> saveIC(b2,b3)) &
       (for b2 being Int_position
       for b3 being integer set holds
          b1 <> b2 := b3) &
       (for b2 being Int_position
       for b3, b4 being integer set holds
       b1 <> (b2,b3):= b4) &
       (for b2 being Int_position
       for b3, b4 being integer set holds
       b1 <> (b2,b3)<>0_goto b4) &
       (for b2 being Int_position
       for b3, b4 being integer set holds
       b1 <> (b2,b3)<=0_goto b4) &
       (for b2 being Int_position
       for b3, b4 being integer set holds
       b1 <> (b2,b3)>=0_goto b4) &
       (for b2, b3 being Int_position
       for b4, b5 being integer set holds
       b1 <> AddTo(b2,b4,b5)) &
       (for b2, b3 being Int_position
       for b4, b5 being integer set holds
       b1 <> AddTo(b2,b4,b3,b5)) &
       (for b2, b3 being Int_position
       for b4, b5 being integer set holds
       b1 <> SubFrom(b2,b4,b3,b5)) &
       (for b2, b3 being Int_position
       for b4, b5 being integer set holds
       b1 <> MultBy(b2,b4,b3,b5)) &
       (for b2, b3 being Int_position
       for b4, b5 being integer set holds
       b1 <> Divide(b2,b4,b3,b5)) implies ex b2, b3 being Int_position st
         ex b4, b5 being integer set st
            b1 = (b2,b4):=(b3,b5));

:: SCMPDS_2:funcreg 4
registration
  cluster SCMPDS -> strict halting;
end;

:: SCMPDS_2:th 92
theorem
for b1 being Element of the Instructions of SCMPDS
      st b1 is halting(NAT, {INT}, SCMPDS)
   holds b1 = halt SCMPDS;

:: SCMPDS_2:th 93
theorem
halt SCMPDS = goto {};

:: SCMPDS_2:th 96
theorem
for b1 being Element of product the Object-Kind of SCMPDS
for b2 being Element of the Instructions of SCMPDS
for b3 being Instruction-Location of SCMPDS holds
   (Exec(b2,b1)) . b3 = b1 . b3;

:: SCMPDS_2:th 97
theorem
SCMPDS is realistic(NAT, {INT});

:: SCMPDS_2:funcreg 5
registration
  cluster SCMPDS -> strict steady-programmed realistic;
end;

:: SCMPDS_2:th 98
theorem
for b1 being Element of NAT holds
   IC SCMPDS <> dl. b1 & IC SCMPDS <> il. b1;

:: SCMPDS_2:th 99
theorem
for b1 being Element of the Instructions of SCMPDS
      st b1 = goto {}
   holds b1 is halting(NAT, {INT}, SCMPDS);