プログラミング言語理論において、プッシュ値呼び出し(CBPV)は、値呼び出し(CBV)と名前呼び出し(CBN)の評価戦略を組み込んだ中間言語です。CBPVは、「値」(+)と「計算」(-)という2つの主要な型を持つ極性λ計算として構造化されています。 [ 1 ] 2つの型間の相互作用に対する制約は、モナドやCPSと同様に、制御された評価順序を強制します。この計算は、非停止性、可変状態、非決定性などの計算効果を組み込むことができます。CBVとCBNからCBPVへの自然な意味論保存変換があります。これは、CBPVの意味論を与え、その特性を証明すると、暗黙的にCBVとCBNの意味論と特性も確立されることを意味します。ポール・ブレイン・レヴィは、いくつかの論文と博士論文でCBPVを定式化し、開発しました[ 2 ] [ 3 ] [ 4 ]
CBPVパラダイムは、「値は存在し、計算は行う」というスローガンに基づいています。説明における複雑な点の1つは、値型にまたがる型変数と計算型にまたがる型変数を区別することです。この記事では、Levyに倣い、計算を示すために下線を使用しています。したがって、(任意の)値型でありながら計算型でもあります。[ 4 ]一部の著者は、異なる文字セットなど、他の規則を使用しています。[ 5 ]
具体的な構成は著者や微積分の用途によって異なりますが、次のような構成が一般的です。[ 2 ] [ 4 ]
λx.Mは 型 の計算であり、と です。ラムダ適用または は型 の計算であり、と です。let バインディング構造は、計算内で、一致する型 の値を値 にバインドします 。F VV'Flet { x_1 = V_1; ... }. Mx_1V_1Mthunk M型 の値です。サンクを強制することは 、サンク : に対して :という計算です。Mforce XXV型の値を計算 :としてラップすることも可能です。このような計算は、 : ( : 、 :は計算)のように別の計算内で使用できます。return VM to x. NMNmatch V as { (1,...) in M_1, ... }。表現によっては、ADTは2進数の和と積、ブール値のみに限定されるか、完全に省略される場合があります。プログラムは型 の閉じた計算であり、は基底ADT型である。[ 4 ]
のような式はnot true : bool表示的には意味をなします。しかし、上記の規則に従うと、notパターンマッチングを使用してのみエンコードでき、計算になるため、式全体も計算でなければならず、 となります。同様に、計算を構築せずにからnot true : F boolを得る方法はありません。等式理論または圏論でCBPVをモデル化する場合、このような構成は不可欠です。したがって、Levyは拡張されたIR「複素値を持つCBPV」を定義しています。このIRは、let束縛を拡張して値式内で値を束縛し、各節が値式を返すように値をパターンマッチングします。[ 3 ]モデリングに加えて、このような構成はCBPVでのプログラムの記述をより自然にします。[ 2 ]1(1,2)
複素数値は操作的意味論を複雑にし、特に複素数値をいつ評価するかという任意の決定を必要とする。複素数値の評価には副作用がないため、このような決定は意味論的な意味を持たない。また、任意の計算や閉じた式を、同じ型と表示を持つ複素数値を含まない式に構文的に変換することが可能である。[ 3 ]そのため、多くの表現では複素数値が省略されている。[ 4 ]
CBV翻訳は、各式に対してCBPV値を生成します。CBV関数λx.M :は :に変換されます。CBV適用 :は型:の計算に変換され、評価順序が明示的になります。パターンマッチは:に変換されます。値は必要に応じて:で囲まれますが、それ以外は変更されません。[ 2 ]一部の翻訳では、:に変換するなど、順序付けが必要な場合があります。[ 4 ]thunk λx.MvM NMv to f in Nv to x in x'(force f)match V as { (1,...) in M_1, ... }Vv to z in match z as { (1,...) in M_1v, ... }returninl MM to x. return inl x
CBN変換は、各式に対してCBPV計算を生成します。CBN関数λx.M :は、 :をそのまま変換します。CBN適用 :は、型 の計算に変換されます。パターンマッチも同様にCBNに変換されます。ADT値は で囲まれますが、内部構造では と も必要です。Levyの変換は を仮定しており、これは実際に成り立ちます。[ 2 ]λx.MNM NMv (thunk Nv)match V as { (1,...) in M_1, ... }Vn to z in match z as { (1,...) in M_1n, ... }returnforcethunkM = force (thunk M)
CBPVを拡張してcall-by-needをモデル化することも可能です。これは、M need x. N可視的な共有を可能にする構成要素を導入することで実現されます。この構成要素は と似た意味を持ちますが、 のサンクは最大で1回しか評価されないM name x. N = (λy.N[x ↦ (force y)])(thunk M)という点が異なります。 [ 6 ]needM
一部の著者は、U型コンストラクタ(サンク)[ 7 ]またはF型コンストラクタ(値を返す計算)[ 8 ]のいずれかを削除することで、CBPVを簡素化できることを指摘しています。EggerとMogelbergは、合理化された構文と、計算から値への推論可能な変換の煩雑さを回避するという理由で、Uを省略することを正当化しています。この選択により、計算型は値型のサブセットになり、関数型を値間の完全な関数空間に拡張することが自然になります。彼らはこの計算を「Enriched Effects Calculus(強化効果計算)」と呼んでいます。この修正された計算は、双方向の意味保存変換を介してCBPVのスーパーセットと同等です。[ 7 ]対照的に、EhrhardはF型コンストラクタを省略し、値を計算のサブセットにします。Ehrhardは、意味をよりよく反映するために、計算を「一般型」に改名しましたこの修正された計算法「半分極ラムダ計算」は線形論理と密接な関係がある。[ 8 ] [ 9 ]これは双方向にCBPVの完全分極変種のサブセットに変換することができる。[ 10 ]
ポール・ブレイン・レヴィは、CBPVに関する研究により、 2025年のアロンゾ・チャーチ賞を受賞しました。 [ 11 ]