ラムダ計算:コンテキストと評価コンテキストの違い


12

まず、以下のテキストにエラーが含まれている可能性があると言いたいので、質問の定式化の誤りをお気軽に指摘してください。

次の構文で用語が指定されているブール値とif文を含む型なしラムダ計算について考えてみましょう。

 t ::= v | t t | if t t t | x
 v ::= \x.t | #t | #f

この場合のコンテキストCは、次の構文に従って与えられます。

C ::= [-] | \x. C | C t | t C | if C t t | if t C t | if t t C 

さらに、次の構文に従って評価コンテキストEを定義できます。

E ::= [-] | \x. E | v E | E t | if E t t 

質問を3つのサブポイントに分けて、対処したいと思います。

  1. 2つの概念はいつ使用されますか?たとえば、計算のセマンティクスを定義するために評価コンテキストが使用されていることは知っていますが、コンテキストの使用法にはまだ多少の迷いがあります。また、ここで私の知識の確認をお願いします。
  2. 一方が他方よりも優先されるのはいつですか?
  3. この件を整理するのに役立つ関連記事を指摘していただけますか?

回答:


15

コンテキストは多くの目的に使用されますが、通常はプログラムの合同を定義するために使用されます。評価コンテキストは、コンテキストのサブセットです。これらは通常、縮約関係を定義するために使用されます。それぞれの例を挙げましょう。

プログラムの平等を定義する正式な方法の1つは、2つのプログラムとが文脈的に等しく、動作を変更せずに各コンテキストで互いに置き換えることができるということです。次のように我々はこれを定義することができ及び文脈全て閉鎖コンテキストのために提供等しいのための及び:場合に限り、 。もも自由変数を持っていない場合、コンテキストは閉じていると言います。式N M N C [ ] M N C [ M ] T C [ N ] T M N C [ M ] C [ N ] M T M TMNMNC[]MNC[M]tC[N]tM,NC[M]C[N]Mtは、プログラムが有限数のステップで値減少することを意味します。(余談ですが、コンテクストの等価性の定義は、並行プロセスなどの豊富な計算概念に関係していることに注意してください。)Mt

対照的に、評価コンテキストは、評価をブロックしないコンテキストです。より正確には、評価コンテキストは、次のアトミック削減ステップを実行する必要がある(または非決定的な計算のために実行する)ポイントに穴がある用語です。そのため、評価コンテキストには次のルールが適用されます。 評価コンテキストの使用例として、値縮約ルールを検討します。-calculus、ここでは下で削減しません。場合でも、縮小はありません λλMNλXMλのxNλ

MNE[M]E[N]
λλMNλx.Mλx.N。これは、上記の一般的なコンテキストルールと、 -expressions を省略した評価コンテキストの文法で簡単に表現できます。評価コンテキストは、FelleisenとHiebによる「シーケンシャルコントロールと状態の構文理論に関する改訂レポート」で最初に使用されました。λ

14

コンテキストは構文上の概念です。コンテキストとは、穴が1つある用語です。(場合によっては、マルチホールコンテキストがあります。その場合、定義は明確になります。)コンテキストの構文は、用語の構文を使用して、1つのサブ用語を用語ではなくホールにすることで定義されます。BNFで(例として、ブール計算を使用せず、例に何ももたらさないifステートメントを使用します。): C = [ ] | X | T[]

C::=[]xtCCtλx.C

コンテキストの定義と共に、用語をコンテキストに入れるという定義があります。場合コンテキストであり、用語であり、その後、置くことによって得られた用語であり、孔構文木にである。これは、基本的には変数は一度だけ発生することが保証されている置換(ただし、置換された「変数」はメタレベルの変数であることに注意してください、である、いない用語のラムダ計算や他の言語の変数)。t C [ t ] t [ ] C [ t ] [ ] tC[]tC[t]t[]C[t][]t

コンテキストは、セマンティクスのさまざまな定義を定式化するために使用されます。一般的な例として、評価のほとんどの概念には、評価を実行できるコンテキストの定義が含まれます。たとえば、ラムダ計算を考えます。評価の基本的な概念は、ベータ削減規則によって与えられます: ここで、は置換ですは適用されます。M { X N } X N M

