CEK機械

提供: testwiki
2024年2月23日 (金) 13:31時点におけるimported>Cocoa rutoによる版 (説明の追加)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

CEK機械[1]とは、ラムダ計算に対して値渡し評価戦略操作的意味論を与えるための抽象機械の1つである。CEKとは、機械の状態を構成する3つの要素である “Control string”, “Environment”, “Continuation” に由来する[1]

定義

拡張ラムダ計算に対するCEKは次のように定義される[1]

まず、拡張ラムダ計算を次のように定義する。

(式)
M::=
    X (変数)
  | λX.M (λ抽象)
  | M M (関数適用)
  | b (基本定数)
  | on M ... M (プリミティブオペレータの適用)

(値)
V::=λX.M | b

次に、CEK機械の状態を構成する要素を次のように定義する。

(環境)
E::={X,c,...} (変数から、クロージャへの関数(変数とクロージャのペアの集合))
E[Xc]={X,c}{Y,c|Y,cEYX}

(クロージャ)
c::=M,E (ただし、Mの自由変数は全てEの定義域に含まれる)

(値)
v::=V,E (ただし、Vの自由変数は全てEの定義域に含まれる)

(継続)
K::=
    𝗆𝗍 (初期継続)
  | 𝖿𝗎𝗇,V,K (関数適用への継続。λx.(V x) Kに相当する)
  | 𝖺𝗋𝗀,M,K (実引数評価への継続。λf.M (λx.(f x) K)に相当する)
  | 𝗇𝖺𝗋𝗀,v,...,v,o,c,...,K (プリミティブオペレータの実引数の評価およびオペレータの適用への継続。c,...を順に評価したあと、v,...と共にプリミティブオペレータoを適用する、という継続。v,...は評価済みの値で、c,...はこれから評価するクロージャ)

このとき、CEK機械の状態は組c,K=M,E,Kと表される。

CEK機械の遷移規則は次のように定義される。

(変数の値の環境からの取得)
X,E,K
      𝖼𝖾𝗄c,K (E(X)=c のとき)

(関数適用の関数部分の評価の開始)
M1 M2,E,K
      𝖼𝖾𝗄M1,E,𝖺𝗋𝗀,M2,E,K

(プリミティブオペレータ適用の引数の評価の開始)
o M1 M2 ...,E,K
      𝖼𝖾𝗄M1,E,𝗇𝖺𝗋𝗀,o,M2,E,...,K


(関数の適用)
V,E,𝖿𝗎𝗇,λX.M,E,K
      𝖼𝖾𝗄M,E[XV,E],K (Vが変数でない場合)

(関数適用の関数部分の評価後、引数部分の評価の開始)
V,E,𝖺𝗋𝗀,M,E,K
      𝖼𝖾𝗄M,E,𝖿𝗎𝗇,V,E,K (Vが変数でない場合)

(プリミティブオペレータ適用の引数1つの評価後、次の引数の評価の開始)
V,E,𝗇𝖺𝗋𝗀,c,...,N,E,c,...,K
      𝖼𝖾𝗄N,E,𝗇𝖺𝗋𝗀,V,E,c,...,c,...,K (Vが変数でない場合)

(プリミティブオペレータの適用)
b,E,𝗇𝖺𝗋𝗀,bi,Ei,...,b1,E,o,,K
      𝖼𝖾𝗄V,,K (Vob1,...,bi,bを適用した結果)

このとき、CEK機械による評価関数𝑒𝑣𝑎𝑙𝖼𝖾𝗄(M)は次のように定義される

𝑒𝑣𝑎𝑙𝖼𝖾𝗄(M)=b    (M,,𝗆𝗍𝖼𝖾𝗄*b,E,𝗆𝗍 のとき)

𝑒𝑣𝑎𝑙𝖼𝖾𝗄(M)=𝖿𝗎𝗇𝖼𝗍𝗂𝗈𝗇    (M,,𝗆𝗍𝖼𝖾𝗄*λX.M,E,𝗆𝗍 のとき)

Defunctionalizationとの関係

CEK機械は、ラムダ計算の標準的な評価関数に対して、クロージャ変換、値渡し評価戦略のCPS変換defunctionalizationを順に適用することで導出できる[2]。ここで、値渡し評価戦略の代わりに名前渡し評価戦略を使うとKrivineの機械が導出される[2]

拡張

CEK機械はCPS変換した評価関数から導出するため、call/ccshift/resetといったCPS変換で実装できる演算子との相性が良い[3]

例えば、次のように拡張することで、call/ccを追加できる。

M::=... | call/cc X.M

V::=... | 𝖾𝗌𝖼,K

call/cc X.M,E,K
      𝖼𝖾𝗄M,E[X𝖾𝗌𝖼,K],K

V,E,𝖿𝗎𝗇,𝖾𝗌𝖼,K,K
      𝖼𝖾𝗄V,E,K(Vが変数でない場合)

𝑒𝑣𝑎𝑙𝖼𝖾𝗄(M)=𝖿𝗎𝗇𝖼𝗍𝗂𝗈𝗇    (M,,𝗆𝗍𝖼𝖾𝗄*𝖾𝗌𝖼,K,E,𝗆𝗍 のとき)

参考文献

  1. 1.0 1.1 1.2 Matthias Felleisen and Matthew Flatt. Programming Languages and Lambda Calculi. Unpublished manuscript, 1989-2001
  2. 2.0 2.1 Olivier Danvy. On Evaluation Contexts, Continuations, and the Rest of the Computation. In Proceedings of the Fourth ACM SIGPLAN workshop on Continuations, 2004.
  3. Małgorzata Biernacka, Dariusz Biernacki, and Olivier Danvy. An Operational Foundation for Delimited Continuations in the CPS hierarchy. BRICS research report RS-05-24, 2005. ISSN 0909-0878