Skip to content

Commit d949d89

Browse files
committed
Prove some lemmata.
superstore_object_locs_exist, superstore_result_value_loc_exists, obj_write_makes_superstore, obj_write_preserves_all_locs_exist, prop_write_preserves_object_locs_exist, prop_write_preserves_object_locs_exist, get_object_preserves_all_locs_exist
1 parent 5e25b43 commit d949d89

File tree

1 file changed

+147
-8
lines changed

1 file changed

+147
-8
lines changed

LambdaS5/coq/Consistency.v

Lines changed: 147 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -293,15 +293,47 @@ Lemma superstore_object_locs_exist :
293293
object_locs_exist st obj ->
294294
object_locs_exist st2 obj
295295
.
296-
Admitted.
296+
Proof.
297+
intros st st2 obj superstore_st_st2.
298+
unfold object_locs_exist.
299+
intros H prot cl ext primval props code obj_def.
300+
edestruct H as (H_prot, (H_primval, (H_code, H_props))).
301+
apply obj_def.
302+
303+
split.
304+
unfold superstore in superstore_st_st2.
305+
apply superstore_st_st2.
306+
assumption.
307+
308+
split.
309+
apply superstore_ok_loc_option with st;
310+
assumption.
311+
312+
split.
313+
apply superstore_ok_loc_option with st;
314+
assumption.
315+
316+
apply superstore_props_locs_exist with st;
317+
assumption.
318+
Qed.
297319

298320
Lemma superstore_result_value_loc_exists :
299321
forall st st2 res,
300322
superstore st st2 ->
301323
result_value_loc_exists ok_loc st res ->
302324
result_value_loc_exists ok_loc st2 res
303325
.
304-
Admitted.
326+
Proof.
327+
intros st st2 res superstore_st_st2.
328+
destruct res as [v|exc|b|f]; intro H; (* TODO: no auto-naming for break value. *)
329+
try apply result_value_loc_exists_return;
330+
try apply result_value_loc_exists_exception;
331+
try apply result_value_loc_exists_break;
332+
try apply result_value_loc_exists_fail;
333+
apply superstore_st_st2;
334+
inversion H;
335+
assumption.
336+
Qed.
305337

306338
Lemma fresh_loc_preserves_ok_loc :
307339
forall obj_heap val_heap loc_heap fresh_locs loc n,
@@ -716,20 +748,25 @@ Proof.
716748
Qed.
717749

718750
Lemma obj_write_makes_superstore :
719-
forall obj_heap val_heap loc_heap fresh_locs ptr obj2,
751+
forall obj_heap val_heap loc_heap fresh_locs ptr obj,
720752
superstore
721753
{|
722754
object_heap := obj_heap;
723755
value_heap := val_heap;
724756
loc_heap := loc_heap;
725757
fresh_locations := fresh_locs |}
726758
{|
727-
object_heap := Store.Heap.write obj_heap ptr obj2;
759+
object_heap := Store.Heap.write obj_heap ptr obj;
728760
value_heap := val_heap;
729761
loc_heap := loc_heap;
730762
fresh_locations := fresh_locs |}
731763
.
732-
Admitted.
764+
Proof.
765+
unfold superstore.
766+
unfold ok_loc.
767+
simpl.
768+
trivial.
769+
Qed.
733770

