let s1, s2 be State of SCMPDS; :: thesis: for I being shiftable Program of SCMPDS st Initialize (stop I) c= s1 & I is_closed_on s1 & I is_halting_on s1 holds
for n being Element of NAT st Shift (I,n) c= s2 & card I > 0 & IC s2 = n & DataPart s1 = DataPart s2 holds
for i being Element of NAT st i < LifeSpan ((ProgramPart s1),s1) holds
( (IC (Comput ((ProgramPart s1),s1,i))) + n = IC (Comput ((ProgramPart s2),s2,i)) & CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,i))),(Comput ((ProgramPart s1),s1,i))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,i))),(Comput ((ProgramPart s2),s2,i))) & DataPart (Comput ((ProgramPart s1),s1,i)) = DataPart (Comput ((ProgramPart s2),s2,i)) )

let I be shiftable Program of SCMPDS; :: thesis: ( Initialize (stop I) c= s1 & I is_closed_on s1 & I is_halting_on s1 implies for n being Element of NAT st Shift (I,n) c= s2 & card I > 0 & IC s2 = n & DataPart s1 = DataPart s2 holds
for i being Element of NAT st i < LifeSpan ((ProgramPart s1),s1) holds
( (IC (Comput ((ProgramPart s1),s1,i))) + n = IC (Comput ((ProgramPart s2),s2,i)) & CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,i))),(Comput ((ProgramPart s1),s1,i))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,i))),(Comput ((ProgramPart s2),s2,i))) & DataPart (Comput ((ProgramPart s1),s1,i)) = DataPart (Comput ((ProgramPart s2),s2,i)) ) )

set SI = stop I;
assume that
A1: Initialize (stop I) c= s1 and
A2: I is_closed_on s1 and
A3: I is_halting_on s1 ; :: thesis: for n being Element of NAT st Shift (I,n) c= s2 & card I > 0 & IC s2 = n & DataPart s1 = DataPart s2 holds
for i being Element of NAT st i < LifeSpan ((ProgramPart s1),s1) holds
( (IC (Comput ((ProgramPart s1),s1,i))) + n = IC (Comput ((ProgramPart s2),s2,i)) & CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,i))),(Comput ((ProgramPart s1),s1,i))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,i))),(Comput ((ProgramPart s2),s2,i))) & DataPart (Comput ((ProgramPart s1),s1,i)) = DataPart (Comput ((ProgramPart s2),s2,i)) )

dom (stop I) misses dom (Start-At (0,SCMPDS)) by COMPOS_1:130;
then A4: stop I c= Initialize (stop I) by FUNCT_4:33;
then A5: dom (stop I) c= dom (Initialize (stop I)) by GRFUNC_1:8;
let n be Element of NAT ; :: thesis: ( Shift (I,n) c= s2 & card I > 0 & IC s2 = n & DataPart s1 = DataPart s2 implies for i being Element of NAT st i < LifeSpan ((ProgramPart s1),s1) holds
( (IC (Comput ((ProgramPart s1),s1,i))) + n = IC (Comput ((ProgramPart s2),s2,i)) & CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,i))),(Comput ((ProgramPart s1),s1,i))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,i))),(Comput ((ProgramPart s2),s2,i))) & DataPart (Comput ((ProgramPart s1),s1,i)) = DataPart (Comput ((ProgramPart s2),s2,i)) ) )

assume that
A6: Shift (I,n) c= s2 and
A7: card I > 0 and
A8: IC s2 = n and
A9: DataPart s1 = DataPart s2 ; :: thesis: for i being Element of NAT st i < LifeSpan ((ProgramPart s1),s1) holds
( (IC (Comput ((ProgramPart s1),s1,i))) + n = IC (Comput ((ProgramPart s2),s2,i)) & CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,i))),(Comput ((ProgramPart s1),s1,i))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,i))),(Comput ((ProgramPart s2),s2,i))) & DataPart (Comput ((ProgramPart s1),s1,i)) = DataPart (Comput ((ProgramPart s2),s2,i)) )

