%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Dynamic semantics %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The definitions in this file do *not* strictly correspond to any specific % code in GHC. They are here to provide a reasonable operational semantic % interpretation to the typing rules presented in the other ott files. Thus, % your mileage may vary. In particular, there has been *no* attempt to % write any formal proofs over these semantics. % % With that disclaimer disclaimed, these rules are a reasonable jumping-off % point for an analysis of FC's operational semantics. If you don't want to % worry about mutual recursion (and who does?), you can even drop the % environment S. grammar defns OpSem :: '' ::= defn e --> e' :: :: step :: 'S_' {{ com Single step semantics }} {{ tex \begin{array}{l} [[e]] [[-->]] [[e']] \end{array} }} by e1 --> e1' ------------------- :: App e1 e2 --> e1' e2 ----------------------------- :: Beta (\n.e1) e2 --> e1[n |-> e2] g0 = sym (nth 0 g) g1 = nth 1 g not e2 is_a_type not e2 is_a_coercion ----------------------------------------------- :: Push ((\n.e1) |> g) e2 --> (\n.e1 |> g1) (e2 |> g0) ---------------------------------------- :: TPush ((\n.e) |> g) t --> (\n.(e |> g n)) t g0 = nth 1 (nth 0 g) g1 = sym (nth 2 (nth 0 g)) g2 = nth 1 g ------------------------------- :: CPush ((\n.e) |> g) g' --> (\n.e |> g2) (g0 ; g' ; g1) --------------------------------------- :: Trans (e |> g1) |> g2 --> e |> (g1 ; g2) e --> e' ------------------------ :: Cast e |> g --> e' |> g e --> e' ------------------------------ :: Tick e { tick } --> e' { tick } e --> e' --------------------------------------- :: Case case e as n return t of --> case e' as n return t of altj = K -> u e = K u' = u[n |-> e] sbb] // bb /> ecc] // cc /> -------------------------------------------------------------- :: MatchData case e as n return t of --> u' altj = lit -> u ---------------------------------------------------------------- :: MatchLit case lit as n return t of --> u[n |-> lit] altj = _ -> u no other case matches ------------------------------------------------------------ :: MatchDefault case e as n return t of --> u[n |-> e] T k'~#k T = coercionKind g forall . forall . $ -> T = dataConRepType K (t1cc $ nth aa g] // aa /> _Nom] // bb />) // cc /> --------------------------- :: CasePush case (K ) |> g as n return t2 of --> \\ case K as n return t2 of ----------------- :: LetNonRec let n = e1 in e2 --> e2[n |-> e1] ------------------------------------ :: LetRec let rec in u --> u let rec in ei ] // i />