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
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Cost semantics %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
grammar
heap :: 'Heap_' ::= {{ com Values on the heap }}
| cl :: :: HeapClosure {{ com Closure }}
| K args :: :: HeapConstructor {{ com Data constructor }}
| x :: :: HeapIndirection {{ com Indirection }}
cost :: 'cost_' ::=
| alloc K :: :: AllocateCon
| alloc cl :: :: AllocateClosure
| alloc PAP :: :: AllocatePAP
t {{ tex \theta }} :: 't_' ::=
| {} :: :: empty
| { ccs |-> cost } :: :: inject
| t <> t' :: :: append
G {{ tex \Gamma }}, D {{ tex \Delta }}, T {{ tex \Theta }} :: 'G_' ::= {{ com Heap }}
| G [ Gp ] :: :: vn {{ com Heap with assignment }}
Gp :: 'Gp_' ::= {{ com Heap assignment }}
| x |- ccs -> heap :: :: prod
{{ tex [[x]] \overset{[[ccs]]}{\mapsto} [[heap]] }}
formula :: 'formula_' ::=
| judgement :: :: judgement
% all the random extra stuff we didn't want to gunk up the inductive
% types with...
| alt' = alt :: :: Galt
| ccs' /= ccs :: :: Gccsneq
| Gp in G :: :: Gin
| x fresh :: :: Gfresh
v :: 'v_' ::=
| cl :: :: HClosureReentrant
| K args :: :: HConstructor
ret :: 'ret_' ::= {{ com Return values }}
| a :: :: Return {{ com Normal return }}
| { x args } :: :: LetNoEscape {{ com Jump to let-no-escape }}
subrules
v <:: heap
defns
Jcost :: '' ::=
defn
ccs , G : e >- t -> D : ret , ccs' :: :: cost :: ''
{{tex [[ccs]] [[,]] [[G]] [[:]] [[e]]\ \Downarrow_{[[t]]}\ [[D]] [[:]] [[ret]] [[,]] [[ccs']] }}
by
--------------------------------------- :: Lit
ccs, G : lit >-{}-> G : lit, ccs
x |- ccs0 -> v in G
--------------------------------------- :: Whnf
ccs, G : x nil >-{}-> G : x, ccs
ccs0, G : e >-t-> D : z, ccs'
--------------------------------------- :: Thunk
ccs, G [ x |- ccs0 -> \ u _ nil . e ] : x nil >-t-> D [ x |- ccs0 -> z ] : z, ccs'
f |- ccs0 -> \ r ccs1 </ yi // i /> </ xj // j /> . e in G
z fresh
--------------------------------------- :: AppUnder
ccs, G : f </ ai // i /> >- { ccs |-> alloc PAP } -> G [ z |- ccs -> \ r _ </ xj // j /> . f </ ai // i /> </ xj // j /> ] : z, ccs
% NB: PAPs not charged!
ccs ^ ccs0, G : e >-t-> D : z, ccs'
------------------------------------------------- :: App
ccs, G [ f |- ccs0 -> \ r CCCS </ xi // i /> . e ] : f </ ai // i /> >-t-> D : z, ccs'
ccs, G : e >-t-> D : z, ccs'
ccs1 /= CCCS
------------------------------------------------- :: AppTop
ccs, G [ f |- _ -> \ r ccs1 </ xi // i /> . e ] : f </ ai // i /> >-t-> D : z, ccs'
ccs, G : f </ ai // i /> >-t-> D : f', ccs'
ccs, D : f' </ bj // j /> >-t'-> T : z, ccs''
---------------------------------------- :: AppOver
ccs, G : f </ ai // i /> </ bj // j /> >-t <> t'-> T : z, ccs''
z fresh
---------------------------------------- :: ConApp
ccs, G : K </ ai // i /> >- { ccs |-> alloc K } -> G [ z |- ccs -> K </ ai // i /> ] : z, ccs
altj = Kk </ xi // i /> -> e'
ccs, G : e >- t -> D [ y |- _ -> Kk </ ai // i /> ] : y, ccs'
ccs, D [ y |- _ -> Kk </ ai // i /> ] : e' [ y / x ] </ [ ai / xi ] // i /> >- t' -> T : z, ccs''
--------------------------------------------------------------- :: Case
ccs, G : case e as x of </ altj // j /> >- t <> t' -> T : z, ccs''
y fresh
ccs, G [ y |- ccs -> cl ] : e [ x / y ] >- t -> D : z, ccs'
------------------------------------------------------------ :: LetClosure
ccs, G : let x = cl in e >- { ccs |-> alloc cl } <> t -> D : z, ccs'
y fresh
ccs, G [ y |- ccs -> K </ ai // i /> ] : e [ x / y ] >- t -> D : z, ccs'
------------------------------------------------------------ :: LetCon
ccs, G : let x = K CCCS </ ai // i /> in e >- { ccs |-> alloc K } <> t -> D : z, ccs'
ccs, G : e >- t -> D : { f </ ai // i /> } , ccs'
ccs, D : e' </ [ ai / xi ] // i /> >- t' -> T : z, ccs''
------------------------------------------------------------ :: LneClosure
ccs, G : lne f = \ upd _ </ x // i /> . e' in e >- t <> t' -> T : z, ccs''
ccs, G : e >- t -> D : x , ccs'
ccs, D : K </ ai // i /> >- t' -> T : z, ccs''
--------------------------------------------------------------- :: LneCon
ccs, G : lne x = K _ </ ai // i /> in e >- t <> t' -> T : z, ccs''
ccs # cc, G : e >- t -> D : z, ccs'
--------------------------------------- :: SCC
ccs, G : scc cc e >- t -> D : z, ccs'
|