λバツMNβM{バツN}
M{バツN}バツNM

これはベータ削減の完全な定義ではありません。項与えられると、サブ項およびと変数があり、 x。M場合、ベータ削減できます。しかし、より一般的には、 x。Mようなサブタームがある場合、はベータ削減できます。これを表現する別の方法は、コンテキストといくつかの項およびと変数があり、場合にがベータ削減できることM 、N 、X 、T = λ X M tMNバツT T ' T ' = λ X M t=λバツMNttt=λバツMNC M Nは、xはTは= C [ λ X MをtCMNバツC [ M { x N } ]t=C[λバツMN]。このような削減がある場合、右側はです。正式な表記法を使用するために、ベータ削減は次の推論規則によって定義されます: 同じ定義は、あらゆる種類のコンテキストを明示的にすることで表現できます: C[M{バツN}]

λバツMNβM{バツN}βMβNC[M]βC[N]γ
λバツMNβM{バツN}βMβNλバツMβλバツNCλMβNMPβNPC@<MβNPMβPNC@>

この定義により、ベータ削減、つまりサブタームを削減できる評価の概念が得られます。プログラミング言語で実行される計算では、関数内のサブタームを削減することはできません。削減ルールは、トップレベル、またはアプリケーションの左側または右側にのみ適用できます。すべての構文形式を許可しない新しい種類のコンテキストを定義することでこれを表現できます: この構文を使用してセマンティック概念を定義できます非部分評価の場合: 完全なベータ削減のために上で行ったように、この定義を展開することで提示することもできます。

D:: =[]バツtDDt
λバツMNnpM{バツN}MnpND[M]npD[N]
D
λバツMNnpM{バツN}βMnpNMPnpNPC@<MnpNPMnpPNC@>
Dは評価の概念を定義するために使用されるため、評価コンテキストと呼ばれます。評価コンテキストは特別な種類のコンテキストではありません。むしろ、それを評価コンテキストと呼ぶことは、コンテキストが何のために使用されるかという問題です

コンテキストのもう1つの例を示します。次の構文に従って値定義しましょう: ここで、別の種類のコンテキストを定義しましょう: 上記の と比較すると、アプリケーションの引数が価値。次に、以下の縮小の概念を定義します。 V = X V 1 ... V N | λ X M E = [ ] | MV

V:: =バツV1VnλバツM
D
E:: =[]MEEV
D
λバツMVcbvaM{バツV}βcbvaMβNE[M]cbvaE[N]γcbva
関数の引数は最初のルールの値である必要があり、ラムダ抽象化はコンテキストではないという制限により、値ごとの評価戦略を定義しています。引数が関数の前に評価されるというさらなる制限があるため、これは値による適用順序呼び出しです。

1
評価コンテキストの後者の定義は、元のFelleisenおよびHiebの概念に近いものです。これらは、微積分の用語の評価順序を表現するのに役立つ構文上の手段です。評価コンテキスト特別な種類のコンテキストです。これにより、用語をコンテキストとredex(可能な場合)に一意に分解し、それによって次の削減ステップが発生する場所を決定論的に示すことができます。
デイブクラーク14年

@DaveClarke余談ですが、評価コンテキストを使用して、計算の非決定論的概念の評価を定義することもできます。この場合、評価コンテキストとredexへの固有の分解はありません。
マーティンバーガー14年

@MartinBerger:確かに。
デイブクラーク14年

@DaveClarke「決定論的評価コンテキストは特別な種類のコンテキスト」という意味ですか?任意のコンテキストのセットを取得し、それに基づいて評価戦略を定義できます。
ジル 'SO-悪であるのをやめる' 14年

@Gilles:評価コンテキストは、決定論的な削減戦略を定義できます。「決定論的評価コンテキスト」というフレーズを見たことはないと思います。もちろん、これらは特別な種類のコンテキストです。あなたのコメントに同意します。重要なのは、あなたの答えが評価コンテキストの歴史的重要性を見逃してしまうことです。
デイブクラーク14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.