Контекст - это синтаксическое понятие. Контекст - это термин с одной дырой. (Иногда существуют многозадачные контексты, определение будет дано четко в этом случае.) Синтаксис контекстов определяется путем принятия синтаксиса терминов и предоставления возможности одному подтерму быть дырой вместо термина. В BNF (я использую лямбда-исчисления в качестве примера, без булевы и если заявления , которые не приносят ничего к примеру.):
C : : = [ ] | х | т[]
C::=[]∣x∣tC∣Ct∣λx.C
C[]tC[t]t[]C[t][]t
(λx.M)N→βM{x←N}
M{x←N}x↦NM
tMNxt=(λx.M)Ntt′t′=(λx.M)NtCMNxt=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→npM{x←N}M→npND[M]→npD[N]
(λx.M)N→npM{x←N}(β)M→npNMP→npNP(C@<)M→npNPM→npPN(C@>)
D будет называться контекстом оценки, поскольку он используется для определения понятия оценки. Контекст оценки не является особым видом контекста; скорее,
назвать его контекстом оценки - это вопрос того, для чего используется этот контекст .
Я приведу еще один пример контекста. Определим значения соответствии со следующим синтаксисом:
Теперь давайте определим другой тип контекстов:
По сравнению с выше, дыра может быть на стороне функции приложения, если аргумент приложения равен ценность. Затем определите следующее понятие сокращения:
V
V::=xV1…Vn∣λx.M
E::=[]∣ME∣EV
D(λx.M)V→cbvaM{x←V}(βcbva)M→βNE[M]→cbvaE[N](γcbva)
С ограничением, что аргумент функции должен быть значением в первом правиле, и что лямбда-абстракции не являются контекстами, мы определяем стратегию оценки по значению. С дополнительным ограничением на то, что аргумент оценивается перед функцией, это - аппликативный вызов порядка по значению.