mimium

元々のLambda-mmmは実際に使われているmimiumでの中間表現と比べて以下のような差がある

  • タプルなど構造化された型がない(実際にはVMの命令にワードサイズの情報を付加しているのでこれは結構重要)
  • letで宣言された変数に対しては代入ができる(部分的に参照型が使われている)
  • delayやfeedの項を終端の値として扱う意味論(コンパイル時の正規化作業)と、実際の評価に使われる意味論が混ざっている

\begin{align}<!-- line:16 --> \tau ::=<!-- line:17 --> & \quad unit &\\<!-- line:18 --> |&\quad R \quad &\\<!-- line:19 --> |&\quad I_n \quad &n \in \mathbb{N} \\<!-- line:20 --> |& \quad \tau * \tau \quad &\\<!-- line:21 --> |&\quad \tau → \tau &\\<!-- line:22 --> % |&\quad \langle \tau \rangle<!-- line:23 --> \end{align}<!-- line:24 --> $$<!-- line:25 --> <!-- line:26 --> ## 値<!-- line:27 --> <!-- line:28 --> $$<!-- line:29 --> \begin{align}<!-- line:30 --> v ::=<!-- line:31 --> &\quad unit & \\<!-- line:32 --> |&\quad R & R \in \mathbb{R} \\<!-- line:33 --> |&\quad v * v \quad &\\<!-- line:34 --> |&\quad \lambda x.e \\<!-- line:35 --> |&\quad delay(x,e_{time},v_{bound})\\<!-- line:36 --> |&\quad feed\ x.e<!-- line:37 --> \end{align}<!-- line:38 --> $$<!-- line:39 --> ディレイは定数や関数を入力としては受け取らない(常に変数を参照する)<!-- line:40 --> <!-- line:41 --> ## 項<!-- line:42 --> <!-- line:43 --> $$<!-- line:44 --> \begin{align}<!-- line:45 --> e_p ::=<!-- line:46 --> &\quad unit & \\<!-- line:47 --> |&\quad R & R \in \mathbb{R} \\<!-- line:48 --> <!-- line:49 --> e ::=<!-- line:50 --> &\quad e_p & \\<!-- line:51 --> |&\quad e,e & [tuple]\\ <!-- line:52 --> |&\quad x\quad &[var]\\<!-- line:53 --> |&\quad \lambda x.e &[abs]\\<!-- line:54 --> .|&\quad let\; x\; =\; e\; in\; e &[let]\\<!-- line:55 --> |&\quad e\; e &[app]\\<!-- line:56 --> |&\quad delay(e,e_{time},e_{bound}) &[delay]\\<!-- line:57 --> |&\quad feed\; x.e &[feed]<!-- line:58 --> \end{align}<!-- line:59 --> $$<!-- line:60 --> <!-- line:61 --> ## 評価環境(正規化時)<!-- line:62 --> <!-- line:63 --> $$<!-- line:64 --> \begin{align}<!-- line:65 --> E ::= &\; ()\\<!-- line:66 --> &|\; E :: (x,v)<!-- line:67 --> \end{align}<!-- line:68 --> $$<!-- line:69 --> <!-- line:70 --> ## 正規化の操作的意味論<!-- line:71 --> <!-- line:72 --> $$<!-- line:73 --> \begin{gathered}<!-- line:74 --> &\frac{E \vdash e_{bound} \Downarrow v_{bound} }<!-- line:75 --> {E \vdash delay\; e\;e_{time}\; e_{bound} \Downarrow delay\; e \; e_{time}\; v_{bound} } &\textrm{[E-DELAY]} \\\\<!-- line:76 --> <!-- line:77 --> &\frac{}{E^n \vdash\ \lambda x.e \Downarrow cls(\lambda x.e , E^n) }\ &\textrm{[E-LAM]} \\<!-- line:78 --> <!-- line:79 --> &\frac{ E^{n-1} \vdash e \Downarrow v_1\ E^n, x \mapsto v_1 \vdash e \Downarrow v_2 }{E^n, x \mapsto v_2\ \vdash\ feed\ x\ e \Downarrow v_1}\ &\textrm{[E-FEED]} \\<!-- line:80 --> <!-- line:81 --> &\frac{E^n \vdash e_c \Downarrow n \quad n > 0\ E^n \vdash e_t\ \Downarrow v\ }{E^n \vdash\ if (e_c)\ e_t\ else\ e_t \Downarrow v }\ &\textrm{[E-IFTRUE]}\\<!-- line:82 --> &\frac{E^n \vdash e_c \Downarrow n \quad n \leqq0\ E^n \vdash e_e\ \Downarrow v\ }{E^n \vdash\ if (e_c)\ e_t\ else\ e_t \Downarrow v }\ &\textrm{[E-IFFALSE]}\\<!-- line:83 --> &\frac{E^n \vdash e_1 \Downarrow cls(\lambda x_c.e_c, E^n_c) E^n \vdash e_2 \Downarrow v_2\ E^n_c,\ x_c \mapsto v_2 \vdash e_c \Downarrow v }{E^n \vdash\ e_1\ e_2 \Downarrow v }\ &\textrm{[E-APP]}<!-- line:84 --> \end{gathered}<!-- line:85 --> $$<!-- line:86 -->