[]
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@>)
Definisi ini menghasilkan reduksi beta, yaitu gagasan evaluasi yang memungkinkan pengurangan subterm apa pun. Komputasi seperti yang dilakukan dalam bahasa pemrograman sering tidak memungkinkan pengurangan subterma di dalam fungsi: aturan pengurangan hanya dapat diterapkan di tingkat atas, atau di sisi kiri atau sisi kanan aplikasi. Kita dapat mengekspresikan ini dengan mendefinisikan jenis konteks baru yang tidak memungkinkan semua bentuk sintaksis:
Kita dapat menggunakan sintaks ini untuk mendefinisikan gagasan semantik evaluasi non-parsial:
Kami juga dapat menyajikan definisi ini dengan memperluasnya, seperti yang kami lakukan di atas untuk pengurangan beta penuh:
D::=[]∣x∣tD∣Dt
(λx.M)N→npM{x←N}M→npND[M]→npD[N]
D(λx.M)N→npM{x←N}(β)M→npNMP→npNP(C@<)M→npNPM→npPN(C@>)
D akan disebut konteks evaluasi karena digunakan untuk mendefinisikan pengertian evaluasi. Konteks evaluasi bukanlah jenis konteks khusus; alih-alih,
menyebutnya konteks evaluasi adalah masalah konteks apa yang digunakan .
Saya akan memberikan satu lagi contoh konteks. Mari kita mendefinisikan nilai berdasarkan sintaks berikut:
Sekarang mari kita tentukan jenis konteks lain:
Dibandingkan dengan atas, lubang dapat berada di sisi fungsi aplikasi jika argumen aplikasi tersebut adalah sebuah nilai. Tetapkan pengurangan berikut:
V
V::=xV1…Vn∣λx.M
E::=[]∣ME∣EV
D(λx.M)V→cbvaM{x←V}(βcbva)M→βNE[M]→cbvaE[N](γcbva)
Dengan batasan bahwa argumen fungsi harus menjadi nilai dalam aturan pertama dan bahwa abstraksi lambda bukan konteks, kami mendefinisikan strategi evaluasi panggilan-oleh-nilai. Dengan pembatasan lebih lanjut bahwa argumen dievaluasi sebelum fungsi, ini adalah panggilan urutan aplikatif berdasarkan nilai.