734771
Lemma obj_write_preserves_all_locs_exist :
735772
forall obj_heap val_heap loc_heap fresh_locs ptr obj,
@@ -751,7 +788,64 @@ Lemma obj_write_preserves_all_locs_exist :
751788
loc_heap := loc_heap;
752789
fresh_locations := fresh_locs |}
753790
.
754-
Admitted.
791+
Proof.
792+
unfold all_locs_exist.
793+
unfold all_locs_in_loc_heap_exist.
794+
unfold all_locs_in_obj_heap_exist.
795+
simpl.
796+
intros obj_heap val_heap loc_heap fresh_locs ptr0 obj0 obj_cstt H.
797+
assert (H_superstore: superstore
798+
{|
799+
object_heap := obj_heap;
800+
value_heap := val_heap;
801+
loc_heap := loc_heap;
802+
fresh_locations := fresh_locs |}
803+
{|
804+
object_heap := Store.Heap.write obj_heap ptr0 obj0;
805+
value_heap := val_heap;
806+
loc_heap := loc_heap;
807+
fresh_locations := fresh_locs |}).
808+
apply obj_write_makes_superstore.
809+
810+
split.
811+
apply H.
812+
813+
intros ptr obj binds_ptr_obj.
814+
assert (H_eq: (ptr=ptr0 /\ obj=obj0) \/ (ptr<>ptr0 /\ Heap.binds obj_heap ptr obj)).
815+
apply Heap.binds_write_inv.
816+
apply binds_ptr_obj.
817+
818+
destruct H_eq as [(ptr_eq,obj_eq)|(ptr_neq,binds'_ptr_obj)].
819+
unfold object_locs_exist.
820+
rewrite obj_eq.
821+
unfold object_locs_exist in obj_cstt.
822+
intros proto_loc class ext primval props code obj0_def.
823+
split.
824+
unfold superstore in H_superstore.
825+
apply H_superstore.
826+
apply (obj_cstt proto_loc class ext primval props code obj0_def).
827+
828+
split.
829+
eapply superstore_ok_loc_option.
830+
apply H_superstore.
831+
apply (obj_cstt proto_loc class ext primval props code obj0_def).
832+
833+
split.
834+
eapply superstore_ok_loc_option.
835+
apply H_superstore.
836+
apply (obj_cstt proto_loc class ext primval props code obj0_def).
837+
838+
eapply superstore_props_locs_exist.
839+
apply H_superstore.
840+
apply (obj_cstt proto_loc class ext primval props code obj0_def).
841+
842+
eapply superstore_object_locs_exist.
843+
apply H_superstore.
844+
845+
destruct H as (H1, H2).
846+
apply H2 with ptr.
847+
apply binds'_ptr_obj.
848+
Qed.
755849

756850
Lemma prop_write_preserves_object_locs_exist :
757851
forall st fieldname prop proto class extensible prim_value props code,
@@ -773,15 +867,60 @@ Lemma prop_write_preserves_object_locs_exist :
773867
object_properties_ := Store.Heap.write props fieldname prop;
774868
object_code := code |}
775869
.
776-
Admitted.
870+
Proof.
871+
intros st fieldname prop proto class ext primval props code prop_cstt.
872+
unfold object_locs_exist.
873+
intros H.
874+
intros proto' class' ext' primval' props' code'.
875+
intros H'.
876+
inversion H' as [(proto_eq, class_eq, ext_eq, primval_eq, props_def, code_eq)].
877+
rewrite <-proto_eq.
878+
rewrite <-primval_eq.
879+
rewrite <-code_eq.
880+
split.
881+
apply (H proto class ext primval props code).
882+
reflexivity.
883+
884+
split.
885+
apply (H proto class ext primval props code).
886+
reflexivity.
887+
888+
split.
889+
apply (H proto class ext primval props code).
890+
reflexivity.
891+
892+
unfold props_locs_exist.
893+
unfold props_locs_exist in H.
894+
intros name attrs binds_k_v.
895+
assert (H_eq: (name=fieldname /\ attrs=prop) \/ (name<>fieldname /\ Heap.binds props name attrs)).
896+
apply Heap.binds_write_inv.
897+
apply binds_k_v.
898+
destruct H_eq as [(name_eq,attrs_eq)|(name_neq,binds'_name_attrs)].
899+
rewrite attrs_eq.
900+
apply prop_cstt.
901+
902+
destruct (H proto class ext primval props code) as (_, (_, (_, H''))).
903+
reflexivity.
904+
apply H'' with name.
905+
apply binds'_name_attrs.
906+
Qed.
777907

778908
Lemma get_object_preserves_all_locs_exist :
779909
forall st ptr obj,
780910
all_locs_exist st ->
781911
get_object st ptr = Some obj ->
782912
object_locs_exist st obj
783913
.
784-
Admitted.
914+
Proof.
915+
intros st ptr obj st_cstt obj_def.
916+
unfold all_locs_exist in st_cstt.
917+
unfold all_locs_in_obj_heap_exist in st_cstt.
918+
destruct st_cstt as (_, obj_cstt).
919+
apply obj_cstt with ptr.
920+
unfold get_object in obj_def.
921+
rewrite Heap.binds_equiv_read_option.
922+
apply obj_def.
923+
Qed.
785924

786925
Lemma update_object_preserves_all_locs_exist :
787926
forall st ptr pred st2 res2,

0 commit comments

Comments
 (0)