Skip to content

Commit 5ef063d

Browse files
committed
Fix alt_semantics
1 parent 34bdf6e commit 5ef063d

File tree

6 files changed

+955
-360
lines changed

6 files changed

+955
-360
lines changed

semantics/alt_semantics/proofs/bigSmallEquivScript.sml

+648-205
Large diffs are not rendered by default.

semantics/alt_semantics/proofs/bigSmallInvariantsScript.sml

+69-10
Original file line numberDiff line numberDiff line change
@@ -20,32 +20,79 @@ Inductive evaluate_ctxt:
2020
(evaluate_list ck env s1 es (s2, Rval vs2) ∧
2121
do_opapp (REVERSE vs2 ++ [v] ++ vs1) = SOME (env',e) ∧
2222
(ck ⇒ s2.clock ≠ 0) ∧
23+
(opClass op FunApp) ∧
2324
evaluate ck env' (if ck then s2 with clock := s2.clock - 1 else s2) e bv
24-
⇒ evaluate_ctxt ck env s1 (Capp Opapp vs1 () es) v bv) ∧
25+
⇒ evaluate_ctxt ck env s1 (Capp op vs1 () es) v bv) ∧
2526

2627
(evaluate_list T env s1 es (s2, Rval vs2) ∧
2728
do_opapp (REVERSE vs2 ++ [v] ++ vs1) = SOME (env',e) ∧
28-
s2.clock = 0
29-
⇒ evaluate_ctxt T env s1 (Capp Opapp vs1 () es) v
29+
s2.clock = 0
30+
(opClass op FunApp)
31+
⇒ evaluate_ctxt T env s1 (Capp op vs1 () es) v
3032
(s2, Rerr (Rabort Rtimeout_error))) ∧
3133

3234
(evaluate_list ck env s1 es (s2, Rval vs2) ∧
33-
do_opapp (REVERSE vs2 ++ [v] ++ vs1) = NONE
34-
⇒ evaluate_ctxt ck env s1 (Capp Opapp vs1 () es) v
35+
(do_opapp (REVERSE vs2 ++ [v] ++ vs1) = NONE) ∧
36+
(opClass op FunApp)
37+
⇒ evaluate_ctxt ck env s1 (Capp op vs1 () es) v
3538
(s2, Rerr (Rabort Rtype_error))) ∧
3639

37-
(op ≠ Opapp
40+
(opClass op Simple
3841
evaluate_list ck env s1 es (s2, Rval vs2) ∧
3942
do_app (s2.refs,s2.ffi) op (REVERSE vs2 ++ [v] ++ vs1) =
4043
SOME ((new_refs, new_ffi) ,res)
4144
⇒ evaluate_ctxt ck env s1 (Capp op vs1 () es) v
4245
(s2 with <| ffi := new_ffi; refs := new_refs |>, res)) ∧
4346

44-
(op ≠ Opapp ∧
47+
(opClass op Icing ∧
48+
evaluate_list ck env s1 es (s2, Rval vs2) ∧
49+
do_app (s2.refs,s2.ffi) op (REVERSE vs2 ++ [v] ++ vs1) =
50+
SOME ((new_refs, new_ffi) ,vFp) ∧
51+
s2.fp_state.canOpt ≠ FPScope Opt ∧
52+
compress_if_bool op vFp = res
53+
⇒ evaluate_ctxt ck env s1 (Capp op vs1 () es) v
54+
(s2 with <| ffi := new_ffi; refs := new_refs |>, res)) ∧
55+
56+
(opClass op Icing ∧
57+
evaluate_list ck env s1 es (s2, Rval vs2) ∧
58+
do_app (s2.refs,s2.ffi) op (REVERSE vs2 ++ [v] ++ vs1) =
59+
SOME ((new_refs, new_ffi) ,vFp) ∧
60+
s2.fp_state.canOpt = FPScope Opt ∧
61+
do_fprw vFp (s2.fp_state.opts 0) s2.fp_state.rws = NONE
62+
compress_if_bool op vFp = res
63+
⇒ evaluate_ctxt ck env s1 (Capp op vs1 () es) v
64+
((shift_fp_opts s2) with <| ffi := new_ffi; refs := new_refs |>, res)) ∧
65+
66+
(opClass op Icing ∧
67+
evaluate_list ck env s1 es (s2, Rval vs2) ∧
68+
do_app (s2.refs,s2.ffi) op (REVERSE vs2 ++ [v] ++ vs1) =
69+
SOME ((new_refs, new_ffi) ,vFp) ∧
70+
s2.fp_state.canOpt = FPScope Opt ∧
71+
do_fprw vFp (s2.fp_state.opts 0) s2.fp_state.rws = SOME rOpt ∧
72+
compress_if_bool op rOpt = res
73+
⇒ evaluate_ctxt ck env s1 (Capp op vs1 () es) v
74+
((shift_fp_opts s2) with <| ffi := new_ffi; refs := new_refs |>, res)) ∧
75+
76+
(opClass op Reals ∧
77+
evaluate_list ck env s1 es (s2, Rval vs2) ∧
78+
do_app (s2.refs,s2.ffi) op (REVERSE vs2 ++ [v] ++ vs1) =
79+
SOME ((new_refs, new_ffi) ,res) ∧
80+
s2.fp_state.real_sem
81+
⇒ evaluate_ctxt ck env s1 (Capp op vs1 () es) v
82+
(s2 with <| ffi := new_ffi; refs := new_refs |>, res)) ∧
83+
84+
(opClass op Reals ∧
85+
evaluate_list ck env s1 es (s2, Rval vs2) ∧
86+
~s2.fp_state.real_sem
87+
⇒ evaluate_ctxt ck env s1 (Capp op vs1 () es) v
88+
(shift_fp_opts s2, Rerr (Rabort Rtype_error))) ∧
89+
90+
((~opClass op FunApp) ∧
91+
(opClass op Reals ⇒ s2.fp_state.real_sem) ∧
4592
evaluate_list ck env s1 es (s2, Rval vs2) ∧
4693
do_app (s2.refs, s2.ffi) op (REVERSE vs2 ++ [v] ++ vs1) = NONE
4794
⇒ evaluate_ctxt ck env s1 (Capp op vs1 () es) v
48-
(s2, Rerr (Rabort Rtype_error))) ∧
95+
(s2, Rerr (Rabort Rtype_error))) ∧
4996

5097
(evaluate_list ck env s es (s', Rerr err)
5198
⇒ evaluate_ctxt ck env s (Capp op vs () es) v (s', Rerr err)) ∧
@@ -97,7 +144,15 @@ Inductive evaluate_ctxt:
97144

98145
evaluate_ctxt ck env s (Ctannot () t) v (s, Rval v) ∧
99146

100-
evaluate_ctxt ck env s (Clannot () l) v (s, Rval v)
147+
evaluate_ctxt ck env s (Clannot () l) v (s, Rval v) ∧
148+
149+
(oldSc = Strict ⇒
150+
evaluate_ctxt ck env s (Coptimise oldSc sc ()) v (s with fp_state := s.fp_state with canOpt := oldSc,
151+
Rval (HD (do_fpoptimise sc [v])))) ∧
152+
153+
(oldSc ≠ Strict ⇒
154+
evaluate_ctxt ck env s (Coptimise oldSc sc ()) v (s with fp_state := s.fp_state with canOpt := oldSc,
155+
Rval (HD (do_fpoptimise sc [v]))))
101156
End
102157

103158
Inductive evaluate_ctxts:
@@ -108,9 +163,13 @@ Inductive evaluate_ctxts:
108163
⇒ evaluate_ctxts ck s1 ((c,env)::cs) (Rval v) bv) ∧
109164

110165
(evaluate_ctxts ck s cs (Rerr err) bv ∧
111-
((∀pes. c ≠ Chandle () pes) ∨ (∀v. err ≠ Rraise v))
166+
((∀pes. c ≠ Chandle () pes) ∨ (∀v. err ≠ Rraise v)) ∧
167+
(∀ oldSc sc. c ≠ Coptimise oldSc sc ())
112168
⇒ evaluate_ctxts ck s ((c,env)::cs) (Rerr err) bv) ∧
113169

170+
(evaluate_ctxts ck (s with fp_state := s.fp_state with canOpt := oldSc) cs (Rerr err) bv ⇒
171+
evaluate_ctxts ck s ((Coptimise oldSc sc (),env)::cs) (Rerr err) bv) ∧
172+
114173
(¬can_pmatch_all env.c s.refs (MAP FST pes) v ∧
115174
evaluate_ctxts ck s cs (Rerr (Rabort Rtype_error)) res2
116175
⇒ evaluate_ctxts ck s ((Chandle () pes,env)::cs) (Rerr (Rraise v)) res2) ∧

semantics/alt_semantics/proofs/determScript.sml

+12-11
Original file line numberDiff line numberDiff line change
@@ -147,20 +147,21 @@ Theorem RTC_decl_step_determ = RTC_functional_deterministic |>
147147
Lib.C MATCH_MP (Q.SPEC `env` decl_step_reln_functional) |> GEN_ALL
148148

149149
Definition Rerr_to_decl_step_result_def[simp]:
150-
Rerr_to_decl_step_result (Rraise v) = Draise v
151-
Rerr_to_decl_step_result (Rabort v) = Dabort v
150+
Rerr_to_decl_step_result fps (Rraise v) = Draise (fps, v)
151+
Rerr_to_decl_step_result fps (Rabort v) = Dabort (fps, v)
152152
End
153153

154154
Theorem small_eval_dec_def:
155155
(∀benv dst st e. small_eval_dec benv dst (st, Rval e) =
156156
(decl_step_reln benv)꙳ dst (st, Env e, [])) ∧
157157
(∀benv dst st err. small_eval_dec benv dst (st, Rerr err) =
158-
∃dst'.
159-
(decl_step_reln benv)꙳ dst (st, dst') ∧
160-
decl_step benv (st, dst') = Rerr_to_decl_step_result err)
158+
fp dst'.
159+
(decl_step_reln benv)꙳ dst (st with fp_state := fp, dst') ∧
160+
decl_step benv (st with fp_state := fp, dst') = Rerr_to_decl_step_result (st.fp_state) err)
161161
Proof
162162
rw[small_eval_dec_def] >>
163-
Cases_on `err` >> rw[small_eval_dec_def, EXISTS_PROD]
163+
Cases_on `err` >> rw[small_eval_dec_def, EXISTS_PROD] >>
164+
metis_tac[]
164165
QED
165166

166167
Theorem small_eval_dec_cases:
@@ -169,14 +170,14 @@ Theorem small_eval_dec_cases:
169170
∃dev'.
170171
(decl_step_reln env)꙳ dev dev' ∧
171172
((∃env'. SND res = Rval env' ∧ dev' = (FST res, Env env', [])) ∨
172-
(∃err. SND res = Rerr err ∧ FST dev' = FST res ∧
173-
decl_step env dev' = Rerr_to_decl_step_result err))
173+
(∃err fp. SND res = Rerr err ∧ FST dev' = FST res with fp_state := fp
174+
decl_step env dev' = Rerr_to_decl_step_result (FST res).fp_state err))
174175
Proof
175176
rw[] >> reverse eq_tac >> rw[] >> gvs[small_eval_dec_def] >>
176177
PairCases_on `res` >> gvs[small_eval_dec_def]
177-
>- (PairCases_on `dev'` >> simp[] >> goal_assum drule >> simp[]) >>
178+
>- (PairCases_on `dev'` >> gs[] >> goal_assum drule >> simp[]) >>
178179
Cases_on `res1` >> gvs[small_eval_dec_def] >>
179-
goal_assum drule >> simp[]
180+
goal_assum drule >> simp[] >> metis_tac[]
180181
QED
181182

182183
Theorem small_eval_dec_determ:
@@ -211,7 +212,7 @@ Proof
211212
qspecl_then [`env`,`dev`,`a`,`b`] assume_tac RTC_decl_step_determ >> gvs[] >>
212213
unabbrev_all_tac >> Cases_on `err` >> Cases_on `err'` >>
213214
gvs[decl_step_reln_def, decl_step_def, decl_continue_def] >>
214-
metis_tac[PAIR]
215+
Cases_on ‘r1’ >> Cases_on ‘r2’ >> gs[state_component_equality]
215216
)
216217
QED
217218

semantics/alt_semantics/proofs/interpScript.sml

+2-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ val _ = temp_delsimps["getOpClass_def"]
136136
Theorem getOpClass_opClass:
137137
(getOpClass op = FunApp ⇔ opClass op FunApp) ∧
138138
(getOpClass op = Simple ⇔ opClass op Simple) ∧
139-
(getOpClass op = Icing ⇔ opClass op Icing)
139+
(getOpClass op = Icing ⇔ opClass op Icing) ∧
140+
(getOpClass op = Reals ⇔ opClass op Reals)
140141
Proof
141142
Cases_on ‘op’ >> gs[getOpClass_def, opClass_cases]
142143
QED

0 commit comments

Comments
 (0)