[]
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@>)
Ta definicja daje redukcję beta, tzn. Pojęcie oceny, które pozwala na ograniczenie dowolnego okresu. Obliczenia wykonywane w językach programowania często nie pozwalają na ograniczenie subtermów w funkcjach: reguła redukcji może być zastosowana tylko na najwyższym poziomie, lub po lewej lub prawej stronie aplikacji. Możemy to wyrazić, definiując nowy rodzaj kontekstu, który nie zezwala na wszystkie formy składniowe:
Możemy użyć tej składni do zdefiniowania pojęcia semantycznego bez oceny częściowej:
Możemy również przedstawić tę definicję, rozszerzając ją, tak jak to zrobiliśmy powyżej dla pełnej redukcji wersji beta:
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 byłby nazywany kontekstem oceny, ponieważ służy do zdefiniowania pojęcia oceny. Kontekst oceny nie jest szczególnym rodzajem kontekstu; raczej,
nazywając ją kontekst oceny jest to kwestia tego, co służy do kontekstu .
Podam jeszcze jeden przykład kontekstu. Zdefiniujmy wartości zgodnie z następującą składnią:
Teraz zdefiniujmy inny rodzaj kontekstów:
W porównaniu z powyżej, dziura może znajdować się po stronie funkcji aplikacji, jeśli argumentem aplikacji jest wartość. Zdefiniuj zatem następujące pojęcie redukcji:
V
V::=xV1…Vn∣λx.M
E::=[]∣ME∣EV
D(λx.M)V→cbvaM{x←V}(βcbva)M→βNE[M]→cbvaE[N](γcbva)
Z zastrzeżeniem, że argument funkcji musi być wartością w pierwszej regule i że abstrakcje lambda nie są kontekstami, definiujemy strategię oceny call-by-value. Przy dalszym ograniczeniu, że argument jest oceniany przed funkcją, jest to wywołanie kolejności aplikacji według wartości.