Văn phạm cảm ngữ cảnh
Ta gọi văn phạm cảm ngữ cảnh ( C ontext S ensitive G rammar - CSG) là một hệ thống G (V, T, P, S), trong đó: V là một tập hữu hạn các biến hay ký hiệu không kết thúc. T là một tập hữu hạn các ký hiệu cuối, V T = ...
Ta gọi văn phạm cảm ngữ cảnh (Context Sensitive Grammar - CSG) là một hệ thống G (V, T, P, S), trong đó:
- V là một tập hữu hạn các biến hay ký hiệu không kết thúc.
- T là một tập hữu hạn các ký hiệu cuối, V T = ∅
- P là tập hữu hạn các luật sinh dạng α → β trong đó α, β ∈ (V T)*, chuỗi α phải có chứa biến và ràng buộc |α|≤ |β|
- S ∈ V là ký hiệu bắt đầu.
Ta định nghĩa ngôn ngữ do văn phạm cảm ngữ cảnh G sinh ra là
L(G) = { w | w ∈ Σ* và S ⇒* w}
L(G) được gọi là ngôn ngữ cảm ngữ cảnh (Context Sensitive Language - CSL). Thuật ngữ “cảm ngữ cảnh” có xuất xứ từ một dạng chuẩn của văn phạm dạng này, trong đó mỗi luật sinh có dạng α1Aα2 → α1βα2 với β ≠ ε, cho thấy một biến A chỉ có thể được thay thế bởi một chuỗi β (khác rỗng) trong “ngữ cảnh” α1 - α2. Điều đó không giống như trong văn phạm phi ngữ cảnh, với các luật sinh có dạng A → β (|β|≥ 0), sự thay thế này không đòi hỏi ngữ cảnh.
Thí dụ 8.1 : Xét CSG G (V, T, P, S) với V ={ S, B, C}, ={a, b, c} và P gồm các luật sinh như sau :
1) S → aSBC
2) S → aBC
3) CB → BC
4) aB → ab
5) bB → bb
6) bC → bc
7) cC → cc
Một cách phi hình thức, bằng cách áp dụng một số luật sinh cho các chuỗi dẫn xuất sinh ra ngôn ngữ, ta dễ thấy rằng văn phạm G sinh ra ngôn ngữ có dạng :
L = {anbncn| n ≥ 1}
Thật vậy, với luật sinh (1) và (2) ta có chuỗi dẫn xuất S ⇒* an(BC)n. Sau đó, bằng cách áp dụng luật sinh (3), mọi biến B sẽ được thay thế lên trước các biến C trong chuỗi dẫn xuất : an(BC) ⇒* anBnCn. Bởi luật sinh (4) và (5), mọi biến B sẽ được thay thế thành các ký hiệu kết thúc b, và cuối cùng với (6) và (7), mọi biến C cũng sẽ được thay thế thành c. Tóm lại, ta có chuỗi dẫn xuất như sau :
S⇒* an(BC)n ⇒* anBnCn ⇒* anbncn
Bài toán thành viên với CSG (Membership)
ĐỊNH LÝ 8.1 : Tồn tại giải thuật để xác định với mọi ngôn ngữ cảm ngữ cảnh CSG G(V, T, P, S) bất kỳ và một chuỗi nhập w ∈ T * , liệu chuỗi w có thuộc ngôn ngữ L(G) hay không.
Chứng minh
Giả sử | w | = n. Ta lập đồ thị mà mỗi đỉnh là một chuỗi thuộc (V T)* có độ dài nhỏ hơn hoặc bằng n, có một cung từ đỉnh α đến đỉnh β nếu α ⇒G β. Như vậy một đường trong đồ thị đó tương ứng với một suy dẫn trong G. Vậy w ∈ L(G) khi và chỉ khi có một đường đi từ đỉnh bắt đầu S tới đỉnh w trong đồ thị. Dùng bất cứ giải thuật nào cho phép tìm đường nối hai đỉnh trong đồ thị (đã có nhiều thuật toán như thế), ta sẽ xác định được phải chăng đã có đường đi từ đỉnh S tới đỉnh w.
Thí dụ 8.2 : Xét CSG G (V, T, P, S) với các luật sinh được cho như trong Thí dụ 8.1 trên và xét chuỗi nhập w = abbc. Ta cần xác định xem liệu chuỗi w ∈ L(G)?
Để tìm đường đi từ đỉnh S tới đỉnh abbc trong đồ thị nói trên ta có thể dùng phương pháp “vết dầu loang” như sau:
Lập các R(i), i = 0, 1, 2, … theo quy tắc sau:
R(0) = { S }
R(i) = R(i -1) { β | α ⇒ β với α ∈ R(i -1) và | β | ≤ | w | }
Do R(0) ⊆ R(1) ⊆ … ⊆ R(i) ⊆ R(i +1) ⊆ … ⊆ tập các đỉnh, vậy tồn tại số k nào đó sao cho:
R(k) = R(k +1) = R(k +2) = …
Do đó quá trình thành lập các R(i) sẽ có thể ngừng sau k bước.
Và w ∈ L(G) khi và chỉ khi có i ≤ k để cho w ∈ R(i).
Trong thí dụ trên, giả sử khi ta xét | w |= 4, ta có:
R(0) = { S }
R(1) = {S, aSBC, aBC}
R(2) = {S, aSBC, aBC, abC}
R(3) = {S, aSBC, aBC, abC, abc}
R(4) = R(3)
Vậy chuỗi abbc không thuộc L(G).