let s1, s2 be State of SCMPDS; :: thesis: for P1, P2 being the Instructions of SCMPDS -valued ManySortedSet of NAT
for I being shiftable Program of SCMPDS st stop I c= P1 & Start-At (0,SCMPDS) c= s1 & I is_closed_on s1,P1 & I is_halting_on s1,P1 holds
for n being Element of NAT st Shift (I,n) c= P2 & IC s2 = n & DataPart s1 = DataPart s2 holds
for i being Element of NAT st i < LifeSpan (P1,s1) holds
( (IC (Comput (P1,s1,i))) + n = IC (Comput (P2,s2,i)) & CurInstr (P1,(Comput (P1,s1,i))) = CurInstr (P2,(Comput (P2,s2,i))) & DataPart (Comput (P1,s1,i)) = DataPart (Comput (P2,s2,i)) )

let P1, P2 be the Instructions of SCMPDS -valued ManySortedSet of NAT ; :: thesis: for I being shiftable Program of SCMPDS st stop I c= P1 & Start-At (0,SCMPDS) c= s1 & I is_closed_on s1,P1 & I is_halting_on s1,P1 holds
for n being Element of NAT st Shift (I,n) c= P2 & IC s2 = n & DataPart s1 = DataPart s2 holds
for i being Element of NAT st i < LifeSpan (P1,s1) holds
( (IC (Comput (P1,s1,i))) + n = IC (Comput (P2,s2,i)) & CurInstr (P1,(Comput (P1,s1,i))) = CurInstr (P2,(Comput (P2,s2,i))) & DataPart (Comput (P1,s1,i)) = DataPart (Comput (P2,s2,i)) )

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

set SI = stop I;
assume that
A1: stop I c= P1 and
B1: Start-At (0,SCMPDS) c= s1 and
A2: I is_closed_on s1,P1 and
A3: I is_halting_on s1,P1 ; :: thesis: for n being Element of NAT st Shift (I,n) c= P2 & IC s2 = n & DataPart s1 = DataPart s2 holds
for i being Element of NAT st i < LifeSpan (P1,s1) holds
( (IC (Comput (P1,s1,i))) + n = IC (Comput (P2,s2,i)) & CurInstr (P1,(Comput (P1,s1,i))) = CurInstr (P2,(Comput (P2,s2,i))) & DataPart (Comput (P1,s1,i)) = DataPart (Comput (P2,s2,i)) )

let n be Element of NAT ; :: thesis: ( Shift (I,n) c= P2 & IC s2 = n & DataPart s1 = DataPart s2 implies for i being Element of NAT st i < LifeSpan (P1,s1) holds
( (IC (Comput (P1,s1,i))) + n = IC (Comput (P2,s2,i)) & CurInstr (P1,(Comput (P1,s1,i))) = CurInstr (P2,(Comput (P2,s2,i))) & DataPart (Comput (P1,s1,i)) = DataPart (Comput (P2,s2,i)) ) )

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

