Skip to content

Commit ad34b0c

Browse files
authored
Merge pull request #78 from CakeML/cake-thunks
2 parents 34aa5a9 + 07943e5 commit ad34b0c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+8339
-2652
lines changed

compiler/backend/languages/semantics/envLangScript.sml

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ Definition dest_anyThunk_def:
164164
od
165165
End
166166

167+
Definition is_anyThunk_def:
168+
is_anyThunk v = (∃tv. dest_anyThunk v = INR tv)
169+
End
170+
167171
Definition dest_Constructor_def[simp]:
168172
dest_Constructor (Constructor s vs) = return (s, vs) ∧
169173
dest_Constructor _ = fail Type_error
@@ -243,7 +247,7 @@ Definition eval_to_def:
243247
eval_to k env (Box x) =
244248
(do
245249
v <- eval_to k env x;
246-
return (Thunk (INL v))
250+
if is_anyThunk v then fail Type_error else return (Thunk (INL v))
247251
od) ∧
248252
eval_to k env (Force x) =
249253
(if k = 0 then fail Diverge else
@@ -252,14 +256,21 @@ Definition eval_to_def:
252256
(wx, binds) <- dest_anyThunk v;
253257
case wx of
254258
INL v => return v
255-
| INR (env, y) => eval_to (k - 1) (mk_rec_env binds env) y
259+
| INR (env, y) =>
260+
do
261+
res <- eval_to (k - 1) (mk_rec_env binds env) y;
262+
if is_anyThunk res then fail Type_error else return res
263+
od
256264
od) ∧
257265
eval_to k env (Prim op xs) =
258266
(case op of
259267
Cons s =>
260268
do
261269
vs <- result_map (λx. eval_to k env x) xs;
262-
return (Constructor s vs)
270+
if EVERY is_anyThunk vs then
271+
return (Constructor s vs)
272+
else
273+
fail Type_error
263274
od
264275
| If => fail Type_error
265276
| Seq => fail Type_error
@@ -366,7 +377,8 @@ Proof
366377
\\ Cases_on ‘dest_anyThunk y’ \\ gs []
367378
\\ pairarg_tac \\ gvs []
368379
\\ BasicProvers.TOP_CASE_TAC \\ gs []
369-
\\ BasicProvers.TOP_CASE_TAC \\ gs [])
380+
\\ BasicProvers.TOP_CASE_TAC \\ gs []
381+
\\ simp [oneline sum_bind_def] \\ rpt (CASE_TAC \\ rw []) \\ gvs [])
370382
>- ((* Prim *)
371383
dsimp []
372384
\\ strip_tac
@@ -387,7 +399,17 @@ Proof
387399
\\ rw [] \\ gs [])
388400
\\ fs [DECIDE “A ⇒ ¬MEM a b ⇔ MEM a b ⇒ ¬A”]
389401
\\ IF_CASES_TAC \\ gs []
390-
\\ rw [MAP_MAP_o, combinTheory.o_DEF, MAP_EQ_f])
402+
\\ rw [MAP_MAP_o, combinTheory.o_DEF, MAP_EQ_f]
403+
\\ (
404+
gvs [EVERY_EL, EL_MAP, EXISTS_MEM, MEM_MAP, MEM_EL]
405+
\\ first_x_assum $ drule_then assume_tac \\ gvs []
406+
\\ rpt (first_x_assum $ qspec_then ‘EL n xs’ assume_tac) \\ gvs []
407+
\\ pop_assum $ drule_at_then Any assume_tac \\ gvs []
408+
\\ rpt (
409+
qpat_x_assum ‘_ ⇒ _’ mp_tac \\ impl_tac >- (qexists ‘n’ \\ simp [])
410+
\\ strip_tac)
411+
\\ Cases_on ‘eval_to k env (EL n xs)’
412+
\\ Cases_on ‘eval_to j env (EL n xs)’ \\ gvs []))
391413
>- ((* IsEq *)
392414
gvs [LENGTH_EQ_NUM_compute]
393415
\\ rename1 ‘eval_to (k - 1) env x’

0 commit comments

Comments
 (0)