Một bối cảnh là một khái niệm cú pháp. Một bối cảnh là một thuật ngữ với một lỗ hổng trong đó. (Đôi khi có những bối cảnh đa lỗ, định nghĩa sẽ được cung cấp rõ ràng trong trường hợp đó.) Cú pháp của những bối cảnh được xác định bằng cách lấy cú pháp của các điều khoản và cho phép một subterm là một lỗ thay vì một hạn. Trong BNF (tôi sử dụng lambda-calculus làm ví dụ, mà không boolean và nếu phát biểu mà không mang lại bất cứ điều gì để ví dụ.):
C : : = [ ] | x | t[]
C::=[]∣x∣tC∣Ct∣λx.C
Cùng với định nghĩa về một bối cảnh xuất hiện định nghĩa về việc đặt một thuật ngữ trong một bối cảnh. Nếu là một bối cảnh và t là một thuật ngữ, thì C [ t ] là thuật ngữ thu được bằng cách đặt t trong cây cú pháp trong đó lỗ [ ] nằm trong C [ t ] . Về cơ bản, đây là một sự thay thế trong đó biến được đảm bảo xảy ra chính xác một lần (nhưng lưu ý rằng biến số Thay đổi được thay thế là một biến ở cấp độ meta, [ ] , không phải là biến trong phép tính lambda hoặc ngôn ngữ khác của các thuật ngữ t ).C[]tC[t]t[]C[t][]t
Các bối cảnh được sử dụng để xây dựng các định nghĩa khác nhau trong ngữ nghĩa. Một ví dụ phổ biến là hầu hết các khái niệm đánh giá liên quan đến việc xác định bối cảnh trong đó việc đánh giá có thể được thực hiện. Ví dụ, hãy xem xét tính toán lambda. Khái niệm cơ bản của đánh giá được đưa ra bởi các quy tắc beta-giảm:
nơi M { x ← N } là sự thay thế x ↦ N áp dụng cho M .
(λx.M)N→βM{x←N}
M{x←N}x↦NM
Đây không phải là định nghĩa đầy đủ về giảm beta: với một thuật ngữ , nó có thể giảm beta nếu có các tập con M và N và một biến x sao cho t = ( λ x . M )tMNx ; nhưng nói chung hơn t có thể giảm betanếu có một tập con t ′ sao cho t ′ = ( λ x . M )t=(λx.M)Ntt′t′=(λx.M)N . Một cách khác để diễn đạt điều này là có thể giảm beta nếu có bối cảnh C và một số thuật ngữ M và N và một biến x sao cho t = C [ ( λ x . M )tCMNx . Khi có mức giảm như vậy, phía bên tay phải là C [ M { x ← N } ] . Để sử dụng ký hiệu chính thức, giảm beta được xác định theo các quy tắc khấu trừ sau:
t=C[(λx.M)N]C[M{x←N}]
Định nghĩa tương tự có thể được thể hiện bằng cách làm cho tất cả các loại bối cảnh rõ ràng:
(λ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@>)
Định nghĩa này mang lại sự giảm beta, tức là một khái niệm đánh giá cho phép giảm bất kỳ subterm nào. Các tính toán như được thực hiện trong các ngôn ngữ lập trình thường không cho phép giảm các hàm con bên trong các hàm: quy tắc rút gọn chỉ có thể được áp dụng tại toplevel hoặc ở phía bên trái hoặc bên phải của ứng dụng. Chúng tôi có thể bày tỏ điều này bằng cách xác định một loại mới của bối cảnh đó không cho phép tất cả các hình thức cú pháp:
Chúng ta có thể sử dụng cú pháp này để xác định khái niệm ngữ nghĩa của đánh giá không một phần:
D::=[]∣x∣tD∣Dt
Chúng tôi cũng có thể trình bày định nghĩa này bằng cách mở rộng nó, giống như chúng tôi đã làm ở trên để giảm beta đầy đủ:
(λx.M)N→npM{x←N}M→npND[M]→npD[N]
Dsẽ được gọi là bối cảnh đánh giá vì nó được sử dụng để xác định khái niệm đánh giá. Một bối cảnh đánh giá không phải là một loại bối cảnh đặc biệt; đúng hơn,
gọi nó là bối cảnh đánh giá là vấn đề bối cảnh được sử dụng để làm gì.
(λx.M)N→npM{x←N}(β)M→npNMP→npNP(C@<)M→npNPM→npPN(C@>)
D
Tôi sẽ đưa ra một ví dụ nữa về bối cảnh. Hãy xác định giá trị theo cú pháp sau:
V : : = x V 1 ... V n | bước sóng x . M
Bây giờ chúng ta hãy xác định một loại tình huống:
E : : = [ ] | MV
V::=xV1…Vn∣λx.M
So với
D ở trên, lỗ có thể nằm ở phía chức năng của ứng dụng nếu đối số của ứng dụng là một giá trị. Xác định sau đó khái niệm giảm sau:
E::=[]∣ME∣EV
D
Với hạn chế rằng đối số của hàm phải là một giá trị trong quy tắc đầu tiên và trừu tượng lambda không phải là bối cảnh, chúng tôi đang xác định chiến lược đánh giá theo giá trị. Với hạn chế hơn nữa là đối số được đánh giá trước hàm, đây là lệnh gọi theo thứ tự áp dụng theo giá trị.
(λx.M)V→cbvaM{x←V}(βcbva)M→βNE[M]→cbvaE[N](γcbva)