コンテキストは構文上の概念です。コンテキストとは、穴が1つある用語です。(場合によっては、マルチホールコンテキストがあります。その場合、定義は明確になります。)コンテキストの構文は、用語の構文を使用して、1つのサブ用語を用語ではなくホールにすることで定義されます。BNFで(例として、ブール計算を使用せず、例に何ももたらさないifステートメントを使用します。):
C ::= [ ] | X | T[]
C::=[]∣x∣tC∣Ct∣λx.C
コンテキストの定義と共に、用語をコンテキストに入れるという定義があります。場合コンテキストであり、用語であり、その後、置くことによって得られた用語であり、孔構文木にである。これは、基本的には変数は一度だけ発生することが保証されている置換(ただし、置換された「変数」はメタレベルの変数であることに注意してください、である、いない用語のラムダ計算や他の言語の変数)。t C [ t ] t [ ] C [ t ] [ ] tC[]tC[t]t[ ]C[ t ][ ]t
コンテキストは、セマンティクスのさまざまな定義を定式化するために使用されます。一般的な例として、評価のほとんどの概念には、評価を実行できるコンテキストの定義が含まれます。たとえば、ラムダ計算を考えます。評価の基本的な概念は、ベータ削減規則によって与えられます:
ここで、は置換ですは適用されます。M { X ← N } X ↦ N M
(λ X 。M)N→βM{ x ← N}
M{ x ← N}X ↦ NM
これはベータ削減の完全な定義ではありません。項与えられると、サブ項およびと変数があり、 x。M場合、ベータ削減できます。しかし、より一般的には、 x。Mようなサブタームがある場合、はベータ削減できます。これを表現する別の方法は、コンテキストといくつかの項およびと変数があり、場合にがベータ削減できることM 、N 、X 、T = (λ X 。M )tMNバツT T ' T ' = (λ X 。M )T = (λ X 。M)Ntt′t′= (λ X 。M)NC M Nは、xはTは= C [ (λ X 。Mを)tCMNバツC [ M { x ← N } ]t = C[ (λ X 。M)N]。このような削減がある場合、右側はです。正式な表記法を使用するために、ベータ削減は次の推論規則によって定義されます:
同じ定義は、あらゆる種類のコンテキストを明示的にすることで表現できます:
C[ M{ x ← N} ]
(λ X 。M)N→βM{ x ← N}(β)M→βNC[ M] →βC[ N](γ)
(λ X 。M)N→βM{ x ← N}(β)M→βNλ X 。M→βλ X 。N(Cλ)M→βNMP→βNP(C@ <)M→βNPM→βPN(C@ >)
この定義により、ベータ削減、つまりサブタームを削減できる評価の概念が得られます。プログラミング言語で実行される計算では、関数内のサブタームを削減することはできません。削減ルールは、トップレベル、またはアプリケーションの左側または右側にのみ適用できます。すべての構文形式を許可しない新しい種類のコンテキストを定義することでこれを表現できます:
この構文を使用してセマンティック概念を定義できます非部分評価の場合:
完全なベータ削減のために上で行ったように、この定義を展開することで提示することもできます。
D ::= [ ] | X | TD ∣ Dt
(λ X 。M)N→n pM{ x ← N}M→n pND [ M] →n pD [ N]
D(λ X 。M)N→n pM{ x ← N}(β)M→n pNMP→n pNP(C@ <)M→n pNPM→n pPN(C@ >)
Dは評価の概念を定義するために使用されるため、評価コンテキストと呼ばれます。評価コンテキストは特別な種類のコンテキストではありません。むしろ、
それを評価コンテキストと呼ぶことは、コンテキストが何のために使用されるかという問題です。
コンテキストのもう1つの例を示します。次の構文に従って値定義しましょう:
ここで、別の種類のコンテキストを定義しましょう:
上記の
と比較すると、アプリケーションの引数が価値。次に、以下の縮小の概念を定義します。
V ::= X V 1 ... V N | λ X 。M E ::= [ ] | MV
V::= X V1… Vn| λ X 。M
DE::= [ ] | ME∣ EV
D(λ X 。M)V→c b v aM{ x ← V}(βc b v a)M→βNE[ M] →c b v aE[ N](γc b v a)
関数の引数は最初のルールの値である必要があり、ラムダ抽象化はコンテキストではないという制限により、値ごとの評価戦略を定義しています。引数が関数の前に評価されるというさらなる制限があるため、これは値による適用順序呼び出しです。