@@ -164,6 +164,10 @@ Definition dest_anyThunk_def:
164164 od
165165End
166166
167+ Definition is_anyThunk_def:
168+ is_anyThunk v = (∃tv. dest_anyThunk v = INR tv)
169+ End
170+
167171Definition 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