Home
Module PreservationStackKconstrothercells
Load PreservationHeader.
Lemma goal :
  
forall obj' 
ar' 
n' 
i' 
cn' 
ih1 ih2 sf, 
sf = (
StackFrame.Kconstrothercells obj' 
ar' 
n' 
i' 
cn' 
ih1 ih2) -> 
forall (
Hin: 
In sf (
State.stack s2)), 
stackframe_weak_inv prog s2 sf.
Proof.
 inversion Hs1.
 
Opaque concat cs_le_dec Zminus.
 
inversion step; 
intros; 
subst; 
unfold stackframe_weak_inv in *; 
simpl in *; 
unfold Globals.update in *; 
simpl in *; 
subst; 
try exact (
stack _ Hin); 
try exact (
stack _ (
or_intror _ Hin)); 
try (
destruct Hin as [? | 
Hin2]; [ 
discriminate | 
exact (
stack _ Hin2) ]).
symmetry in H1.
unfold Globals.new in H1.
injection H1; 
intros; 
subst; 
simpl in *.
destruct Hin as [ | 
Hin2].
 
discriminate.
generalize (
stack _ Hin2).
intro.
destruct (
peq (
Globals.next_object gl) 
obj').
 
invall; 
subst.
 
apply False_rect.
 
generalize (
Globals.valid_none valid_global (
Ple_refl (
Globals.next_object gl))).
 
congruence.
rewrite PTree.gso; 
eauto.
 
destruct Hin as [
Heq | 
Hin2].
  
injection Heq; 
intros; 
subst.
  
sdestruct (
pointer_eq_dec (
A:=
A)
            (
obj', (
ar', 
i', (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
            (
obj', (
ar', 
i', (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
  ); 
try abstract congruence.
  
unfold state_kind_inv in *; 
simpl in *; 
invall; 
eauto 8.
 
generalize (
stack _ (
or_intror _ Hin2)).
 
sdestruct (
pointer_eq_dec (
A:=
A)
            (
obj, (
ar, 
i, (
Class.Inheritance.Repeated, 
cn :: 
nil)))
            (
obj', (
ar', 
i', (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
 ).
  
intro; 
invall; 
eauto 8.
 
intro; 
assumption.
generalize (
stack _ (
or_intror _ Hin)).
intro.
sdestruct (
 
pointer_eq_dec (
A:=
A)
            (
obj, (
ar, 
i, (
Class.Inheritance.Repeated, 
cn :: 
nil)))
            (
obj', (
ar', 
i'0, (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
); [| 
assumption].
apply False_rect.
injection e; 
intros; 
subst.
destruct (
stack_wf _ nil _ (
refl_equal _) 
_ Hin).
simpl in *.
destruct (
H1 _ _ (
refl_equal _) 
_ (
refl_equal _)).
invall.
generalize (
refl_equal (
length ar')).
rewrite H5 at 1.
rewrite app_length.
destruct x.
 
congruence.
simpl; 
intro; 
omegaContradiction.
sdestruct (
pointer_eq_dec (
A:=
A)
            (
obj,
            (
ar, 
i,
            (
match k2 with
             | 
Constructor.direct_non_virtual => 
h
             | 
Constructor.virtual => 
Class.Inheritance.Shared
             end,
            
match k2 with
            | 
Constructor.direct_non_virtual => 
p ++ 
b :: 
nil
            | 
Constructor.virtual => 
b :: 
nil
            end)))
            (
obj', (
ar', 
i', (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
).
 
apply False_rect.
 
revert kind.
 
unfold state_kind_inv.
 
simpl.
 
intro; 
invall; 
subst.
 
destruct k2; 
invall; 
subst.
  
destruct p; 
simpl in *.
   
discriminate.
  
destruct p0; 
simpl in *; 
discriminate.
 
discriminate.
destruct Hin as [| 
Hin2].
 
discriminate.
exact (
stack _ (
or_intror _ Hin2)).
sdestruct (
pointer_eq_dec (
A:=
A)
            (
obj,
            (
ar, 
i,
            (
match k2 with
             | 
Constructor.direct_non_virtual => 
h
             | 
Constructor.virtual => 
Class.Inheritance.Shared
             end,
            
match k2 with
            | 
Constructor.direct_non_virtual => 
p ++ 
b :: 
nil
            | 
Constructor.virtual => 
b :: 
nil
            end)))
            (
obj', (
ar', 
i', (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
).
 
apply False_rect.
 
generalize (
stack _ (
or_introl _ (
refl_equal _))).
 
simpl.
 
intro; 
invall; 
subst.
 
destruct k2; 
invall; 
subst.
  
destruct p; 
simpl in *.
   
discriminate.
  
destruct p; 
simpl in *; 
discriminate.
 
discriminate.
exact (
stack _ (
or_intror _ Hin)).
generalize (
stack _ Hin).
intro.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar, 
i, (
h, 
p)))
            (
obj', (
ar', 
i', (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
).
 
injection e; 
intros; 
subst.
 
invall; 
subst.
 
eauto 8.
assumption.
destruct Hin as [ | 
Hin2] .
 
discriminate.
destruct Hin2 as [ | 
Hin].
 
discriminate.
sdestruct (
 
pointer_eq_dec (
A:=
A)
            (
obj, (
ar, 
j, (
Class.Inheritance.Repeated, 
cn :: 
nil)))
            (
obj', (
ar', 
i', (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
).
 
injection e; 
intros; 
invall; 
subst.
 
apply False_rect.
 
destruct (
stack_state_wf _ Hin _ (
refl_equal _)).
 
invall.
 
generalize (
refl_equal (
length ar')).
 
rewrite H5 at 1.
 
rewrite app_length.
 
destruct x.
  
congruence.
 
simpl; 
intro; 
omegaContradiction.
exact (
stack _ Hin).
sdestruct (
 
pointer_eq_dec (
A:=
A) (
obj, (
ar, 
i, (
h, 
p)))
            (
obj', (
ar', 
i', (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
).
 2 : 
exact (
stack _ Hin).
apply False_rect.
injection e; 
intros; 
subst.
injection H; 
intros; 
subst.
revert kind.
unfold state_kind_inv.
simpl.
intro; 
invall; 
subst.
generalize (
stack _ Hin).
intro; 
invall; 
subst.
destruct H15; 
unfold_ident_in_all; 
congruence.
destruct Hin as [ | 
Hin2].
 
discriminate.
destruct Hin2 as [ | 
Hin].
 
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A)
            (
obj,
            (
ar, 
i,
            (
match beta with
             | 
Constructor.direct_non_virtual => 
h
             | 
Constructor.virtual => 
Class.Inheritance.Shared
             end,
            
match beta with
            | 
Constructor.direct_non_virtual => 
p ++ 
b :: 
nil
            | 
Constructor.virtual => 
b :: 
nil
            end)))
            (
obj', (
ar', 
i', (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
).
 2 : 
exact (
stack _ (
Hin)).
apply False_rect.
revert kind.
unfold state_kind_inv.
simpl.
intro; 
invall; 
subst.
destruct beta; 
invall; 
subst.
 
destruct p.
  
discriminate.
 
destruct p0; 
discriminate.
discriminate.
sdestruct (
 
pointer_eq_dec (
A:=
A) (
obj, (
ar, 
i, 
hp))
            (
obj'0, (
ar'0, 
i'0, (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
).
 2 : 
exact (
stack _ (
or_intror _ Hin)).
apply False_rect.
injection e; 
intros; 
subst.
revert kind.
unfold state_kind_inv.
simpl.
intros; 
invall; 
subst.
generalize (
stack _ (
or_intror _ Hin)).
intro; 
invall; 
subst.
destruct H13; 
unfold_ident_in_all; 
congruence.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar, 
i, (
h, 
p)))
            (
obj', (
ar', 
i'0, (
Class.Inheritance.Repeated, 
cn' :: 
nil)))
).
 2 : 
exact (
stack _ (
Hin)).
apply False_rect.
revert kind.
unfold state_kind_inv.
simpl.
intro; 
invall; 
subst.
injection e; 
intros; 
subst.
generalize (
stack _ Hin).
intro; 
invall; 
subst.
destruct H14; 
unfold_ident_in_all; 
congruence.
Qed.
 
End Preservation.