defpred S1[ Element of NAT ] means ( $1 < LifeSpan (P1,s1) implies ( (IC (Comput (P1,s1,$1))) + n = IC (Comput (P2,s2,$1)) & CurInstr (P1,(Comput (P1,s1,$1))) = CurInstr (P2,(Comput (P2,s2,$1))) & DataPart (Comput (P1,s1,$1)) = DataPart (Comput (P2,s2,$1)) ) );
A11: s1 = Initialize s1 by FUNCT_4:104, B1;
A12: 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 A13: S1[k] ; :: thesis: S1[k + 1]
now
reconsider m = IC (Comput (P1,s1,k)) as Element of NAT ;
set i = CurInstr (P1,(Comput (P1,s1,k)));
A14: k <= k + 1 by NAT_1:11;
reconsider l = IC (Comput (P1,s1,(k + 1))) as Element of NAT ;
A16: Comput (P1,s1,(k + 1)) = Following (P1,(Comput (P1,s1,k))) by EXTPRO_1:4
.= Exec ((CurInstr (P1,(Comput (P1,s1,k)))),(Comput (P1,s1,k))) ;
assume A17: k + 1 < LifeSpan (P1,s1) ; :: thesis: ( (IC (Comput (P1,s1,(k + 1)))) + n = IC (Comput (P2,s2,(k + 1))) & CurInstr (P1,(Comput (P1,s1,(k + 1)))) = CurInstr (P2,(Comput (P2,s2,(k + 1)))) & DataPart (Comput (P1,s1,(k + 1))) = DataPart (Comput (P2,s2,(k + 1))) )
then A18: IC (Comput (P1,s1,(k + 1))) in dom I by A1, A2, A3, Th33, B1;
then A19: l + n in dom (Shift (I,n)) by VALUED_1:25;
A21: Comput (P2,s2,(k + 1)) = Following (P2,(Comput (P2,s2,k))) by EXTPRO_1:4
.= Exec ((CurInstr (P2,(Comput (P2,s2,k)))),(Comput (P2,s2,k))) ;
XX: P1 +* (stop I) = P1 by A1, FUNCT_4:104;
then A22: IC (Comput (P1,s1,k)) in dom (stop I) by A2, A11, SCMPDS_6:def 2;
A23: P1 /. (IC (Comput (P1,s1,k))) = P1 . (IC (Comput (P1,s1,k))) by PBOOLE:158;
A24: CurInstr (P1,(Comput (P1,s1,k))) = P1 . (IC (Comput (P1,s1,k))) by A23
.= (stop I) . (IC (Comput (P1,s1,k))) by A1, A22, GRFUNC_1:8
.= (stop I) . (IC (Comput (P1,s1,k))) ;
then A25: InsCode (CurInstr (P1,(Comput (P1,s1,k)))) <> 3 by A22, SCMPDS_4:def 12;
A26: IC (Comput (P1,s1,(k + 1))) in dom (stop I) by A2, A11, SCMPDS_6:def 2, XX;
A27: CurInstr (P1,(Comput (P1,s1,k))) valid_at m by A22, A24, SCMPDS_4:def 12;
A28: InsCode (CurInstr (P1,(Comput (P1,s1,k)))) <> 1 by A22, A24, SCMPDS_4:def 12;
hence A29: (IC (Comput (P1,s1,(k + 1)))) + n = IC (Comput (P2,s2,(k + 1))) by A13, A17, A14, A16, A21, A25, A27, SCMPDS_4:83, XXREAL_0:2; :: thesis: ( CurInstr (P1,(Comput (P1,s1,(k + 1)))) = CurInstr (P2,(Comput (P2,s2,(k + 1)))) & DataPart (Comput (P1,s1,(k + 1))) = DataPart (Comput (P2,s2,(k + 1))) )
A30: P1 /. (IC (Comput (P1,s1,(k + 1)))) = P1 . (IC (Comput (P1,s1,(k + 1)))) by PBOOLE:158;
A31: P2 /. (IC (Comput (P2,s2,(k + 1)))) = P2 . (IC (Comput (P2,s2,(k + 1)))) by PBOOLE:158;
CurInstr (P1,(Comput (P1,s1,(k + 1)))) = P1 . l by A30
.= (stop I) . l by A1, A26, GRFUNC_1:8
.= (stop I) . l ;
hence CurInstr (P1,(Comput (P1,s1,(k + 1)))) = (Shift ((stop I),n)) . (l + n) by A26, VALUED_1:def 12
.= (Shift (I,n)) . (IC (Comput (P2,s2,(k + 1)))) by A29, A18, Th18
.= P2 . (IC (Comput (P2,s2,(k + 1)))) by A6, A29, A19, GRFUNC_1:8
.= CurInstr (P2,(Comput (P2,s2,(k + 1)))) by A31 ;
:: thesis: DataPart (Comput (P1,s1,(k + 1))) = DataPart (Comput (P2,s2,(k + 1)))
thus DataPart (Comput (P1,s1,(k + 1))) = DataPart (Comput (P2,s2,(k + 1))) by A13, A17, A14, A16, A21, A28, A25, A27, 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 (P1,s1) implies ( (IC (Comput (P1,s1,i))) + n = IC (Comput (P2,s2,i)) & CurInstr (P1,(Comput (P1,s1,i))) = CurInstr (P2,(Comput (P2,s2,i))) & DataPart (Comput (P1,s1,i)) = DataPart (Comput (P2,s2,i)) ) )
A32: 0 in dom (stop I) by COMPOS_1:135;
A33: 0 in dom I by A7, AFINSQ_1:70;
A34: S1[ 0 ]
proof
assume 0 < LifeSpan (P1,s1) ; :: thesis: ( (IC (Comput (P1,s1,0))) + n = IC (Comput (P2,s2,0)) & CurInstr (P1,(Comput (P1,s1,0))) = CurInstr (P2,(Comput (P2,s2,0))) & DataPart (Comput (P1,s1,0)) = DataPart (Comput (P2,s2,0)) )
A35: 0 + n in dom (Shift (I,n)) by A33, VALUED_1:25;
A36: IC in dom (Start-At (0,SCMPDS)) by COMPOS_1:def 16;
then A37: P1 . (IC s1) = P1 . (IC (Start-At (0,SCMPDS))) by GRFUNC_1:8, B1
.= P1 . 0 by COMPOS_1:def 16
.= (stop I) . 0 by A1, A32, GRFUNC_1:8
.= (stop I) . 0 ;
IC (Comput (P1,s1,0)) = IC s1 by EXTPRO_1:3
.= IC (Start-At (0,SCMPDS)) by A36, GRFUNC_1:8, B1
.= 0 by COMPOS_1:def 16 ;
hence (IC (Comput (P1,s1,0))) + n = 0 + n
.= IC (Comput (P2,s2,0)) by A8, EXTPRO_1:3 ;
:: thesis: ( CurInstr (P1,(Comput (P1,s1,0))) = CurInstr (P2,(Comput (P2,s2,0))) & DataPart (Comput (P1,s1,0)) = DataPart (Comput (P2,s2,0)) )
A38: Comput (P1,s1,0) = s1 by EXTPRO_1:3;
A39: Comput (P2,s2,0) = s2 by EXTPRO_1:3;
A40: P1 /. (IC s1) = P1 . (IC s1) by PBOOLE:158;
A41: P2 /. (IC s2) = P2 . (IC s2) by PBOOLE:158;
thus CurInstr (P1,(Comput (P1,s1,0))) = CurInstr (P1,s1) by A38
.= (Shift ((stop I),n)) . (0 + n) by A32, A37, A40, VALUED_1:def 12
.= (Shift ((stop I),n)) . (0 + n)
.= (Shift (I,n)) . n by Th19
.= CurInstr (P2,s2) by A6, A8, A35, A41, GRFUNC_1:8
.= CurInstr (P2,(Comput (P2,s2,0))) by A39 ; :: thesis: DataPart (Comput (P1,s1,0)) = DataPart (Comput (P2,s2,0))
thus DataPart (Comput (P1,s1,0)) = DataPart s2 by A9, EXTPRO_1:3
.= DataPart (Comput (P2,s2,0)) by EXTPRO_1:3 ; :: thesis: verum
end;
for k being Element of NAT holds S1[k] from NAT_1:sch 1(A34, A12);
hence ( i < LifeSpan (P1,s1) implies ( (IC (Comput (P1,s1,i))) + n = IC (Comput (P2,s2,i)) & CurInstr (P1,(Comput (P1,s1,i))) = CurInstr (P2,(Comput (P2,s2,i))) & DataPart (Comput (P1,s1,i)) = DataPart (Comput (P2,s2,i)) ) ) ; :: thesis: verum