forked from CakeML/pure
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththunk_cexpScript.sml
78 lines (68 loc) · 2.9 KB
/
thunk_cexpScript.sml
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
(*
This file defines expressions for thunkLang as the compiler sees them.
*)
open HolKernel Parse boolLib bossLib;
open arithmeticTheory listTheory mlstringTheory pure_configTheory
pred_setTheory;
val _ = new_theory "thunk_cexp";
Type name[local] = “:mlstring”
Datatype:
cop = Cons name (* datatype constructor *)
| AtomOp atom_op (* primitive operations over Atoms *)
End
Datatype:
cexp = Var name (* variable *)
| Prim cop (cexp list) (* primitive operations *)
| Monad mop (cexp list) (* monadic operations *)
| App cexp (cexp list) (* function application *)
| Lam (name list) cexp (* lambda *)
| Let (name option) cexp cexp (* let *)
| Letrec ((name # cexp) list) cexp (* mutually recursive exps *)
| Case name ((name # (name list) # cexp) list) (* pattern match *)
(((name # num) list # cexp) option) (* optional fallthrough *)
| Delay cexp (* delay a computation as a thunk *)
| Force cexp (* force a thunk *)
End
val cexp_size_def = fetch "-" "cexp_size_def";
Theorem cexp_size_lemma:
(∀xs a. MEM a xs ⇒ cexp_size a < cexp8_size xs) ∧
(∀xs p e. MEM (p,e) xs ⇒ cexp_size e < cexp6_size xs) ∧
(∀xs a1 a2 a. MEM (a1,a2,a) xs ⇒ cexp_size a < cexp2_size xs)
Proof
rpt conj_tac
\\ Induct \\ rw [] \\ fs [fetch "-" "cexp_size_def"] \\ res_tac \\ fs []
QED
Definition cns_arities_def:
cns_arities (Var v :cexp) = {} ∧
cns_arities (Prim op es) = (
(case op of
| Cons cn => {{explode cn, LENGTH es}}
| _ => {}) ∪
BIGUNION (set (MAP cns_arities es))) ∧
cns_arities (Monad mop es) = (BIGUNION (set (MAP cns_arities es))) ∧
cns_arities (App e1 es) = cns_arities e1 ∪ BIGUNION (set (MAP cns_arities es)) ∧
cns_arities (Lam vs e) = cns_arities e ∧
cns_arities (Letrec funs e) =
BIGUNION (set (MAP (λ(v,e). cns_arities e) funs)) ∪ cns_arities e ∧
cns_arities (Let x e1 e2) = cns_arities e1 ∪ cns_arities e2 ∧
cns_arities (Case v css d) = (
let css_cn_ars = set (MAP (λ(cn,vs,e). explode cn, LENGTH vs) css) in
(case d of
| NONE => {css_cn_ars}
| SOME (a,e) =>
(set (MAP (λ(cn,ar). explode cn, ar) a) ∪ css_cn_ars) INSERT cns_arities e) ∪
BIGUNION (set (MAP (λ(cn,vs,e). cns_arities e) css))) ∧
cns_arities (Delay e) = cns_arities e ∧
cns_arities (Force e) = cns_arities e
Termination
WF_REL_TAC `measure cexp_size`
End
Definition is_Lam_def:
is_Lam (Lam s e) = T ∧
is_Lam _ = F
End
Definition dest_Var_def:
dest_Var (Var v) = SOME v ∧
dest_Var _ = NONE
End
val _ = export_theory();