Home
Module PreservationConstructionStatesVirtual
Load PreservationHeader.
Ltac forward :=
constructor;
simpl;
intros;
try discriminate;
try omegaContradiction.
Ltac fin :=
forward;
reflexivity.
Lemma goal :
forall obj o,
(
Globals.heap (
State.global s2)) !
obj =
Some o ->
forall ar cn n,
valid_array_path hier cn n (
Object.class o) (
Object.arraysize o)
ar ->
match last ar with
|
None =>
n =
Object.arraysize o /\
cn =
Object.class o
|
Some (
_,
_,
fs) =>
exists n',
n =
Zpos n' /\
FieldSignature.type fs =
FieldSignature.Struct cn n'
end ->
forall i, 0 <=
i <
n ->
forall b,
is_virtual_base_of hier b cn ->
constructed_base_child_of (
assoc (@
pointer_eq_dec _) (
obj, (
ar,
i, (
Class.Inheritance.Shared,
b ::
nil))) (
State.construction_states s2)) (
assoc (@
pointer_eq_dec _) (
obj, (
ar,
i, (
Class.Inheritance.Repeated,
cn ::
nil))) (
State.construction_states s2))
.
Proof.
inversion Hs1.
inversion step;
subst;
simpl in *;
unfold Globals.update in *;
simpl in *;
subst;
try assumption.
symmetry in H1.
unfold Globals.new in H1.
injection H1;
intros until 2;
subst;
simpl in *.
intros until 1.
destruct (
peq obj (
Globals.next_object gl)).
subst.
rewrite PTree.gss in H2.
injection H2;
intros;
subst;
simpl in *.
rewrite (
construction_states_none _ (
Globals.valid_none valid_global (
Ple_refl _))).
rewrite (
construction_states_none _ (
Globals.valid_none valid_global (
Ple_refl _))).
fin.
rewrite PTree.gso in H2;
eauto.
intros.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Repeated,
cn ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b ::
nil)))
).
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Repeated,
cn ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn0 ::
nil)))
).
2:
eauto.
injection e;
intros;
subst.
revert kind.
unfold state_kind_inv;
simpl.
intros;
invall;
subst.
assert (
i0 <=
i0 <
n)
by abstract omega.
generalize (
H15 _ H5).
intro.
generalize (
construction_states_virtual_bases _ _ H2 _ _ _ H3 H4 _ (
conj H14 H17)
_ H8).
unfold_ident_in_all.
rewrite H18.
destruct 1.
forward.
rewrite (
constructed_base_child_of_none (
refl_equal _)).
simpl;
omega.
intros.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Repeated,
cn ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b ::
nil)))
).
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Repeated,
cn ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn0 ::
nil)))
).
2 :
eauto.
injection e;
intros;
subst.
revert kind.
unfold state_kind_inv;
simpl.
intro;
invall;
subst.
forward.
eapply construction_states_virtual_bases.
eassumption.
eassumption.
assumption.
omega.
assumption.
unfold_ident_in_all;
rewrite H4;
simpl;
omega.
unfold_ident_in_all;
rewrite H4;
simpl;
omega.
intros.
unfold state_kind_inv in kind.
simpl in kind.
destruct k2;
invall;
subst.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i, (
h,
p ++
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b0 ::
nil)))
).
destruct p.
discriminate.
destruct p0;
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i, (
h,
p ++
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn ::
nil)))
).
destruct p.
discriminate.
destruct p0;
discriminate.
eauto.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Shared,
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn ::
nil)))
).
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Shared,
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b0 ::
nil)))
).
2 :
eauto.
injection e;
intros;
subst.
inversion H10;
subst.
inversion H23;
subst.
replace o0 with o in *
by abstract congruence.
generalize (
valid_array_path_last H3 H5).
intro;
subst.
inversion H21;
subst.
injection H22;
intros;
subst.
unfold_ident_in_all.
rewrite H9.
fin.
intros.
generalize (
stack _ (
or_introl _ (
refl_equal _))).
simpl.
intro.
destruct k2;
invall;
subst.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i, (
h,
p ++
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b0 ::
nil)))
).
destruct p.
discriminate.
destruct p;
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i, (
h,
p ++
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn ::
nil)))
).
destruct p.
discriminate.
destruct p;
discriminate.
eauto.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Shared,
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn ::
nil)))
).
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Shared,
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b0 ::
nil)))
).
2 :
eauto.
injection e;
intros;
subst.
inversion H6;
subst.
inversion H17;
subst.
replace o0 with o in *
by abstract congruence.
generalize (
valid_array_path_last H2 H0).
intro;
subst.
inversion H15;
subst.
injection H16;
intros;
subst.
unfold_ident_in_all.
rewrite H4.
fin.
intros.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i, (
h,
p)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn0 ::
nil)))
).
injection e;
intros;
subst.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn0 ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b ::
nil)))
).
discriminate.
forward.
revert kind.
unfold state_kind_inv;
simpl.
intro;
invall;
subst.
eapply H18.
trivial.
reflexivity.
assumption.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i, (
h,
p)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b ::
nil)))
).
2 :
eauto.
injection e;
intros;
subst.
revert kind.
unfold state_kind_inv;
simpl.
intros;
invall;
subst.
destruct stk;
try contradiction.
destruct t;
simpl in H13;
try contradiction.
generalize (
stack _ (
or_introl _ (
refl_equal _))).
simpl.
destruct inhpath.
destruct k;
try contradiction.
destruct kind;
intros;
invall;
subst.
destruct l.
discriminate.
destruct l;
discriminate.
inversion H18;
subst.
inversion H28;
subst.
replace o0 with o in *
by abstract congruence.
generalize (
valid_array_path_last H6 H2).
intros;
subst.
inversion H23;
subst.
injection H26;
intros;
subst.
unfold_ident_in_all.
rewrite H4.
fin.
invall;
discriminate.
intros.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
j, (
Class.Inheritance.Repeated,
cn ::
nil)))
(
obj0, (
ar0,
i, (
Class.Inheritance.Shared,
b ::
nil)))
).
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
j, (
Class.Inheritance.Repeated,
cn ::
nil)))
(
obj0, (
ar0,
i, (
Class.Inheritance.Repeated,
cn0 ::
nil)))
).
2 :
eauto.
injection e;
intros;
subst.
forward.
intros.
revert kind.
unfold state_kind_inv;
simpl.
intros;
invall;
subst.
assert (0 <=
i <=
i)
by omega.
generalize (
H16 _ H7).
intro.
eapply construction_states_virtual_bases.
eassumption.
2 :
eassumption.
assumption.
omega.
assumption.
unfold_ident_in_all;
rewrite H21;
simpl;
omega.
unfold_ident_in_all;
rewrite H21;
simpl;
omega.
intros.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i, (
h,
p)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn0 ::
nil)))
).
injection e;
intros;
subst.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn0 ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b ::
nil)))
).
discriminate.
unfold state_kind_inv in kind.
simpl in kind.
invall;
subst.
cut (
(
assoc (
pointer_eq_dec (
A:=
A)) (
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b ::
nil)))
cs) = (
Some Constructed)).
intros.
unfold_ident_in_all.
rewrite H5.
fin.
eapply construction_states_virtual_bases.
eassumption.
eassumption.
assumption.
tauto.
assumption.
unfold_ident_in_all;
rewrite H8;
simpl;
omega.
unfold_ident_in_all;
rewrite H8;
simpl;
omega.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i, (
h,
p)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b ::
nil)))
).
2 :
eauto.
injection e;
intros;
subst.
unfold state_kind_inv in kind.
simpl in kind;
invall;
subst.
destruct stk;
try contradiction.
destruct t;
simpl in H14;
try contradiction.
generalize (
stack _ (
or_introl _ (
refl_equal _))).
simpl.
destruct inhpath.
destruct k;
intro;
invall;
subst;
try contradiction.
destruct kind;
invall;
subst.
destruct l.
discriminate.
destruct l;
discriminate.
injection H28;
intros;
subst.
inversion H18;
subst.
inversion H29;
subst.
replace o0 with o in *
by abstract congruence.
generalize (
valid_array_path_last H7 H3).
intro;
subst.
inversion H25;
subst.
injection H27;
intros;
subst.
unfold_ident_in_all.
rewrite H5.
fin.
invall;
discriminate.
unfold state_kind_inv in kind.
simpl in kind.
destruct beta;
intros;
invall;
subst.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i, (
h,
p ++
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b0 ::
nil)))
).
destruct p.
discriminate.
destruct p0;
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i, (
h,
p ++
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn ::
nil)))
).
destruct p.
discriminate.
destruct p0;
discriminate.
eauto.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Shared,
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn ::
nil)))
).
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Shared,
b ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b0 ::
nil)))
).
2 :
eauto.
injection e;
intros;
subst.
inversion H10;
subst.
inversion H24;
subst.
replace o0 with o in *
by abstract congruence.
generalize (
valid_array_path_last H6 H0).
intro;
subst.
inversion H22;
subst.
injection H23;
intros;
subst.
unfold_ident_in_all.
rewrite H9.
fin.
intros.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i,
hp))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn ::
nil)))
).
injection e;
intros;
subst.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b0 ::
nil)))
).
discriminate.
forward.
revert kind.
unfold state_kind_inv;
simpl.
intro;
invall;
subst.
destruct hp'.
destruct beta;
invall;
try discriminate.
generalize (
stack _ (
or_introl _ (
refl_equal _))).
simpl.
intros;
invall.
destruct l.
discriminate.
destruct l;
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A) (
obj, (
ar,
i,
hp))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b0 ::
nil)))
).
2 :
eauto.
injection e;
intros;
subst.
revert kind.
unfold state_kind_inv;
simpl.
intros;
invall;
subst.
destruct hp'.
generalize (
stack _ (
or_introl _ (
refl_equal _))).
simpl.
destruct beta;
intros;
invall;
subst.
destruct l.
discriminate.
destruct l;
discriminate.
injection H27;
intros;
subst.
inversion H16;
subst.
inversion H26;
subst.
replace o0 with o in *
by abstract congruence.
generalize (
valid_array_path_last H4 H0).
intro;
subst.
inversion H21;
subst.
injection H24;
intros;
subst.
unfold_ident_in_all.
rewrite H2.
fin.
unfold state_kind_inv in kind.
simpl in kind.
invall;
subst.
intros.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Repeated,
x1 ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Shared,
b ::
nil)))
).
discriminate.
sdestruct (
pointer_eq_dec (
A:=
A)
(
obj, (
ar,
i, (
Class.Inheritance.Repeated,
x1 ::
nil)))
(
obj0, (
ar0,
i0, (
Class.Inheritance.Repeated,
cn0 ::
nil)))
).
2:
eauto.
injection e;
intros;
subst.
forward.
eapply H7.
rewrite <-
app_nil_end in H6.
eapply in_rev_elim.
eapply virtual_base_vborder_list.
eassumption.
eassumption.
assumption.
Qed.
End Preservation.