Schemeのcall / ccは、既知のすべての制御フロー構造を実装できますか?


12

「高度なスキーム:いたずらなビット」ページには次のように記載されています。

継続は、他のほぼすべての制御フロー構造[...]の派生元となる強力な制御 フロー構造です。

Scheme call/ccがPeter LandinのJ演算子に関連(*)しているため既知の制御フロー構造を実装するために使用できると思いましたか?

「制御フロー構造」では、例外、コルーチン、グリーンスレッドなど、Wikipediaのそれらの記述について具体的に考えています。

具体的には、を使用して実装できない制御フロー構造の例はありますcall/ccか?

(*)call/ccJオペレーターほど強力な論文を作成することはできませんでした。 Felleisenの論文(私は読んでおらず、明らかにそれを完全に理解するのに問題がある)はこれを調査し、それらが異なる複雑さのクラスにあるにもかかわらず、形式的に同等であると結論付けているようです。

(以下のコメントに基づいて質問を更新したことにも注意してください)

更新

以下の@Neelの優れた回答に基づいて、区切られたおよび区切られていない継続についてコメントしているサイトを見ましたが、実際には、区切られていcall/ccないだけでは十分ではないようです。一方、一流の区切られた継続(などshift/reset使用して、制御フロー構造を表現することできます。


5
「制御フロー構造」の正式な定義は何ですか?
ハックベネット

4
再:無制限の継続。Hayo Thieleckeの参考論文を読みましたか?実際の主張は、州がない場合に提供されるcall/ccように区切られていない継続は例外表現できないということです。(Thieleckeが指摘しているように、プログラム用と例外ハンドラー用の2つの継続を渡すことで例外を実装できますが、それだけではcall/cc
不十分

@Rici:最初の数ページだけを読みました。(論文を読むことは私に要する長い時間を)。コメントありがとう!
csl

@HuckBennett正式な定義はありませんが、非公式にはen.wikipedia.org/wiki/Control_flowで説明されていることを意味します。具体的には、継続を使用してコルーチンを表現し、さらに重要なこととして実装することができます。緑色のスレッド、例外、エスケープ文、- amb演算子など。
csl

2
@csl「制御フロー構造」の意味をより正確にすることに加えて、何かを「表現する」ことの意味をより明確にする必要もあります。これは難しい問題であり、あなたの質問に対する答えは、あなたが表現として数えるものに強く依存します。結局のところ、例外のある言語(Javaなど)のインタープリターをエンコードするチューリングマシンをいつでもコード化できます。しかし、それはおそらくあなたが念頭に置いているものではないので、「表現」の概念に強い制約を置く必要があります(例えば、構成性や完全な抽象化など)。
マーティンバーガー

回答:


10

この回答では、「表現可能」とは、「プログラミング言語の表現力について」のFelleisen 1991の意味で「マクロ表現可能」を意味します。(直観的には、プログラム全体の変換を使用せずに、ローカルソース変換として定義できる場合、言語機能はマクロ表現可能です。)

この定義では、答えは「いいえ」です。区切り制御は、ラムダ計算+ call / ccでマクロ表現できません。call / ccを使用して、区切られた制御演算子を表現します。制御区切り記号(シフト/リセットのリセット部分)を実装するには、継続マークをシミュレートするための状態が必要です。基本的には、継続マークの動的な有効期間をシミュレートするためにスタックをエンコードします。

ただし、区切られた制御は、次の意味で普遍的な効果です。彼で博士論文アンジェイFilinskiは、任意の発現副作用がいずれかの区切り継続、またはコール/ ccの状態の1つのセルを使用して符号化可能であることを示しました。大まかに言って、「表現可能な副作用」とは、プログラミング言語の型の観点からモナド型を定義できる任意の効果です。

驚くべきことに、このアイデアは実際には非常に興味深いようです。Gordon PlotkinとJohn Powerは、過去10年にわたって、効果理論の代数的セマンティクスを採用するというアイデアを提唱してきました。アイデアは、関心のある副作用操作と、それらが満たすと期待される方程式を指定することです。この理論を無料のモナドでとることにより、一般的にセマンティクスを取得できます。

Matija PretnarとAndrej Bauerは、この数学的なアプローチを採用し、Eff言語に実装して、「エフェクトハンドラー」と呼ばれる新しい言語構成を発明しました。命令型機能のセットを使用するコードを記述し、命令型機能にセマンティクスを与えることができます各効果的な操作を実装する方法を示すハンドラーのセットを記述します。


しかし、定義が「Schemeとcall / ccを使用して制御フロー構造を実装できるか」(エミュレーションなし)の場合、答えはyesでなければなりませんか?LtUの議論lambda-the-ultimate.org/node/966を見ると、Oleg KiselyouvはSchemeの4つのF演算子すべてをcall / ccで実装しているようです:okmij.org/ftp/continuations/…-抜粋無制限の継続をキャプチャするためのcall / ccで、1つのグローバル可変セルを使用します。これは、他のF演算子を実装するのに十分であることが判明しました。...「-F-〜+ F + F」。
-csl

Felleisenの「マクロ表現可能性」を回答のフレームとして使用したことは認めますが、ご覧のとおり、「call / ccを使用した[Scheme]での実装」という具体的な質問に変更しました。そして、オレグ・キセリョフは、限られた継続のために4つのF演算子すべてを実装するためにグローバルな可変セルを導入する必要がありますが、これは「プログラムの主要なグローバルな再構築」に相当するとは思いません。もちろん、言うまでもありません。
csl

私はこの答えを受け入れます。また、追加のポインターがあるokmij.org/ftp/continuations/undelimited.html#delim-vs-undelimのテキストも参照したいと思います。また、シフト/リセットのようなファーストクラスの区切られた継続は、制御フロー構造を実装するために使用できるようです。リンクから:「一流の区切られた継続は、例外や可変状態を含む、表現可能な計算効果を表現できます。」
-csl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.