File: storeScript.sml

package info (click to toggle)
ott 0.34%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,440 kB
  • sloc: ml: 25,103; makefile: 1,374; awk: 736; lisp: 183; sh: 14; sed: 4
file content (170 lines) | stat: -rw-r--r-- 7,893 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
open bossLib HolKernel boolLib listTheory rich_listTheory optionTheory combinTheory arithmeticTheory pairTheory;
open ottTheory ottLib caml_typedefTheory;
open utilTheory basicTheory shiftTheory environmentTheory validTheory;
open weakenTheory shiftTheory remv_tyvarTheory type_substsTheory;

val _ = Parse.hide "S";

val _ = new_theory "store";

val store_typing_thm = Q.store_thm ("store_typing_thm",
`!E st E'. JTstore E st E' ==> !l. (MEM (name_l l) (MAP domEB E') =
           ?v. (list_assoc l st = SOME v) /\ is_value_of_expr v)`,
RULE_INDUCT_TAC JTstore_ind [list_assoc_def, domEB_def] [] THEN METIS_TAC []);

val empty_type_sub_inst_any_thm = Q.prove (
`!E t src_t. JTinst_any E t src_t ==> !S'. JTinst_any E t (substs_typevar_typexpr S' src_t)`,
RULE_INDUCT_TAC JTinst_any_ind [JTinst_any_fun, substs_typevar_typexpr_def]
[([``"JTinst_any_tuple"``, ``"JTinst_any_ctor"``],
  SRW_TAC [] [] THEN Q.EXISTS_TAC `MAP (\x. (FST x, substs_typevar_typexpr S' (SND x))) t_t'_list` THEN
      SRW_TAC [] [MAP_MAP, ETA_THM, EVERY_MAP] THEN FULL_SIMP_TAC list_ss [EVERY_MEM])]);

val empty_type_sub_pat_thm = Q.prove (
`!S E pm t E'. JTpat S E pm t E' ==> (S = []) ==> !S'. JTpat S' E pm t E'`,
RULE_INDUCT_TAC JTpat_ind [JTpat_fun]
[([``"JTpat_typed"``],
  SRW_TAC [] [substs_tv_empty_thm] THEN METIS_TAC [empty_type_sub_inst_any_thm]),
 ([``"JTpat_construct"``, ``"JTpat_tuple"``, ``"JTpat_record"``],
  SRW_TAC [] [EVERY_MEM] THEN METIS_TAC []),
 ([``"JTpat_construct_any"``, ``"JTpat_cons"``, ``"JTpat_or"``],
  METIS_TAC [])]);

val empty_type_sub_thm = Q.prove (
`(!S E e t. JTe S E e t ==> (S = []) ==> !S'. JTe S' E e t) /\
 (!S E p t t'. JTpat_matching S E p t t' ==> (S = []) ==> !S'. JTpat_matching S' E p t t') /\
 (!S E lb E'. JTlet_binding S E lb E' ==> (S = []) ==> !S'. JTlet_binding S' E lb E') /\
 (!S E lrbs E'. JTletrec_binding S E lrbs E' ==> (S = []) ==> !S'. JTletrec_binding S' E lrbs E')`,
RULE_INDUCT_TAC JTe_sind [JTe_fun, shiftTsig_def]
[([``"JTe_typed"``], 
   SRW_TAC [] [substs_tv_empty_thm] THEN METIS_TAC [empty_type_sub_inst_any_thm]), 
 ([``"JTe_tuple"``, ``"JTe_construct"``, ``"JTe_record_constr"``, ``"JTe_record_with"``,
   ``"JTletrec_binding_equal_function"``],
  SRW_TAC [] [EVERY_MEM] THEN METIS_TAC []),
 ([``"JTpat_matching_pm"``],
  SRW_TAC [] [EVERY_MEM] THEN METIS_TAC [empty_type_sub_pat_thm]), 
 ([``"JTlet_binding_poly"``],
  METIS_TAC [empty_type_sub_pat_thm])] 
THEN
METIS_TAC []);

val store_dom_thm = Q.prove (
`!E st E'. JTstore E st E' ==> (MAP (\x. name_l (FST x)) st = MAP domEB E')`,
RULE_INDUCT_TAC JTstore_ind [domEB_def]
[]);

