5. 構?
5
? 注釈
? アトムとはde?ne定数のようなもの
? ペアのpr(1, 2)は、タプルの(1, 2)のようなもの
? ispr?はペアかどうかを検査する関数
? 1st, 2ndは、ペアの1番目、2番目の要素を取得す
る関数
A = {true, false, nil, . . . }
N = {0, 1, 2, . . . }
X = {x, y, z, . . . }
F = {+, , =, ispr?, 1st
, 2nd
, . . . }
V ::=
A | N | X
| X.E
| pr(V, V)
E ::=
V
| pr(E, E)
| E(E)
| F(E, . . . , E)
| br(E, E, E)
| letrec X = E in E
| send(E, E)
| new(E)
| ready(E)
6. 糖?構?
6
let x = e1 in e2 x.e2(e1)
seq(e1, e2) let z = e1 in e2 z
seq(e1, . . . , en) seq(e1, seq(e2, . . . , seq(en 1, en)) . . . ) n 3
if(e1, e2, e3) br(e1, z.e2, z.e3)(nil) z
rec(f) x.f( y.x(x)(y))( x.f( y.x(x)(y)))
? 注釈
? let x = 1, y = 2 in e というように、複数定義も可能
? この場合は、λy.λx.e(2)(1) と等価
? rec(f)はZコンビネータ(不動点コンビネータ)
12. 簡約可能な式と簡約コンテキストの構?
12
Er ::=
V(V)
| F(V, . . . , V)
| br(V, E, E)
| letrec X = V in E
| send(V, V)
| new(V)
| ready(V)
R ::=
Hole
| pr(V, R)
| pr(R, E)
| V(R)
| R(E)
| F(V, . . . , V, R, E, . . . , E)
| br(R, E, E)
| letrec X = R in E
| send(V, R)
| send(R, E)
| new(R)
| ready(R)
13. 拡張ラムダ計算の簡約規則
13
x.e(v) e{x/v}
f(v1, . . . , vn) v f F, v = [[f]](v1, . . . , v2)
br(true, e, ) e
br(false, , e) e
1st
(pr(v, )) v
2nd
(pr( , v)) v
letrec x = v in e e{x/v{x/(letrec x = v in v)}}
14. 操作的意味論
14
e e
, [R e ]a || ?
[fun:a]
, [R e ]a || ?
, [R new(b) ]a || ?
[new:a,a ]
, [R a ]a, [ready(b)]a || ? a
, [R send(a , v) ] || ?
[snd:a]
, [R nil ]a || ? { a v }
, [R ready(b) ]a || { a v } ?
[rcv:a,v]
, [b(v)]a || ?