プログラミング言語理論において、call-by-push-value (CBPV) は、call-by-value (CBV) とcall-by-name (CBN)の評価戦略を組み込んだ中間言語です。CBPV は、2 つの主な型、「値」(+) と「計算」(-) を持つ極性化λ 計算として構成されています。 [1] 2 つの型間の相互作用の制限により、モナドやCPSと同様に、制御された評価順序が強制されます。計算には、非終了性、可変状態、非決定性などの計算効果を組み込むことができます。CBV と CBN から CBPV への自然な意味論保存変換があります。つまり、CBPV の意味論を与え、そのプロパティを証明すると、CBV と CBN の意味論とプロパティも暗黙的に確立されます。Paul Blain Levy は、いくつかの論文と博士論文で CBPV を定式化し、開発しました。[2] [3] [4]
意味
CBPV パラダイムは、「値が存在すると、計算が行う」というスローガンに基づいています。プレゼンテーションの 1 つの複雑な点は、値型にまたがる型変数と計算型にまたがる型変数を区別することです。この記事では、Levy に従って、計算を示すために下線を使用しています。したがって、(任意の) 値型ですが、計算型でもあります。[4]一部の著者は、文字の異なるセットなど、他の規則を使用しています。[5]
正確な構成要素のセットは著者や微積分の目的によって異なりますが、次の構成要素が典型的です:[2] [4]
- ラムダは、およびである
λx.M型の計算です。ラムダ アプリケーションまたは は、 およびである型の計算です。let バインディング構造は、計算内で、一致する型の値を値にバインドします 。F VV'Flet { x_1 = V_1; ... }. Mx_1V_1M - サンクは、型の計算から構築された
thunk M型の値です。サンクの強制は計算です。サンク : の場合、 :です 。Mforce XX V型の値を計算 :としてラップすることもできます。このような計算は、 : として別の計算内で使用できます。ここで、 : 、および :は計算です。return VM to x. NMN- 値には、タグと 0 個以上のサブ値から構成される代数データ型も含めることができます。一方、計算には分解パターン マッチが含まれます
match V as { (1,...) in M_1, ... }。プレゼンテーションに応じて、ADT はバイナリの合計と積、ブール値のみに制限されるか、完全に省略される場合があります。
プログラムは型 の閉じた計算であり、 は基底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 型コンストラクタ (値を返す計算) のいずれかを削除することで、CBPV を簡素化できると指摘しています。[8] Egger と Mogelberg は、合理化された構文と、計算から値への推論可能な変換の煩雑さを回避するという理由で、U を省略することを正当化しています。この選択により、計算型は値型のサブセットになり、関数型を値間の完全な関数空間に拡張することが自然になります。彼らは、この計算を「強化効果計算」と呼んでいます。この修正された計算は、双方向の意味保存変換を介して CBPV のスーパーセットに相当します。[7] Ehrhard は対照的に、F 型コンストラクタを省略し、値を計算のサブセットにします。Ehrhard は、計算の意味をよりよく反映するために、計算を「一般型」に改名します。この修正された計算である「半極性化ラムダ計算」は、線形論理と密接な関係があります。[8] [9]これは、CBPVの完全分極変異体のサブセットに双方向に翻訳することができる。[10]
参照
参考文献
- ^ Kavvos, GA; Morehouse, Edward; Licata, Daniel R.; Danner, Norman (2020年1月). 「call-by-push-valueによる関数型プログラムの再帰抽出」. ACM on Programming Languagesの議事録. 4 (POPL): 1–31. arXiv : 1911.04588 . doi :10.1145/3371083. ISSN 2475-1421.
- ^ abcde Blain Levy, Paul (1999 年 4 月)。Call-by-Push-Value: 包含パラダイム(PDF)。型付きラムダ計算とその応用、第 4 回国際会議、TLCA'99、ラクイラ、イタリア。コンピュータ サイエンスの講義ノート。第 1581 巻。pp. 228–242。
- ^ abc Levy, Paul Blain (2003). Call-by-push-value: 関数型/命令型の統合(PDF) . ドルドレヒト; ボストン: Kluwer Academic Publishers. ISBN 978-1-4020-1730-8。
- ^ abcdef Levy、Paul Blain (2022年4月)。「Call-by-push-value」。ACM SIGLOGニュース。9 (2): 7–29。doi : 10.1145 /3537668.3537670。
- ^ Pédrot, Pierre-Marie; Tabareau, Nicolas (2020年1月). 「The fire triangle: how to mix replacement, dependent elimination, and effects」. Proceedings of the ACM on Programming Languages . 4 (POPL): 1–28. doi :10.1145/3371126.
- ^ McDermott, Dylan; Mycroft, Alan (2019). 「拡張された Call-by-Push-Value: 効果的なプログラムと評価順序についての推論」.プログラミング言語とシステム. Springer International Publishing. pp. 235–262. doi :10.1007/978-3-030-17184-1_9. ISBN 978-3-030-17184-1。
- ^ ab Egger, J.; Mogelberg, RE; Simpson, A. (2014 年 6 月 1 日). 「エンリッチド効果計算: 構文と意味論」(PDF) . Journal of Logic and Computation . 24 (3): 615–654. doi :10.1093/logcom/exs025.
- ^ ab Ehrhard, Thomas (2016). 「線形論理の観点から見た Call-By-Push-Value」。プログラミング言語とシステム。コンピュータサイエンスの講義ノート。第 9632 巻。pp. 202–228。doi : 10.1007 / 978-3-662-49498-1_9。ISBN 978-3-662-49497-4。
- ^ ジュール・シュケ;タッソン、クリスティーン(2020)。 Call-By-Push-Value の Taylor 拡張。情報学におけるライプニッツ国際論文集。 Vol. 152. ダグシュトゥール城 – ライプニッツ情報センター。 16:1–16:16。土井: 10.4230/LIPIcs.CSL.2020.16。
- ^ Ehrhard, Thomas (2015 年 7 月)、Call-By-Push-Value FPC と線形論理におけるその解釈