local

val lem1 = Q.prove (
`!E1 st E2. JTstore E1 st E2 ==> !l v. (list_assoc l st = SOME v) ==>
            ?t. (!S. JTe S E1 v t) /\ (lookup E2 (name_l l) = SOME (EB_l l t))`,
RULE_INDUCT_TAC JTstore_ind [list_assoc_def] [] THEN
SRW_TAC [] [COND_EXPAND_EQ, lookup_def, shiftEB_add_thm, domEB_def] THEN METIS_TAC [empty_type_sub_thm]);

val lem2 = Q.prove (
`!E l. type_env E ==> ~MEM (name_l l) (MAP domEB E)`,
Induct THEN SRW_TAC [] [type_env_def] THEN Cases_on `h` THEN 
FULL_SIMP_TAC (srw_ss()) [type_env_def, domEB_def]);

val lem3 = Q.prove (
`!E st E'. JTstore E st E' ==> (!v. ~(list_assoc l st = SOME v)) ==> ~MEM (name_l l) (MAP domEB E')`,
RULE_INDUCT_TAC JTstore_ind [list_assoc_def, domEB_def]
[] THEN SRW_TAC [] []);

val lem4 = (SIMP_RULE list_ss [] o GEN_ALL o
            Q.SPECL [`[EB]`, `E`, `[]`, `v`, `t`, `[]`] o GEN_ALL o
            SIMP_RULE list_ss [AND_IMP_INTRO, GSYM RIGHT_FORALL_IMP_THM])
           (hd (CONJUNCTS weak_not_tv_thm));

val lem5 = SIMP_RULE list_ss [AND_IMP_INTRO, GSYM RIGHT_FORALL_IMP_THM] (Q.prove (
`!E st E'. JTstore E st E' ==> !l t. Eok (EB_l l t::E) ==> JTstore (EB_l l t::E) st E'`,
RULE_INDUCT_TAC JTstore_ind [JTstore_fun]
[([``"JTstore_map"``],
  SRW_TAC [] [] THEN MATCH_MP_TAC lem4 THEN
      FULL_SIMP_TAC (srw_ss()) [domEB_def, MEM_MAP, Eok_def])]));

val lem6 = SIMP_RULE list_ss [AND_IMP_INTRO, GSYM RIGHT_FORALL_IMP_THM] (Q.prove (
`!E st E'. JTstore E st E' ==> !st1 st2 l v v' t. (st = st1++[(l, v')]++st2) /\ is_value_of_expr v /\
           JTe [] E v t /\ (lookup E' (name_l l) = SOME (EB_l l t)) /\ ~MEM l (MAP FST st1)  ==>
           JTstore E (st1++[(l, v)]++st2) E'`,
RULE_INDUCT_TAC JTstore_sind []
[] THEN
SRW_TAC [] [] THEN FULL_SIMP_TAC (srw_ss()) [lookup_def, domEB_def, COND_EXPAND_EQ, shiftEB_add_thm] THEN
SRW_TAC [] [] THEN Cases_on `st1` THEN FULL_SIMP_TAC list_ss [] THEN SRW_TAC [] [JTstore_fun] THEN
FULL_SIMP_TAC list_ss [FST]));

val lem7 = Q.prove (
`!E' E1 l t. (lookup (E' ++ E1) (name_l l) = SOME (EB_l l t)) /\ type_env E1 ==> 
             (lookup E' (name_l l) = SOME (EB_l l t))`,
SRW_TAC [] [lookup_append_thm] THEN Cases_on `lookup E' (name_l l)` THEN FULL_SIMP_TAC (srw_ss()) [] THEN
IMP_RES_TAC lookup_dom_thm THEN METIS_TAC [lem2]);

val lem8 = Q.prove (
`!st'. DISJOINT (remove_vn_tv (MAP (\x. name_l (FST x)) st')) (remove_vn_tv [name_l l]) ==> 
       ~MEM l (MAP FST st')`,
SRW_TAC [] [DISJOINT_MEM, EVERY_MEM] THEN POP_ASSUM (ASSUME_TAC o Q.SPEC `name_l l`) THEN
FULL_SIMP_TAC (srw_ss()) [remove_vn_tv_thm, MEM_MAP]);

in

