Văn phạm và sự phân lớp văn phạm
Với mục đích sản sinh (hay đoán nhận) ngôn ngữ, văn phạm được dùng như một cách thức hiệu quả để biểu diễn ngôn ngữ. Định nghĩa văn phạm cấu trúc (Grammar ) Theo từ điển, văn phạm, một cách không chính xác, là một tập các ...
Với mục đích sản sinh (hay đoán nhận) ngôn ngữ, văn phạm được dùng như một cách thức hiệu quả để biểu diễn ngôn ngữ.
Định nghĩa văn phạm cấu trúc (Grammar)
Theo từ điển, văn phạm, một cách không chính xác, là một tập các quy tắc về cấu tạo từ và các quy tắc về cách thức liên kết từ lại thành câu.
Để hiểu rõ hơn khái niệm này, ta xét ví dụ cây minh họa cấu trúc cú pháp của một câu đơn trong ngôn ngữ tiếng Việt "An là sinh viên giỏi" ở thí dụ 1.5 của chương 1. Xuất phát từ nút gốc theo dần đến nút lá, ta nhận thấy các từ ở những nút lá của cây như “An”, “sinh viên”, “giỏi”, … là những từ tạo thành câu được sản sinh. Ta gọi đó là các ký hiệu kết thúc bởi vì chúng không còn phát sinh thêm nút nào trên cây và câu được hoàn thành. Trái lại, các nút trong của cây như “câu đơn”, “chủ ngữ”, “danh từ”, … sẽ không có mặt trong dạng câu sản sinh, chúng chỉ giữ vai trò trung gian trong việc sinh chuỗi, dùng diễn tả cấu trúc câu. Ta gọi đó là các ký hiệu chưa kết thúc.
Quá trình sản sinh câu như trên thực chất là sự diễn tả thông qua cấu trúc cây cho một quá trình phát sinh chuỗi. Các chuỗi được phát sinh bắt đầu từ một ký hiệu chưa kết thúc đặc biệt, sau mỗi bước thay thế một ký hiệu chưa kết thúc nào đó trong chuỗi thành một chuỗi lẫn lộn gồm các ký hiệu kết thúc và chưa, cho đến khi không còn một ký hiệu chưa kết thúc nào nữa thì hoàn thành. Quá trình này chính là phương thức phát sinh chuỗi của một văn phạm, được định nghĩa hình thức như sau:
Định nghĩa : Văn phạm cấu trúc G là một hệ thống gồm bốn thành phần xác định như sau G (V, T, P, S), trong đó:
. V : tập hợp các biến (variables) hay các ký hiệu chưa kết thúc (non terminal)
. T : tập hợp các ký hiệu kết thúc (terminal) (với V size 12{ intersection } {} T = ∅)
. P : tập hữu hạn các quy tắc ngữ pháp được gọi là các luật sinh (production), mỗi luật sinh được biểu diễn dưới dạng α → β, với α, β là các chuỗi ∈ (V size 12{ union } {} T)*.
. S ⊂ V: ký hiệu chưa kết thúc dùng làm ký hiệu bắt đầu (start)
Người ta thường dùng các chữ cái Latinh viết hoa (A, B, C, ...) để chỉ các ký hiệu trong tập biến V; các chữ cái Latinh đầu bảng viết thường (a, b, c, ...) dùng chỉ các ký hiệu kết thúc thuộc tập T. Chuỗi các ký hiệu kết thúc thường được biểu diễn bằng các chữ cái Latinh cuối bảng viết thường (x, y, z, ...).
Nhận xét : Bằng quy ước này chúng ta có thể suy ra các biến, các ký hiệu kết thúc và ký hiệu bắt đầu của văn phạm một cách xác định và duy nhất bằng cách xem xét các luật sinh. Vì vậy, để biểu diễn văn phạm, một cách đơn giản người ta chỉ cần liệt kê tập luật sinh của chúng.
Từ văn phạm, để sinh ra được các câu (từ), ta định nghĩa khái niệm “dẫn xuất” như sau :
Nếu α → β là một luật sinh thì γ size 12{γ} {}αδ ⇒ γ size 12{γ} {}βδ gọi là một dẫn xuất trực tiếp, có nghĩa là áp dụng luật sinh α → β vào chuỗi γ size 12{γ} {}αδ để sinh ra chuỗi γ size 12{γ} {}βδ.
Nếu các chuỗi α1, α2, ...., αm ∈ Σ* và α1 ⇒ α2, α2 ⇒ α3, ..., αm-1 ⇒ αm thì ta nói αm có thể được dẫn ra từ α1 thông qua chuỗi dẫn xuất α1 ⇒ α2, α2 ⇒ α3, ..., αm-1 ⇒ αm hay α1 dẫn xuất (gián tiếp) ra αm, viết tắt là α1 ⇒* αm.
Ngôn ngữ của văn phạm G (V, T, P, S) là tập hợp các chuỗi ký hiệu kết thúc w ∈ T* được sinh ra từ ký hiệu bắt đầu S của văn phạm bởi các luật sinh thuộc tập P, ký hiệu là L(G) :
L (G) = {w | w ∈ T * và S ⇒* w}
Một ngôn ngữ có thể có nhiều cách đặc tả, do đó cũng có thể có nhiều văn phạm khác nhau sinh ra cùng một ngôn ngữ. Hai văn phạm sinh ra cùng một ngôn ngữ thì gọi là tương đương.
G1 tương đương G2 ⇔ L (G1) = L (G2)
Sự phân cấp Chomsky trên văn phạm
Bằng cách áp đặt một số quy tắc hạn chế trên các luật sinh, Noam Chomsky đề nghị một hệ thống phân loại các văn phạm dựa vào tính chất của các luật sinh. Hệ thống này cho phép xây dựng các bộ nhận dạng hiệu quả và tương thích với từng lớp văn phạm. Ta có 4 lớp văn phạm như sau :
Văn phạm loại 0:Một văn phạm không cần thỏa ràng buộc nào trên tập các luật sinh được gọi là văn phạm loại 0 hay còn được gọi là văn phạm không hạn chế (Unrestricted Grammar)
Văn phạm loại 1:Nếu văn phạm G có các luật sinh dạng α → β và thỏa |β|≥|α| thì G là văn phạm loại 1 hoặc còn được gọi là văn phạm cảm ngữ cảnh CSG(Context-Sensitive Grammar)
Ngôn ngữ của lớp văn phạm này được gọi là ngôn ngữ cảm ngữ cảnh (CSL)
Văn phạm loại 2:Nếu văn phạm G có các luật sinh dạng A → α với A là một biến đơn và α là một chuỗi các ký hiệu ∈ (V size 12{ union } {}T)* thì G là văn phạm loại 2 hoặc còn được gọi là văn phạm phi ngữ cảnh CFG (Context-Free Grammar)
Ngôn ngữ của lớp văn phạm này được gọi là ngôn ngữ phi ngữ cảnh (CFL)
Văn phạm loại 3: Nếu văn phạm G có mọi luật sinh dạng tuyến tính phải (right-linear): A → wB hoặc A → w với A, B là các biến đơn và w là chuỗi ký hiệu kết thúc (có thể rỗng); hoặc có dạng tuyến tính trái (left-linear): A → Bw hoặc A →w thì G là văn phạm loại 3 hay còn được gọi là văn phạm chính quy RG (Regular Grammar)
Ngôn ngữ của lớp văn phạm này được gọi là ngôn ngữ chính quy (RL)
Ký hiệu : L0, L1, L2, L3 là các lớp ngôn ngữ sinh ra bởi các văn phạm loại 0, 1, 2, 3 tương ứng. Ta có : L3 ⊂ L2 ⊂ L1 ⊂ L0 và các bao hàm thức này là nghiêm ngặt.
Thí dụ 2.5 :
- Xét văn phạm G :
V = {S, A}, T = {a, b} và tập P = { S → aS
S → aA
A → bA
A → b }
Đây là văn phạm loại 3 (vì tập luật sinh có dạng tuyến tính phải).
Chẳng hạn, một dẫn xuất từ S có dạng :
S ⇒ aS ⇒ aaS ⇒ aaaA ⇒ aaabA ⇒ aaabbA ⇒ aaabbbA ⇒ aaabbbb = a3 b4
Hay văn phạm sinh ra ngôn ngữ L(G3) = {a+b+} = {anbm |n, m ≥ 1 }
- Xét văn phạm G :
V = {S}, T = {a, b} và tập P = { S → aSb
S → ab }
Đây là văn phạm loại 2.
Chẳng hạn, một dẫn xuất từ S có dạng :
S ⇒ aSb ⇒ aaSbb ⇒ aaaSbbb ⇒ aaaabbbb = a4b4
Hay văn phạm sinh ra ngôn ngữ L(G2) = {anbn |n ≥ 1}
- Xét văn phạm G :
V = {S, B, C}, T = {a, b, c} và tập P = { S → aSBC
S → aBC
CB → BC
aB →ab
bB → bb
bC → bc
cC → cc }
Đây là văn phạm loại 1.
Chẳng hạn, một dẫn xuất từ S có dạng :
S ⇒ aSBC ⇒ aaBCBC ⇒ aabCBC ⇒ aabBCC ⇒ aabbCC ⇒ aabbcC ⇒ aabbcc = a2b2c2
Hay văn phạm sinh ra ngôn ngữ L(G1) = {anbncn | n > 0}.