defpred S1[ Element of NAT ] means ( $1 < LifeSpan ((ProgramPart s1),s1) implies ( (IC (Comput ((ProgramPart s1),s1,$1))) + n = IC (Comput ((ProgramPart s2),s2,$1)) & CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,$1))),(Comput ((ProgramPart s1),s1,$1))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,$1))),(Comput ((ProgramPart s2),s2,$1))) & DataPart (Comput ((ProgramPart s1),s1,$1)) = DataPart (Comput ((ProgramPart s2),s2,$1)) ) );
I1: (Initialize s1) +* (stop I) = s1 +* (Initialize (stop I)) by COMPOS_1:125;
A10: s1 = (Initialize s1) +* (stop I) by A1, I1, FUNCT_4:79;
A11: for k being Element of NAT st S1[k] holds
S1[k + 1]
proof
let k be Element of NAT ; :: thesis: ( S1[k] implies S1[k + 1] )
assume A12: S1[k] ; :: thesis: S1[k + 1]
now
reconsider m = IC (Comput ((ProgramPart s1),s1,k)) as Element of NAT ;
set i = CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,k))),(Comput ((ProgramPart s1),s1,k)));
A13: k <= k + 1 by NAT_1:11;
reconsider l = IC (Comput ((ProgramPart s1),s1,(k + 1))) as Element of NAT ;
T: ProgramPart s1 = ProgramPart (Comput ((ProgramPart s1),s1,k)) by AMI_1:123;
A15: Comput ((ProgramPart s1),s1,(k + 1)) = Following ((ProgramPart s1),(Comput ((ProgramPart s1),s1,k))) by EXTPRO_1:4
.= Exec ((CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,k))),(Comput ((ProgramPart s1),s1,k)))),(Comput ((ProgramPart s1),s1,k))) by T ;
assume A16: k + 1 < LifeSpan ((ProgramPart s1),s1) ; :: thesis: ( (IC (Comput ((ProgramPart s1),s1,(k + 1)))) + n = IC (Comput ((ProgramPart s2),s2,(k + 1))) & CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,(k + 1)))),(Comput ((ProgramPart s1),s1,(k + 1)))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,(k + 1)))),(Comput ((ProgramPart s2),s2,(k + 1)))) & DataPart (Comput ((ProgramPart s1),s1,(k + 1))) = DataPart (Comput ((ProgramPart s2),s2,(k + 1))) )
then A17: IC (Comput ((ProgramPart s1),s1,(k + 1))) in dom I by A1, A2, A3, Th33;
then A18: l + n in dom (Shift (I,n)) by VALUED_1:25;
T: ProgramPart s2 = ProgramPart (Comput ((ProgramPart s2),s2,k)) by AMI_1:123;
A19: Comput ((ProgramPart s2),s2,(k + 1)) = Following ((ProgramPart s2),(Comput ((ProgramPart s2),s2,k))) by EXTPRO_1:4
.= Exec ((CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,k))),(Comput ((ProgramPart s2),s2,k)))),(Comput ((ProgramPart s2),s2,k))) by T ;
A20: IC (Comput ((ProgramPart s1),s1,k)) in dom (stop I) by A2, A10, SCMPDS_6:def 2;
Y: (ProgramPart (Comput ((ProgramPart s1),s1,k))) /. (IC (Comput ((ProgramPart s1),s1,k))) = (Comput ((ProgramPart s1),s1,k)) . (IC (Comput ((ProgramPart s1),s1,k))) by COMPOS_1:38;
A21: CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,k))),(Comput ((ProgramPart s1),s1,k))) = s1 . (IC (Comput ((ProgramPart s1),s1,k))) by Y, AMI_1:54
.= (Initialize (stop I)) . (IC (Comput ((ProgramPart s1),s1,k))) by A1, A5, A20, GRFUNC_1:8
.= (stop I) . (IC (Comput ((ProgramPart s1),s1,k))) by A4, A20, GRFUNC_1:8 ;
then A22: InsCode (CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,k))),(Comput ((ProgramPart s1),s1,k)))) <> 3 by A20, SCMPDS_4:def 12;
A23: IC (Comput ((ProgramPart s1),s1,(k + 1))) in dom (stop I) by A2, A10, SCMPDS_6:def 2;
A24: CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,k))),(Comput ((ProgramPart s1),s1,k))) valid_at m by A20, A21, SCMPDS_4:def 12;
A25: InsCode (CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,k))),(Comput ((ProgramPart s1),s1,k)))) <> 1 by A20, A21, SCMPDS_4:def 12;
hence A26: (IC (Comput ((ProgramPart s1),s1,(k + 1)))) + n = IC (Comput ((ProgramPart s2),s2,(k + 1))) by A12, A16, A13, A15, A19, A22, A24, SCMPDS_4:83, XXREAL_0:2; :: thesis: ( CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,(k + 1)))),(Comput ((ProgramPart s1),s1,(k + 1)))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,(k + 1)))),(Comput ((ProgramPart s2),s2,(k + 1)))) & DataPart (Comput ((ProgramPart s1),s1,(k + 1))) = DataPart (Comput ((ProgramPart s2),s2,(k + 1))) )
Y: (ProgramPart (Comput ((ProgramPart s1),s1,(k + 1)))) /. (IC (Comput ((ProgramPart s1),s1,(k + 1)))) = (Comput ((ProgramPart s1),s1,(k + 1))) . (IC (Comput ((ProgramPart s1),s1,(k + 1)))) by COMPOS_1:38;
Z: (ProgramPart (Comput ((ProgramPart s2),s2,(k + 1)))) /. (IC (Comput ((ProgramPart s2),s2,(k + 1)))) = (Comput ((ProgramPart s2),s2,(k + 1))) . (IC (Comput ((ProgramPart s2),s2,(k + 1)))) by COMPOS_1:38;
CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,(k + 1)))),(Comput ((ProgramPart s1),s1,(k + 1)))) = s1 . l by Y, AMI_1:54
.= (Initialize (stop I)) . l by A1, A5, A23, GRFUNC_1:8
.= (stop I) . l by A4, A23, GRFUNC_1:8 ;
hence CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,(k + 1)))),(Comput ((ProgramPart s1),s1,(k + 1)))) = (Shift ((stop I),n)) . (l + n) by A23, VALUED_1:def 12
.= (Shift (I,n)) . (IC (Comput ((ProgramPart s2),s2,(k + 1)))) by A26, A17, Th18
.= s2 . (IC (Comput ((ProgramPart s2),s2,(k + 1)))) by A6, A26, A18, GRFUNC_1:8
.= CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,(k + 1)))),(Comput ((ProgramPart s2),s2,(k + 1)))) by Z, AMI_1:54 ;
:: thesis: DataPart (Comput ((ProgramPart s1),s1,(k + 1))) = DataPart (Comput ((ProgramPart s2),s2,(k + 1)))
thus DataPart (Comput ((ProgramPart s1),s1,(k + 1))) = DataPart (Comput ((ProgramPart s2),s2,(k + 1))) by A12, A16, A13, A15, A19, A25, A22, A24, SCMPDS_4:83, XXREAL_0:2; :: thesis: verum
end;
hence S1[k + 1] ; :: thesis: verum
end;
let i be Element of NAT ; :: thesis: ( i < LifeSpan ((ProgramPart s1),s1) implies ( (IC (Comput ((ProgramPart s1),s1,i))) + n = IC (Comput ((ProgramPart s2),s2,i)) & CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,i))),(Comput ((ProgramPart s1),s1,i))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,i))),(Comput ((ProgramPart s2),s2,i))) & DataPart (Comput ((ProgramPart s1),s1,i)) = DataPart (Comput ((ProgramPart s2),s2,i)) ) )
A27: 0 in dom (stop I) by COMPOS_1:135;
A28: 0 in dom I by A7, AFINSQ_1:70;
A29: S1[ 0 ]
proof
assume 0 < LifeSpan ((ProgramPart s1),s1) ; :: thesis: ( (IC (Comput ((ProgramPart s1),s1,0))) + n = IC (Comput ((ProgramPart s2),s2,0)) & CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,0))),(Comput ((ProgramPart s1),s1,0))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,0))),(Comput ((ProgramPart s2),s2,0))) & DataPart (Comput ((ProgramPart s1),s1,0)) = DataPart (Comput ((ProgramPart s2),s2,0)) )
A30: 0 + n in dom (Shift (I,n)) by A28, VALUED_1:25;
A31: IC SCMPDS in dom (Initialize (stop I)) by COMPOS_1:def 16;
then A32: s1 . (IC s1) = s1 . (IC (Initialize (stop I))) by A1, GRFUNC_1:8
.= s1 . 0 by COMPOS_1:def 16
.= (Initialize (stop I)) . 0 by A1, A5, A27, GRFUNC_1:8
.= (stop I) . 0 by A4, A27, GRFUNC_1:8 ;
IC (Comput ((ProgramPart s1),s1,0)) = s1 . (IC SCMPDS) by EXTPRO_1:3
.= IC (Initialize (stop I)) by A1, A31, GRFUNC_1:8
.= 0 by COMPOS_1:def 16 ;
hence (IC (Comput ((ProgramPart s1),s1,0))) + n = 0 + n
.= IC (Comput ((ProgramPart s2),s2,0)) by A8, EXTPRO_1:3 ;
:: thesis: ( CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,0))),(Comput ((ProgramPart s1),s1,0))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,0))),(Comput ((ProgramPart s2),s2,0))) & DataPart (Comput ((ProgramPart s1),s1,0)) = DataPart (Comput ((ProgramPart s2),s2,0)) )
u: Comput ((ProgramPart s1),s1,0) = s1 by EXTPRO_1:3;
v: Comput ((ProgramPart s2),s2,0) = s2 by EXTPRO_1:3;
Y: (ProgramPart s1) /. (IC s1) = s1 . (IC s1) by COMPOS_1:38;
V: (ProgramPart s2) /. (IC s2) = s2 . (IC s2) by COMPOS_1:38;
thus CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,0))),(Comput ((ProgramPart s1),s1,0))) = CurInstr ((ProgramPart s1),s1) by u
.= (Shift ((stop I),n)) . (0 + n) by A27, A32, Y, VALUED_1:def 12
.= (Shift ((stop I),n)) . (0 + n)
.= (Shift (I,n)) . n by A7, Th19
.= CurInstr ((ProgramPart s2),s2) by A6, A8, A30, V, GRFUNC_1:8
.= CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,0))),(Comput ((ProgramPart s2),s2,0))) by v ; :: thesis: DataPart (Comput ((ProgramPart s1),s1,0)) = DataPart (Comput ((ProgramPart s2),s2,0))
thus DataPart (Comput ((ProgramPart s1),s1,0)) = DataPart s2 by A9, EXTPRO_1:3
.= DataPart (Comput ((ProgramPart s2),s2,0)) by EXTPRO_1:3 ; :: thesis: verum
end;
for k being Element of NAT holds S1[k] from NAT_1:sch 1(A29, A11);
hence ( i < LifeSpan ((ProgramPart s1),s1) implies ( (IC (Comput ((ProgramPart s1),s1,i))) + n = IC (Comput ((ProgramPart s2),s2,i)) & CurInstr ((ProgramPart (Comput ((ProgramPart s1),s1,i))),(Comput ((ProgramPart s1),s1,i))) = CurInstr ((ProgramPart (Comput ((ProgramPart s2),s2,i))),(Comput ((ProgramPart s2),s2,i))) & DataPart (Comput ((ProgramPart s1),s1,i)) = DataPart (Comput ((ProgramPart s2),s2,i)) ) ) ; :: thesis: verum