val store_in_thm = Q.store_thm ("store_in_thm",
`!st L st'. JRstore st L st' ==> !E' E1 E2. type_env E1 /\ JTstore (E'++E1) st E' ==> 
            !S. JTLin S (E'++E1) L`,
RULE_INDUCT_TAC JRstore_ind [JTLin_cases]
[([``"JRstore_lookup"``],
  SRW_TAC [] [lookup_append_thm] THEN METIS_TAC [lem1, option_case_def]),
 ([``"JRstore_alloc"``],
  SRW_TAC [] [lem2] THEN METIS_TAC [lem3])]);

val store_out_thm = Q.store_thm ("store_out_thm",
`!st L st'. JRstore st L st' ==> !E' E'' E1 E2 E7 S. JTstore (E'++E1) st E' /\ JTLout S (E'++E1) L E7 /\
            type_env E1 ==> 
            JTstore (E7++E'++E1) st' (E7++E')`,
RULE_INDUCT_TAC JRstore_ind [JTLout_cases]
[([``"JRstore_alloc"``],
  SRW_TAC [] [JTstore_fun] THEN SRW_TAC [] [value_remv_tyvar_thm] THENL
      [MATCH_MP_TAC lem5 THEN SRW_TAC [] [Eok_def] THEN METIS_TAC [ok_thm, lem2, lem3],
       MATCH_MP_TAC lem4 THEN SRW_TAC [] [Eok_def, domEB_def, remv_tyvar_fv_thm] THEN
           METIS_TAC [remv_tyvar_thm, MEM_MAP, name_distinct, ok_thm, lem2, lem3]]),
 ([``"JRstore_assign"``],
  SRW_TAC [] [] THEN SRW_TAC [] [] THEN MATCH_MP_TAC lem6 THEN MAP_EVERY Q.EXISTS_TAC [`expr`, `t`] THEN
      SRW_TAC [] [value_remv_tyvar_thm, lookup_append_thm] THENL
      [METIS_TAC [remv_tyvar_thm],
       METIS_TAC [lem7],
       IMP_RES_TAC store_dom_thm THEN 
           `ALL_DISTINCT (remove_vn_tv (MAP domEB (E'++E1)))` 
                               by METIS_TAC [Eok_dom_thm, ok_thm, ok_ok_thm] THEN
           FULL_SIMP_TAC list_ss [ALL_DISTINCT_APPEND, remove_vn_tv_APPEND] THEN
           `ALL_DISTINCT (remove_vn_tv (MAP (\x. name_l (FST x)) st' ++ [name_l l] ++ 
                                        MAP (\x. name_l (FST x)) st))`
                               by METIS_TAC [] THEN 
           FULL_SIMP_TAC list_ss [ALL_DISTINCT_APPEND, remove_vn_tv_APPEND] THEN
           METIS_TAC [lem8]])]);
end;

local

val lem1 = Q.prove (
`!E. type_env E ==> ~MEM EB_tv E`,
Induct THEN SRW_TAC [] [type_env_def] THEN Cases_on `h` THEN 
FULL_SIMP_TAC (srw_ss ()) [type_env_def]);

val lem2 = Q.prove (
`!E. type_env E /\ MEM n (MAP domEB E) ==> ~?vn. n = name_vn vn`,
Induct THEN SRW_TAC [] [type_env_def] THEN Cases_on `h` THEN 
FULL_SIMP_TAC (srw_ss ()) [type_env_def, domEB_def]);

in

val type_env_store_weak_thm = Q.store_thm ("type_env_store_weak_thm",
`!E st E'. JTstore E st E' ==> !E1 E2 E3. (E = E1++E3) /\ type_env E2 /\ Eok (E1++E2++E3) ==> 
           JTstore (E1++E2++E3) st E'`,
RULE_INDUCT_TAC JTstore_ind [JTstore_fun]
[([``"JTstore_map"``],
  SRW_TAC [] [] THEN 
      MATCH_MP_TAC ((SIMP_RULE list_ss [AND_IMP_INTRO, GSYM RIGHT_FORALL_IMP_THM] o hd o CONJUNCTS)
                    weak_not_tv_thm) THEN 
      SRW_TAC [] [lem1] THEN METIS_TAC [lem2, MEM_MAP])]);
end;


val _ = export_theory ();