Giáo trình Lý thuyết ngôn ngữ hình thức và ôtômát - Nguyễn Gia Định

pdf 107 trang phuongnguyen 3720
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lý thuyết ngôn ngữ hình thức và ôtômát - Nguyễn Gia Định", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_ly_thuyet_ngon_ngu_hinh_thuc_va_otomat_nguyen_gia.pdf

Nội dung text: Giáo trình Lý thuyết ngôn ngữ hình thức và ôtômát - Nguyễn Gia Định

  1. Bé gi¸o dôc vµ ®µo t¹o ®¹i häc huÕ tr−êng ®¹i häc khoa häc nguyÔn gia ®Þnh Lý THUYÕT NG¤N NG÷ H×NH THøC Vµ ¤T¤MAT 1 q0 q1 1 0 0 0 0 1 q2 q3 1 huÕ − 2004
  2. LỜI NÓI ĐẦU Mấy chục năm gần đây, chúng ta đã chứng kiến sự phát triển mãnh liệt trong các lĩnh vực nghiên cứu toán học liên quan đến máy tính và tin học. Sự phát triển phi thường của các máy tính và những thay đổi sâu sắc trong phương pháp luận khoa học đã mở ra những chân trời mới cho toán học với một tốc độ không thể sánh được trong suốt lịch sử lâu dài của toán học. Những phát triển đa dạng của toán học đã trực tiếp tạo ra “thuở ban đầu” của máy tính và tin học và các tiến bộ trong tin học đã dẫn đến sự phát triển rất mạnh mẽ một số ngành toán học. Vì vậy, toán học đóng vai trò trung tâm trong các cơ sở của tin học. Có thể kể ra một số lĩnh vực nghiên cứu đáng chú ý trong mối quan hệ này. Thật là thú vị khi nhận thấy rằng các lĩnh vực này cũng phản ánh sự phát triển lịch sử của tin học. 1. Lý thuyết kinh điển về tính toán bắt đầu bằng công trình của Gödel, Tarski, Church, Post, Turing và Kleene chiếm vị trí trung tâm. 2. Trong lý thuyết ôtômat và ngôn ngữ hình thức kinh điển, các khái niệm cơ bản là ôtômat, văn phạm và ngôn ngữ, với các công trình sáng giá của Axel Thue, Chomsky, Post. Ngoài hai lĩnh vực trên, nhiều lĩnh vực quan trọng khác thuộc về các cơ sở toán học của tin học; chẳng hạn, lý thuyết độ phức tạp, ngữ nghĩa và lý thuyết về tính đúng đắn của các ngôn ngữ lập trình, lý thuyết mật mã, lý thuyết các cấu trúc dữ liệu và lý thuyết các cơ sở dữ liệu. Lý thuyết ngôn ngữ hình thức và ôtômat đóng một vai trò rất quan trọng trong các cơ sở toán học của tin học. Ngôn ngữ hình thức được sử dụng trong việc xây dựng các ngôn ngữ lập trình, lý thuyết về các chương trình dịch. Các ngôn ngữ hình thức tạo thành một công cụ mô tả đối với các mô hình tính toán cả cho dạng thông tin vào-ra lẫn kiểu thao tác. Lý thuyết ngôn ngữ hình thức, chính vì thực chất của nó là một lĩnh vực khoa học liên ngành; nhu cầu mô tả hình thức văn phạm được phát sinh trong nhiều ngành khoa học khác nhau từ ngôn ngữ học đến sinh vật học. Do đó những khía cạnh thích hợp của lý thuyết ngôn ngữ hình thức sẽ có tầm quan trọng quyết định trong các giáo trình về Lý thuyết ngôn ngữ hình thức và ôtômat. Ngoài ra, một trong các vấn đề cơ bản của lý thuyết tính toán là các bài toán nào có các thuật toán để giải. Sự phát triển có tính chất nền tảng của lôgic toán trong những năm 30 của thế kỷ 20 đã chỉ ra việc tồn tại các bài toán không giải được, đó là các bài toán mà không thể có một thuật toán nào giải được chúng. 1
  3. Cần phải có một mô hình tính toán để thiết lập tính không giải được. Mô hình tính toán đó là máy Turing, nó đã được đưa ra từ trước khi các máy tính điện tử ra đời khá lâu. Các máy Turing lập thành mô hình tính toán tổng quát được dùng rộng rãi nhất. Giáo trình này nhằm trình bày về văn phạm hình thức và các ôtômat cũng như máy Turing, là những công cụ sinh ngôn ngữ, đồng thời đề cập đến các tính chất của ngôn ngữ chính quy, ngôn ngữ phi ngữ cảnh, ngôn ngữ đệ quy và ngôn ngữ đệ quy đếm được. Ngoài ra, giáo trình cũng giới thiệu sơ lược về trình biên dịch, một phần quan trọng của học phần Chương trình dịch, học phần gắn bó chặt chẽ với Lý thuyết ngôn ngữ hình thức và ôtômat. Một phần rất quan trọng trong lý thuyết thuật toán là lớp các ngôn ngữ (hay bài toán) P và NP cũng như lớp các ngôn ngữ NP-đầy đủ được giới thiệu trong phần phụ lục. Nội dung của tài liệu này được bố trí trong 5 chương, không kể lời nói đầu, mục lục, tài liệu tham khảo và phần phụ lục: Chương I: Trình bày về các khái niệm cơ bản của ngôn ngữ, cấu trúc của văn phạm sinh ra ngôn ngữ và sự phân cấp Chomsky của ngôn ngữ. Chương II: Trình bày về ngôn ngữ chính quy, trong đó có các công cụ sinh ra ngôn ngữ chính quy là văn phạm chính quy, ôtômat hữu hạn (đơn định và không đơn định) và biểu thức chính quy. Chương III: Đi sâu về ngôn ngữ phi ngữ cảnh và ôtômat đẩy xuống là công cụ đoán nhận ngôn ngữ phi ngữ cảnh. Chương IV: Giới thiệu về máy Turing và vấn đề không giải được của thuật toán. Chương V: Trình bày sơ lược về các quá trình của sự biên dịch của các ngôn ngữ, đặc biệt là ngôn ngữ lập trình. Đây là một tài liệu tham khảo, học tập cho sinh viên, học viên cao học và nghiên cứu sinh các chuyên ngành Toán-Tin, Công nghệ thông tin, Tin học và những ai quan tâm về văn phạm, ngôn ngữ hình thức và ôtômat. Chúng tôi xin chân thành cám ơn các đồng nghiệp đã động viên và góp ý cho công việc viết giáo trình Lý thuyết ngôn ngữ hình thức và ôtômat này và lời cám ơn đặc biệt xin dành cho Thầy Lê Mạnh Thạnh và đồng nghiệp Nguyễn Hoàng Sơn về sự cung cấp một số tài liệu quan trọng và động viên kịp thời tạo niềm hưng phấn để tác giả giảng dạy và viết giáo trình cho học phần Lý thuyết ngôn ngữ hình thức và ôtômat. Tác giả mong nhận được sự chỉ giáo của các đồng nghiệp và độc giả về những thiếu sót khó tránh khỏi của cuốn sách. Trọng Đông năm Giáp Thân (2004) Nguyễn Gia Định 2
  4. MỤC LỤC Lời nói đầu 1 Mục lục 2 Chương I: Nhập môn về văn phạm và ngôn ngữ hình thức 4 1.1. Khái niệm ngôn ngữ 4 1.2. Văn phạm và ngôn ngữ sinh bởi văn phạm 8 1.3. Một số tính chất của ngôn ngữ 15 Bài tập Chương I 19 Chương II: Ôtômat hữu hạn và ngôn ngữ chính quy 20 2.1. Ôtômat hữu hạn 20 2.2. Quan hệ giữa ôtômat hữu hạn và ngôn ngữ chính quy 28 2.3. Biểu thức chính quy 32 2.4. Cực tiểu hoá ôtômat hữu hạn 34 Bài tập Chương II 41 Chương III: Ôtômat đẩy xuống và ngôn ngữ phi ngữ cảnh 43 3.1. Văn phạm phi ngữ cảnh và cây suy dẫn của nó 43 3.2. Ôtômat đẩy xuống 51 Bài tập Chương III 59 Chương IV: Máy Turing 60 4.1. Máy Turing và lớp các hàm có thể tính được 61 4.2. Máy Turing phổ dụng 68 4.3. Vấn đề không giải được bằng thuật toán 72 Bài tập Chương IV 75 Chương V: Giới thiệu về trình biên dịch 76 5.1. Ngôn ngữ lập trình 76 5.2. Trình biên dịch 80 5.3. Các mối liên quan với trình biên dịch 87 5.4. Nhóm các giai đoạn của trình biên dịch 91 Phụ lục: Các lớp P và NP và lớp các bài toán NP-đầy đủ 93 Tài liệu tham khảo 105 3
  5. CHƯƠNG I: NHẬP MÔN VỀ VĂN PHẠM VÀ NGÔN NGỮ HÌNH THỨC 1.1. KHÁI NIỆM NGÔN NGỮ. 1.1.1. Mở đầu: Từ ngàn xưa con người muốn giao tiếp với nhau phải dùng ngôn ngữ. Ngôn ngữ để con người có thể giao tiếp với nhau được gọi là ngôn ngữ tự nhiên, chẳng hạn như tiếng Anh, tiếng Nga, tiếng Việt là các ngôn ngữ tự nhiên. Con người muốn giao tiếp với máy tính tất nhiên cũng thông qua ngôn ngữ. Con người muốn máy tính thực hiện công việc, phải viết các yêu cầu đưa cho máy bằng ngôn ngữ máy hiểu được. Việc viết các yêu cầu ta gọi là lập trình. Ngôn ngữ dùng để lập trình được gọi là ngôn ngữ lập trình. Cả ngôn ngữ lập trình lẫn ngôn ngữ tự nhiên đều có thể xem như những tập các từ, tức là các xâu hữu hạn các phần tử của một bộ chữ cái cơ sở nào đó. Khái niệm ngôn ngữ được đưa vào trong mục này rất tổng quát. Chắc chắn bao hàm cả ngôn ngữ lập trình lẫn tự nhiên, và cả mọi ngôn ngữ vô nghĩa mà ta có thể nghĩ đến. Về mặt truyền thống, lý thuyết ngôn ngữ hình thức liên quan đến các đặc tả cú pháp của ngôn ngữ nhiều hơn là đến những vấn đề ngữ nghĩa. Một đặc tả về cú pháp của một ngôn ngữ có hữu hạn từ, ít nhất về nguyên tắc, có thể được cho bằng cách liệt kê các từ. Điều đó không thể áp dụng đối với các ngôn ngữ có vô hạn từ. Nhiệm vụ chính của lý thuyết ngôn ngữ hình thức là nghiên cứu các cách đặc tả hữu hạn của các ngôn ngữ vô hạn. Lý thuyết cơ sở của tính toán cũng như của nhiều ngành khác nhau của nó, chẳng hạn mật mã học, có liên quan mật thiết với lý thuyết ngôn ngữ. Các tập vào và ra của một thiết bị tính toán có thể được xem như các ngôn ngữ và nói một sâu sắc hơn thì các mô hình tính toán có thể được đồng nhất với các lớp các đặc tả ngôn ngữ theo nghĩa mà sau này sẽ nêu chính xác hơn. Chẳng hạn, các máy Turing có thể được đồng nhất với các văn phạm cấu trúc câu và các ôtômat hữu hạn có thể đồng nhất với các văn phạm chính quy. 1.1.2. Định nghĩa: Một bảng chữ cái là một tập hữu hạn khác rỗng. Các phần tử của một bảng chữ cái Σ được gọi là các chữ cái hay các ký hiệu. Thí dụ 1: Dưới đây là các bảng chữ cái: Σ = {a, b, c, , z}, U = {α, β, γ, δ, ε, η, ϕ, κ, µ, χ, ν, π, θ, ρ, σ, τ, ω,ξ, ψ}, V = {0, 1}, W = {if, then, else, a, b, c, d, e, f, +, −, ∗, /, =, ≠}. 4
  6. 1.1.3. Định nghĩa: Một từ trên bảng chữ cái Σ là một xâu hữu hạn gồm một số lớn hơn hay bằng không các chữ của Σ, trong đó một chữ có thể xuất hiện vài lần. Xâu không có chữ nào được gọi là từ rỗng và được ký hiệu là ε. Như vậy, theo định nghĩa, hai từ α=a1a2 an và β=b1b2 bm là bằng nhau, α=β, nếu n=m và ai=bi với mọi i=1, 2, , n. Tập mọi từ (t.ư. mọi từ khác rỗng) trên bảng chữ cái Σ được ký hiệu là Σ* (t.ư. Σ+). Các tập Σ* và Σ+ là vô hạn với bất kỳ Σ nào (thật ra, Σ* và Σ+ là vô hạn đếm được như Mệnh đề 1.1.5 dưới đây). Về mặt đại số, Σ* là một vị nhóm tự do với đơn vị là từ rỗng ε sinh bởi Σ và Σ+ là một nửa nhóm tự do sinh bởi Σ. Đối với các từ α∈Σ* và α’∈Σ’*, việc đặt α và α’cạnh nhau để có từ mới αα’∈(Σ∪Σ’)* được gọi là phép ghép α với α’. Từ rỗng là phần tử đơn vị đối với phép ghép: ωε = εω = ω đúng với mọi từ ω. Vì phép ghép có tính kết hợp, nghĩa là với mọi từ α, β, γ, ta có (αβ)γ = α(βγ), nên ký hiệu ωn, với n là số tự nhiên, được dùng theo nghĩa quen thuộc: ⎧ε khi n = 0, n ⎪ ω = ⎨ω khi n = 1, ⎪ n−1 ⎩ω ω khi n > 1. Thí dụ 2: ε, 0, 01, 101, 1010, 110011 là các từ trên bảng chữ cái V = {0,1}. beautiful là một từ trên bảng chữ cái Σ = {a, b, c, , z}. Trên bảng chữ cái W = {if, then, else, a, b, c, d, e, f, +, −, ∗, /, =, ≠}, nếu α là từ if a+b=c then c∗d=e và β là từ else c/d=f thì αβ là từ: if a + b = c then c ∗ d = e else c / d = f. 1.1.4. Định nghĩa: Độ dài của một từ ω, ký hiệu |ω| hay d(ω), là số các chữ có mặt trong ω. Theo định nghĩa, |ε|=0. Hàm độ dài có một số tính chất hình thức của lôgarit: với mọi từ α, β và mọi số tự nhiên n, |αβ| = |α| + |β|, |αn| = n|α|. Đảo của một từ có được bằng cách viết các chữ cái theo thứ tự ngược lại; R nếu ω=a1a2 an là một từ trên bảng chữ Σ thì đảo ω của nó là từ trên bảng chữ Σ: R ω = an a2a1. Từ α được gọi là một từ con hay một nhân tử của từ β nếu có các từ u và v sao cho β=uαv. Ngoài ra, nếu u=ε (t.ư. v=ε) thì α được gọi là từ con đầu hay tiền tố (t.ư. từ con cuối hay hậu tố) của β. Thí dụ 3: Từ ω=010111001 trên bảng chữ cái {0, 1} có độ dài 9, trong đó 0101 là tiền tố và 11001 là hậu tố của ω. 5
  7. Từ if a + b = c then c ∗ d = e else c / d = f trên bảng chữ cái W ở trên có độ dài là 18, trong đó then c ∗ d = e là từ con của nó. 1.1.5. Mệnh đề: Nếu Σ là bảng chữ cái thì Σ* là tập (vô hạn) đếm được. Chứng minh: Do mỗi số tự nhiên n đều tồn tại một từ trên Σ có độ dài n nên Σ* là * một tập vô hạn. Giả sử Σ={a1, a2, , an}. Xét ánh xạ f từ Σ vào tập hợp N các số tự nhiên xác định bởi: * f(ε) = 0, f(ai) = i, f(αai) = (n+1)f(α)+i, ∀α∈Σ . Với α = a a a , β = b b b và f(α) = f(β). Khi đó, i0 i1 ik j0 j1 jh k k-1 h h-1 (n+1) i0+(n+1) i1+ +(n+1)ik-1+ik = (n+1) j0+(n+1) j1+ +(n+1)jh-1+jh, trong đó 2 vế là hai khai triển của một số nguyên theo cơ số n+1. Do đó, k=h và * iu=ju với 1 ≤ u ≤ k hay α=β. Vì vậy, f là một đơn ánh. Từ đó suy ra Σ là một đếm được. 1.1.6. Định nghĩa: Mỗi tập con của Σ* được gọi là một ngôn ngữ hình thức hay ngắn gọn hơn là một ngôn ngữ trên Σ. Đặc biệt, tập ∅ là một ngôn ngữ trên Σ, gọi là ngôn ngữ rỗng; tập {ε} cũng là một ngôn ngữ trên Σ, đây là ngôn ngữ chỉ chứa từ rỗng và Σ* là ngôn ngữ gồm tất cả các từ trên Σ. Thí dụ 4: L1 = {ε, a, b, abb, aab, aaa, bbb, abab}, n n L2 = {a b | n∈ N} là hai ngôn ngữ trên bảng chữ Σ = {a, b}, L1 là ngôn ngữ hữu hạn trong khi L2 là ngôn ngữ vô hạn. Mỗi từ thuộc ngôn ngữ L2 có số chữ cái a bằng số chữ cái b với a và b không xen kẻ, a nằm ở phía trái và b ở phía phải của nó. Các họ ngôn ngữ cụ thể thường được đặc trưng một cách tiện lợi qua các phép toán xác định trên ngôn ngữ, họ đó gồm các ngôn ngữ nhận được bằng việc tổ hợp từ một số ngôn ngữ cho trước bởi một số phép toán nào đó. Vì ngôn ngữ là tập hợp nên ta có các phép toán Boole như là phép giao, phép hợp, phép hiệu, phép lấy bù. Chẳng hạn, với L1 và L2 là hai ngôn ngữ trên bảng chữ Σ thì ta có các * ngôn ngữ mới sau cũng trên bảng chữ Σ: L1 ∪ L2, L1 ∩ L2, L1 \ L2, Σ \ L1. Ngoài ra, ta còn có các phép toán khác là “phép ghép” và “phép cấu xạ” như dưới đây. 1.1.7. Định nghĩa: Cho hai ngôn ngữ L1 trên bảng chữ Σ1 và L2 trên bảng chữ Σ2. Ghép hay tích của hai ngôn ngữ L1 và L2 là ngôn ngữ trên bảng chữ Σ1 ∪ Σ2, ký hiệu L1L2, đuợc xác định bởi: L1L2 = {αβ | α∈L1 và β∈L2}. Dễ dàng thấy rằng phép ghép có tính kết hợp, nghĩa là với mọi ngôn ngữ L1, L2 và L3, ta luôn có: (L1L2)L3 = L1(L2L3). Ngoài ra, với mọi ngôn ngữ L, ta có: ∅L = L∅ = ∅, {ε}L = L{ε} = L, 6
  8. và phép ghép có tính phân phối đối với phép hợp, nghĩa là L1(L2 ∪ L3) = L1L2 ∪ L1L3, (L2 ∪ L3)L1 = L2L1 ∪ L3L1. Vì phép ghép ngôn ngữ có tính kết hợp nên ký hiệu Ln được dùng với mọi ngôn ngữ L và số tự nhiên n theo nghĩa quen thuộc sau: ⎧{ε} khi n = 0, n ⎪ L = ⎨L khi n = 1, ⎪ n-1 ⎩L L khi n > 1. Lặp hay bao đóng ghép của ngôn ngữ L, ký hiệu L*, được định nghĩa là hợp của mọi luỹ thừa của L: ∞ L* = Ln . nU=0 Lặp không-ε hay bao đóng ghép không-ε của L, ký hiệu L+, được định nghĩa là hợp của mọi luỹ thừa dương của L: ∞ L+ = Ln . Un=1 Thí dụ 5: 1) Xét các ngôn ngữ trên bảng chữ Σ = {0, 1}: L1 = {0, 01}, L2 = {01, 10}, L3 = {0}. L2L3 = {010, 100}, L1 ∪ (L2L3) = {0, 01, 010, 100}, L1 ∪ L2 = {0, 01, 10}, L1 ∪ L3 = {0, 01}, (L1 ∪ L2)(L1 ∪ L3) = {00, 001, 010, 0101, 100, 1010}. Do đó L1 ∪ (L2L3) ≠ (L1 ∪ L2)(L1 ∪ L3) tức là phép hợp không có tính phân phối đối với phép ghép. L2 ∩ L3 = ∅, L1(L2 ∩ L3) = ∅, L1L2 = {001, 010, 0101, 0110}, L1L3 = {00, 010}, (L1L2) ∩ (L1L3) = {010}. Do đó L1(L2 ∩ L3) ≠ (L1L2) ∩ (L1L3) tức là phép ghép không có tính phân phối đối với phép giao. L1 ∩ (L2L3) = ∅, L1 ∩ L2 = {01}, L1 ∩ L3 = {0}, (L1 ∩ L2)(L1 ∩ L3) = {010}. Do đó L1 ∩ (L2L3) ≠ (L1 ∩ L2)(L1 ∩ L3) tức là phép giao không có tính phân phối đối với phép ghép. 2) Xét ngôn ngữ L = {0, 1} trên bảng chữ Σ = {0, 1}. Ta có: L2 = {00, 01, 10, 11}, tập hợp các xâu nhị phân độ dài 2; L3 = {000, 001, 010, 011, 100, 101, 110, 111}, tập hợp các xâu nhị phân độ dài 3; Tương tự, Ln là tập hợp các xâu nhị phân độ dài n. Vì vậy, L* là tập hợp tất cả các xâu nhị phân. 3) Xét hai ngôn ngữ trên bảng chữ Σ = {a}: 2n 5n+3 L1 = {a | n ≥ 1}, L2 = {a | n ≥ 0}. 2 + 5 * 3 Khi đó, ta có L1 = {a } , L2 = {a } {a }. 7
  9. Một phép toán có tầm quan trọng cốt yếu trong lý thuyết ngôn ngữ là phép cấu xạ, như được định nghĩa dưới đây. 1.1.8. Định nghĩa: Cho hai bảng chữ Σ và Σ’. Ánh xạ f: Σ* ⎯⎯→ Σ’* thoả mãn điều kiện f(αβ) = f(α)f(β) với mọi từ α, β ∈ Σ* (1) được gọi là một cấu xạ. Đối với ngôn ngữ L trên Σ, f(L) = {f(α) | α ∈ L} là ngôn ngữ trên Σ’. Theo điều kiện (1), để xác định cấu xạ f, chỉ cần liệt kê mọi từ f(a) trên Σ’ với a chạy trên mọi chữ cái của Σ. Cấu xạ f gọi là không xoá (t.ư. chữ - thành - chữ) nếu f(a) ≠ε (t.ư. f(a) ∈ Σ’) với mỗi a ∈ Σ. Thí dụ 6: Xét bảng chữ cái tiếng Anh Σ = {A, B, C, , Z}. Mỗi cấu xạ chữ - thành - chữ * * fi: Σ ⎯⎯→ Σ , 0 ≤ i ≤ 25 ánh xạ mỗi chữ thành chữ đứng sau nó i vị trí trong bảng chữ cái, trong đó phần cuối của bảng chữ cái được nối tiếp vòng tròn lên phần đầu. Chẳng hạn, f3(A) = D, f7(Y) = F, f25(Z) = Y. Trong mật mã học, mỗi cấu xạ fi thường được đề cập đến như cách mã hoá Caesar. Chẳng hạn, f25(IBM) = HAL, f3(HELP) = KHOS. Dễ dàng thấy rằng các cấu xạ fi có tính giao hoán: fi o fj = fj o fi với mọi i, j. Ngoài ra, f26-i o fi = f0 với mọi i ≥ 1. Như vậy, nếu một bản rõ nào đó được mã hoá bằng cách dùng fi, chính bản rõ đó có thể tìm lại được bằng cách dùng f26-i để giải mã. 1.2. VĂN PHẠM VÀ NGÔN NGỮ SINH BỞI VĂN PHẠM. 1.2.1. Mở đầu: Ta có thể hình dung một văn phạm như một “thiết bị tự động” mà nó có khả năng sinh ra một tập hợp các từ trên một bảng chữ cái cho trước. Mỗi từ được sinh ra sau một số hữu hạn bước thực hiện các quy tắc của văn phạm. Việc xác định một ngôn ngữ trên bảng chữ cái cho trước có thể được thực hiện bằng một trong các cách thức sau: Cách 1: Đối với mỗi từ thuộc ngôn ngữ đã cho, ta có thể chọn một quy cách hoạt động của “thiết bị tự động” để sau một số hữu hạn bước làm việc nó dừng và sinh ra chính từ đó. Cách 2: “Thiết bị tự động” có khả năng lần lượt sinh ra tất cả các từ trong ngôn ngữ đã cho. 8
  10. Cách 3: Với mỗi từ ω cho trước, “thiết bị tự động” có thể cho biết từ đó có thuộc ngôn ngữ đã cho hay không. Trong lý thuyết văn phạm, người ta đã chứng minh được rằng ba cách thức trên là tương đương nhau hay văn phạm làm việc theo các cách trên là tương đương nhau. Vì vậy, ở đây ta quan tâm đến cách thứ nhất, tức là ta xét văn phạm như là một “thiết bị tự động” sinh ra các từ. Vì lẽ đó mà người ta còn gọi các “thiết bị tự động” đó là văn phạm sinh. Việc sinh ra các từ có thể được thực hiện bằng nhiều cách khác nhau. Các từ có thể được sinh ra bởi các văn phạm, bởi các Ôtômat, bởi các máy hình thức như máy Turing, Ở đây ta đề cập đến cách của CHOMSKY đưa ra vào những năm 1956-1957. 1.2.2. Định nghĩa: Văn phạm G là một bộ sắp thứ tự gồm 4 thành phần: G = , trong đó: a) Σ là một bảng chữ, gọi là bảng chữ kết thúc hay từ điển cơ bản, mỗi phần tử của nó được gọi là một ký hiệu kết thúc hay ký hiệu cơ bản; b) ∆ là một bảng chữ, ∆ ∩ Σ=∅, gọi là bảng chữ không kết thúc hay từ điển hỗ trợ, mỗi phần tử của nó được gọi là một ký hiệu không kết thúc hay ký hiệu hỗ trợ. c) S ∈ ∆ được gọi là ký hiệu đầu; d) P là tập hợp các cặp thứ tự , trong đó α, β ∈ (Σ ∪ ∆)* và trong α chứa ít nhất một ký hiệu không kết thúc; P được gọi là tập các quy tắc thay thế, được gọi là một quy tắc hay sản suất và thường được viết cho thuận tiện là α→β, α được gọi là vế trái và β được gọi là vế phải của quy tắc này. Thí dụ 7: Các bộ bốn sau là các văn phạm: G1 = , G2 = , G3 = G4 = , trong đó Σ={tôi, anh, chị, ăn, uống, cơm, phở, sữa, café}, ∆={ , , , , , , }, S= , P={ → , →tôi, →anh, →chị, → , → , →ăn, →uống, →cơm, →phở, →sữa, →café}. 9
  11. 1.2.3. Định nghĩa: Cho văn phạm G = và η, ω∈(Σ ∪ ∆)*. Ta nói ω được suy dẫn trực tiếp từ η trong G, ký hiệu η G ω hay ngắn gọn là η ω (nếu không sợ nhầm lẫn), nếu tồn tại quy tắc α→β∈P và γ, δ∈(Σ ∪ ∆)* sao cho η=γαδ, ω=γβδ. Điều này có nghĩa là nếu η nhận vế trái α của quy tắc α→β như là từ con thì ta thay α bằng β để được từ mới ω. 1.2.4. Định nghĩa: Cho văn phạm G = và η, ω∈(Σ ∪ ∆)*. Ta nói ω được suy dẫn từ η trong G, ký hiệu η G ω hay ngắn gọn là η ω (nếu không sợ * nhầm lẫn), nếu η=ω hoặc tồn tại một dãy ω0, ω1, , ωk∈(Σ ∪ ∆) sao cho ω0=η, G ωk=ω và ωi-1 ωi, với i=1, 2, , k. Khi đó dãy ω0, ω1, , ωk được gọi là một dẫn xuất của ω từ η trong G và số k được gọi là độ dài của dẫn xuất này. Nếu ωi được suy dẫn trực tiếp từ ωi-1 bằng việc áp dụng một quy tắc p nào đó trong G thì ta nói quy tắc p được áp dụng ở bước thứ i. 1.2.5. Định nghĩa: Cho văn phạm G = . Từ ω∈Σ* được gọi là sinh G bởi văn phạm G nếu tồn tại suy dẫn S ω. Ngôn ngữ sinh bởi văn phạm G, ký hiệu L(G), là tập hợp xác định bởi: G L(G) = {ω∈Σ* | S ω}. Hai văn phạm G1 và G2 được gọi là tương đương nếu L(G1)=L(G2). 4 4 Thí dụ 8: 1) Xét văn phạm G1 như trong 1) của Thí dụ 7. Từ 0 1 được suy dẫn từ S bằng dãy dẫn xuất độ dài 5: S 0S1 00S11 000S111 0000S1111 0414. Bằng việc sử dụng n lần (n ≥ 0) quy tắc 1 rồi quy tắc 2, ta có: S 0n1n. Do n n đó L(G1) = {0 1 | n ≥ 0}. 2) Xét văn phạm G2 như trong 2) của Thí dụ 7. Sử dụng quy tắc 1, rồi n lần (n ≥ 0) quy tắc 2, sau đó sử dụng quy tắc 3 để kết thúc, ta có: S Ab anAbnb anbn+1. n n+1 Do đó L(G2) = {a b | n ≥ 0}. 3) Xét văn phạm G3 như trong 3) của Thí dụ 7. Sử dụng quy tắc 1, rồi m-1 lần (m ≥ 1) quy tắc 2, n-1 lần (n ≥ 1) quy tắc 3, k-1 lần (k ≥ 1) quy tắc 4 (có thể xen kẻ), sau đó để kết thúc sử dụng các quy tắc 5,6, 7, ta có: S ABC amAbnBckC ambnck. m n k Do đó L(G3) = {a b c | m ≥ 1, n ≥ 1, k ≥ 1}. 4) L(G4) = {tôi ăn cơm, anh ăn cơm, chị ăn cơm, tôi ăn phở, anh ăn phở, chị ăn phở, tôi uống sữa, anh uống sữa, chị uống sữa, tôi uống café, anh uống café, chị uống café}. Ta có thể biểu diễn việc dẫn xuất từ đến một từ trong L(G4), chẳng hạn “tôi ăn cơm” bằng một cây gọi là cây dẫn xuất hay cây phân tích cú pháp như dưới đây. Tất nhiên, theo quan điểm phân tích cú pháp thực tế, việc xem xét các 10
  12. quy tắc theo hướng ngược lại là từ phải qua trái. Điều đó có nghĩa là cây dưới đây được xử lý từ dưới lên trên chứ không phải là từ trên xuống dưới. tôi ăn cơm Thí dụ 9: 1) Cho hai văn phạm G1 = , G2 = . n n Dễ dàng có được L(G1)=L(G2)={a b | n ≥ 1} hay G1 và G2 là tương đương nhau. Lưu ý rằng nếu các quy tắc có vế trái giống nhau có thể viết gọn lại. Chẳng hạn, như trong G1 ta có thể viết hai quy tắc của nó dưới dạng S→aSb| ab. 2) Cho hai văn phạm G3 = , G4 = , trong đó: Σ = {0, 1, 2, 3, 4, 5 ,6, 7, 8, 9}, P3 = {S→1| 2| 3| 4| 5| 6| 7| 8| 9| S0| S1| S2| S3| S4| S5| S6| S7| S8| S9}, P4 = {S→0| 1| 2| 3| 4| 5| 6| 7| 8| 9| 1S| 2S| 3S| 4S| 5S| 6S| 7S| 8S| 9S}. Sử dụng k-1 lần (k ≥ 1) các quy tắc trong nhóm 10 quy tắc cuối của G3, rồi một quy tắc trong nhóm 9 quy tắc của nó, ta có: S Si1 Si2i1 Sik-1 i2i1 ikik-1 i2i1, trong đó, i1, i2, , ik-1 ≥ 0 và ik ≥ 1. Do đó, L(G3) = {n | n ≥ 1} = N \ {0}. Lập luận như trên, ta nhận được L(G4) = {n∈N | n có chữ số hàng đơn vị tuỳ ý và các chữ số khác n ≥ 1}. Vì vậy, G3 và G4 không tương đương nhau. 1.2.6. Bổ đề: Cho văn phạm G = . Khi đó nếu tồn tại trong P quy tắc chứa ký hiệu đầu S ở vế phải thì tồn tại văn phạm G’ tương đương với G mà các quy tắc của nó không chứa ký hiệu đầu ở vế phải. Chứng minh: Lấy S’∉Σ ∪ ∆, xét văn phạm G’ = , trong đó P’=P ∪ {S’→α | S→α ∈ P}. Rõ ràng trong P’ không chứa quy tắc nào có S’ ở vế phải. Ta chứng minh L(G)=L(G’). G G G G G + ω∈L(G) (hay S ω): Giả sử dãy dẫn xuất của ω là S α ω1 ω. Vì S G α nên có S→α∈P, do đó S’→α∈P’ và vì P ⊂ P’ nên ta có S’ G’ α G’ ω . Vậy S’ G’ ω hay ω∈L(G’). 11
  13. G’ + ω∈L(G’) (hay S’ ω): Giả sử ta có dãy dẫn xuất là S’ G’ α G’ ω . Vì S’ G’ α nên S’→α∈P’, do đó tồn tại S→α∈P. Mặt khác, trong α không chứa S’ nên các suy dẫn trực tiếp trong α G’ ω chỉ sử dụng các quy tắc của P. Vậy ta có S G ω hay ω∈L(G). 1.2.7. Định nghĩa: Văn phạm G = mà không có một ràng buộc nào trên các quy tắc của nó được gọi là văn phạm tổng quát hay là văn phạm nhóm 0. Như vậy, G là văn phạm nhóm 0 khi và chỉ khi các quy tắc của nó có dạng αAβ→ω, trong đó A∈∆, α, β, ω∈(Σ ∪ ∆)*. 1.2.8. Định nghĩa: Văn phạm G = mà các quy tắc của nó có dạng αAβ→αωβ, trong đó A∈∆, α, β, ω∈(Σ ∪ ∆)*, ω≠ε, được gọi là văn phạm cảm ngữ cảnh hay là văn phạm nhóm 1. Các văn phạm mà các quy tắc của chúng có dạng trên, đồng thời chứa thêm quy tắc S→ε, miễn sao ký hiệu đầu S không xuất hiện ở vế phải của bất kỳ quy tắc nào cũng được xếp vào lớp văn phạm nhóm 1. Thí dụ 10: Cho văn phạm G = , trong đó P = {S→aSAC, S→abC, CA→BA, BA→BC, BC→AC, bA→bb, C→c}. Khi đó G là văn phạm cảm ngữ cảnh. Sử dụng n-1 lần (n ≥ 1) quy tắc 1, rồi quy tắc 2, kế đến sử dụng liên tiếp các quy tắc 3, 4, 5 (để đổi chỗ A và C), sau đó sử dụng n-1 lần quy tắc 6 và n lần quy tắc 7, ta có: S an-1S(AC)n-1 anbC(AC)n-1 anbAn-1Cn anbncn. Từ đó suy ra L(G) = {anbncn | n ≥ 1}. 1.2.9. Định nghĩa: Văn phạm G = mà các quy tắc của nó có dạng A→ω, trong đó A∈∆, ω∈(Σ ∪ ∆)*, ω≠ε, được gọi là văn phạm phi ngữ cảnh hay là văn phạm nhóm 2. Các văn phạm mà các quy tắc của chúng có dạng trên, đồng thời chứa thêm quy tắc S→ε, miễn sao ký hiệu đầu S không xuất hiện ở vế phải của bất kỳ quy tắc nào cũng được xếp vào lớp văn phạm nhóm 2. Thí dụ 11: 1) Cho văn phạm G1 = , trong đó P = {S→Sa, S→Aa, A→aAb, A→ab}. Khi đó G1 là văn phạm phi ngữ cảnh. Sử dụng m-1 lần (m ≥ 1) quy tắc 1, rồi quy tắc 2, sau đó sử dụng n-1 lần (n ≥ 1) quy tắc 3, cuối cùng là quy tắc 4, ta có: S Sam-1 Aaam-1 an-1Abn-1am anbnam. n n m Từ đó suy ra L(G1) = {a b a | n ≥ 1, m ≥ 1}. 12
  14. 2) Cho văn phạm G2 = , P’ = {S→SS, S→0S1, S→1S0, S→ε, S’→SS, S’→0S1, S’→1S0, S’→ε}. Ở đây, G2’ cũng không là phi ngữ cảnh. Tuy nhiên, văn phạm G2’’ sau là phi ngữ cảnh mà tương đương với văn phạm G2’, nên cũng tương đương với văn phạm G1. G2’’ = , P’’ = {S→SS, S→0S1, S→1S0, S→01, S→10, S’→SS, S’→0S1, S’→1S0, S’→01, S’→10, S’→ε}. Từ các quy tắc của G2, ta có được: * L(G2’’)=L(G2’)=L(G2)={ω∈{0, 1} | số các chữ số 0 và 1 trong ω là bằng nhau}. 1.2.10. Định nghĩa: Văn phạm G = mà các quy tắc của nó có dạng A→aB, A→a, trong đó A, B∈∆, a∈Σ, ω≠ε, được gọi là văn phạm chính quy hay là văn phạm nhóm 3. Các văn phạm mà các quy tắc của chúng có dạng trên, đồng thời chứa thêm quy tắc S→ε, miễn sao ký hiệu đầu S không xuất hiện ở vế phải của bất kỳ quy tắc nào cũng được xếp vào lớp văn phạm nhóm 3. Thí dụ 12: 1) Cho văn phạm: G1 = . Khi * đó, G1 là văn phạm chính quy và L(G2) = {0ω0 | ω∈{0, 1} }. Thật vậy, sử dụng quy tắc 1, rồi hữu hạn tuỳ ý có thể xen kẻ các quy tắc 2 và 3, cuối cùng là quy tắc 4, ta có: S 0A 0ωA 0ω0. 1.2.11. Định nghĩa: Từ các định nghĩa trên, ta thấy lớp văn phạm tổng quát là rộng nhất, nó chứa đựng các văn phạm cảm ngữ cảnh, lớp văn phạm cảm ngữ cảnh chứa các văn phạm phi ngữ cảnh và lớp văn phạm phi ngữ cảnh chứa các văn phạm chính quy. Hệ thống các lớp văn phạm này được gọi là sự phân cấp Chomsky. Ngôn ngữ hình thức được gọi là ngôn ngữ tổng quát (t.ư. cảm ngữ cảnh, phi ngữ cảnh, chính quy) nếu tồn tại văn phạm tổng quát (t.ư. cảm ngữ cảnh, phi ngữ cảnh, chính quy) sinh ra nó. Vì vậy, đối với các lớp ngôn ngữ, ta có bao hàm thức: 13
  15. {ngôn ngữ chính quy} ⊂ {ngôn ngữ phi ngữ cảnh} ⊂ {ngôn ngữ cảm ngữ cảnh} ⊂ {ngôn ngữ tổng quát}. Ta cũng thấy về mặt cấu trúc ngữ pháp thì các quy tắc của các văn phạm phi ngữ cảnh và văn phạm chính quy là đơn giản hơn cả và chúng có nhiều ứng dụng trong việc thiết kế các ngôn ngữ lập trình và trong nghiên cứu về chương trình dịch Vì vậy, trong các phần tiếp theo chúng ta dành thêm sự quan tâm tới hai lớp văn phạm đó. Thí dụ 13: 1) Cho bảng chữ Σ = {a1, a2, , an}. Khi đó các ngôn ngữ + * L1 = {ω=a1a2 an}, L2 = Σ , L3 = Σ , L = ∅ là các ngôn ngữ chính quy trên bảng chữ Σ. Thật vậy, L1 = L(G1), L2 = L(G2), L3 = L(G3), L4 = L(G4) trong đó G1 = , G2 = , G3 = G4 = là các văn phạm chính quy. (Riêng đối với G4, nó làm việc không bao giờ dừng, * tức là không có ω∈Σ , ω≠ε mà G4 sinh ra, hay G4 sinh ra ngôn ngữ ∅.) 2) Xét hai ngôn ngữ: R * L5 = {ωω | ω∈{a, b} }, * L6 = {ωω | ω∈{a, b} }. (ωR còn được gọi là ảnh gương của ω và như ta đã biết nó nhận được bằng cách viết ω theo hướng ngược lại.) Mặc dù xem qua thì L5 và L6 phức tạp như nhau, việc xác định L5 bằng văn phạm đơn giản hơn rất nhiều. Thật vậy, L5 sinh bởi văn phạm phi ngữ cảnh sau: G5 = . Để sinh L6, ta xét văn phạm cảm ngữ cảnh G6 sau đây: G6 = , trong đó P6 = {S→ABC, AB→aAD, AB→bAE, Da→aD, Db→bD, Ea→aE, Eb→bE, DC→BaC, EC→BbC, aB→Ba, bB→Bb, aAB→a, bAB→b, aC→a,bC→b, S→ε} và bằng việc sử dụng các quy tắc trên với phương pháp quy nạp, ta có được L(G6)=L6. 1.2.12. Bổ đề: Nếu L là ngôn ngữ cảm ngữ cảnh (t.ư. phi ngữ cảnh, chính quy) thì L ∪ {ε} và L \ {ε} cũng vậy. Chứng minh: a) L ∪ {ε}: ε∈L: L ∪ {ε}=L. ε∉L: Giả sử L=L(G), với G = là văn phạm cảm ngữ cảnh (t.ư. phi ngữ cảnh, chính quy). Theo Bổ đề 1.2.6, tồn tại G’ = tương 14
  16. đương và cùng nhóm với G mà S’ không xuất hiện ở vế phải của bất kỳ một quy tắc nào trong P’. Khi đó văn phạm: G’’ = là cùng loại với G’ và L(G’’)=L(G’) ∪ {ε}=L(G) ∪ {ε}=L ∪ {ε}. b) L \ {ε}: ε∉L: L \ {ε}=L. ε∈L: Giả sử L=L(G), với G = là văn phạm cảm ngữ cảnh (t.ư. phi ngữ cảnh, chính quy). Khi đó S→ε∈P và S không xuất hiện ở vế phải của bất kỳ một quy tắc nào trong P. Khi đó văn phạm G’ = cùng nhóm với G và L(G’)=L(G) \ {ε}=L {ε} \ {ε}. 1.3. MỘT SỐ TÍNH CHẤT CỦA NGÔN NGỮ. 1.3.1. Định nghĩa: Giả sử L1 và L2 là hai ngôn ngữ bất kỳ được sinh bởi văn phạm và o là một phép toán nào đó trên lớp các ngôn ngữ. Nếu L1 o L2 là ngôn ngữ cũng được sinh bởi một văn phạm thì ta nói lớp ngôn ngữ do văn phạm sinh ra đóng đối với phép toán o . 1.3.2. Định lý: Lớp ngôn ngữ sinh ra bởi văn phạm là đóng đối với phép hợp. Chứng minh: Giả sử L1, L2 là các ngôn ngữ được sinh bởi văn phạm G1, G2 hay L1=L(G1), L2=L(G2). Ta chứng minh tồn tại văn phạm G sao cho L(G)=L1 ∪ L2. Giả sử G1 = và G2 = . Không mất tính chất tổng quát giả thiết rằng ∆1∩ (Σ2 ∪ ∆2)=∆2∩ (Σ1 ∪ ∆1)=∅. Lấy S∉Σ1∪∆1∪Σ2∪ ∆2. Xét văn phạm G = , trong đó P = (P1 \ {S1→ε}) ∪ (P2 \ {S2→ε}) ∪ {S→ε | S1→ε∈P1 hoặc S2→ε∈P2} ∪ ∪ {S→S1, S →S2}. (Ở đây, ta hiểu rằng nếu S1→ε∈P1 (t.ư. S2→ε∈P2) thì S1 (t.ư. S2) không xuất hiện ở vế phải của bất kỳ một quy tắc nào trong P1 (t.ư. P2).) a) ω∈L(G): ω=ε: tồn tại S→ε∈P, nên có S1→ε∈P1 hoặc S2→ε∈P2. Do đó ω=ε∈L1 ∪ L2. ω≠ε: tồn tại suy dẫn S G ω và giả sử suy dẫn này là S G α G β G G ω. Từ đó ta có S→α∈P (α≠ε), nên có α=S1 hoặc α=S2. Nếu α=S1 thì dãy dẫn xuất α, β, , ω G1 G1 G1 là ở trong G1, nên ta có S1 β ω, tức là ω∈L(G1). Nếu α=S2 thì dãy dẫn G2 G2 G2 xuất α, β, , ω là ở trong G2, nên ta có S2 β ω, tức là ω∈L(G2). Do đó ω∈L1 ∪ L2. b) ω∈L1 ∪ L2: ω=ε: tồn tại S1→ε∈P1 hoặc S2→ε∈P2, nên có S→ε∈P. Do đó ω=ε∈L(G). G1 ω≠ε: ω∈L1 hoặc ω∈L2. Nếu ω∈L1 (t.ư. ω∈L2) thì ta có suy dẫn S1 ω (t.ư. G2 S2 ω) với các quy tắc được sử dụng thuộc P1 \ {S1→ε} (t.ư. P2 \ {S2→ε}). Khi G G G G đó, ta có S S1 ω (t.ư. S S2 ω). Do đó ω∈L(G). Vì vậy, L(G)=L1 ∪ L2. 15
  17. Tập quy tắc P của văn phạm G ở trên có thể được xác định như sau mà ta vẫn có L(G)=L1 ∪ L2: P = (P1 \ {S1→ε}) ∪ (P2 \ {S2→ε}) ∪ {S→α | S1→α∈P1 hoặc S2→α∈P2}. 1.3.3. Hệ quả: Nếu L1 và L2 là hai ngôn ngữ chính quy (t.ư. phi ngữ cảnh, cảm ngữ cảnh) thì L1 ∪ L2 cũng là ngôn ngữ chính quy (t.ư. phi ngữ cảnh, cảm ngữ cảnh). n 2n 2n n Thí dụ 14: Cho hai ngôn ngữ L1={a cb | n ≥ 0} và L2={a cb | n ≥ 0} trên bảng chữ Σ = {a, b, c}. Khi đó, L1=L(G1) và L2=L(G2), trong đó G1 = , G2 = . Thật vậy, trong G1, sử dụng n lần (n ≥ 0) quy tắc 1, sau đó sử dụng n lần quy tắc 3, n lần quy tắc 4 và quy tắc 2, ta có: G1 n n G1 n n n 2n S1 A S1B a c(bb) =a cb . G2 2n n Tương tự, trong G2 ta có S2 a cb . Từ đó ta có văn phạm G và G’: G = , G’ = trong đó P = {S1→AS1B, S1→c, A→a, B→bb, S2→CS2D, S2→c, C→aa, D→b, S→S1, S→S2} và P’ = {S1→AS1B, S1→c, A→a, B→bb, S2→CS2D, S2→c, C→aa, D→b, S→AS1B, S→CS2D, S→c}. Ở đây, G1, G2 là hai văn phạm phi ngữ cảnh, G, G’ cũng là hai văn phạm n 2n 2n n phi ngữ cảnh và L(G)=L(G’)=L1 ∪ L2={a cb , a cb | n ≥ 0}. 1.3.4. Định lý: Lớp ngôn ngữ sinh ra bởi văn phạm là đóng đối với phép ghép. Chứng minh: Giả sử L1, L2 là các ngôn ngữ được sinh bởi văn phạm G1, G2 hay L1=L(G1), L2=L(G2). Ta chứng minh tồn tại văn phạm G sao cho L(G)=L1L2. Giả sử G1 = và G2 = . Không mất tính chất tổng quát giả thiết rằng ∆1∩ (Σ2 ∪ ∆2)=∆2∩ (Σ1 ∪ ∆1)=∅. Lấy S∉Σ1∪∆1∪Σ2∪ ∆2. Xét văn phạm G = , trong đó P = (P1 \ {S1→ε}) ∪ (P2 \ {S2→ε}) ∪ {S→S1 | S2→ε∈P2} ∪ {S→S2 | S1→ε∈P1} ∪ {S→ε | S1→ε∈P1 và S2→ε∈P2} ∪ {S→S1S2}. (Ở đây, ta hiểu rằng nếu S1→ε∈P1 (t.ư. S2→ε∈P2) thì S1 (t.ư. S2) không xuất hiện ở vế phải của bất kỳ một quy tắc nào trong P1 (t.ư. P2).) Với văn phạm G này, dễ dàng có được L(G)⊂L1L2 và L1L2⊂L(G). Đặc biệt, khi G1 và G2 là hai văn phạm chính quy thì ta có thể xây dựng văn phạm chính quy G’ như sau sao cho L(G’)=L1L2. a) ε∉L1 và ε∉L2 (tức là S1→ε∉P1 và S2→ε∉P2): Văn phạm chính quy G’ cần tìm là G’ = , trong đó P’= (P1 \ {A→a | A→a∈P1}) ∪ {A→aS2 | A→a∈P1} ∪ P2. 16
  18. b) ε∈L1 và ε∉L2: Đặt L1’=L1 \ {ε} thì theo Bổ đề 1.2.12, ta xây dựng được văn phạm chính quy G1’ sao cho L(G1’)=L1’. Khi đó theo a), ta có văn phạm G’ sao cho L(G’)=L1’L2. Từ L1L2=(L1’∪ {ε})L2=L1’L2 ∪ L2 và từ cách xây dựng văn phạm trong chứng minh của Định lý 1.3.2, ta tìm được văn phạm chính quy G’’ sao cho L(G’’)=L1L2. c) ε∉L1 và ε∈L2: Tương tự trường hợp b). d) ε∈L1 và ε∈L2: Đặt L1’=L1 \ {ε} và L2’=L2 \ {ε} thì ta có: L1L2=(L1’∪ {ε})(L2’∪ {ε})=L1’L2’ ∪ L1’ ∪ L2’ ∪ {ε} và lập luận như trên ta tìm được văn phạm chính quy sinh ra ngôn ngữ L1L2. 1.3.5. Hệ quả: Nếu L1 và L2 là hai ngôn ngữ chính quy (t.ư. phi ngữ cảnh, cảm ngữ cảnh) thì L1L2 cũng là ngôn ngữ chính quy (t.ư. phi ngữ cảnh, cảm ngữ cảnh). n n n Thí dụ 15: 1) Cho hai ngôn ngữ L1={a b | n ≥ 1} và L2={c | n ≥ 1}. Dễ dàng có được L1=L(G1) và L2=L(G2), trong đó G1 = , G2 = . Từ đó ta nhận được văn phạm phi ngữ cảnh G: G = , n n m thoả mãn L(G) = L1L2 = {a b c | n ≥ 1, m ≥ 1}. n n 2) Cho hai ngôn ngữ chính quy L3={ba | n ≥ 0} và L4={b a | n ≥ 0}. Ta có ngay L3=L(G3), L4=L(G4), trong đó G3 và G4 là hai văn phạm chính quy: G3 = , G4 = . Từ đó ta nhận được văn phạm chính quy G’: G’ = , P’ = {S1→bA, A→aA, S1→bS2, A→aS2, S2→bS2, S2→a} n m thoả mãn L(G’) = L3L4 = {ba b a | n ≥ 0, m ≥ 0}. 1.3.6. Định lý: Nếu L là ngôn ngữ chính quy thì lặp L* của L cũng là ngôn ngữ chính quy. Nói một cách khác, lớp các ngôn ngữ chính quy đóng đối với phép toán một ngôi lặp. Chứng minh: Giả sử L=L(G), với G = là văn phạm chính quy. Xét văn phạm G’ = , trong đó P’ = (P \ {S→ε}) ∪ {A→aS | A→a∈P}. * Khi đó G’ là văn phạm chính’ quy. Ta chứng minh L(G’)=L \ {ε}. a) ω∈L(G’): Ta có S G ω với ω≠ε vì S→ε∉P’. Không mất tính chất tổng quát, ta có thể giả thiết ký hiệu đầu S không xuất hiện ở vế phải của bất kỳ quy tắc nào trong P. Giả sử dãy dẫn xuất của ω có sử dụng n-1 quy tắc của P dạng A→aS. Khi đó ta có: 17
  19. S ω1’a1S ω1ω2’a2S ω1ω2 ωn-1’an-1S ω1ω2 ωn-1ωn = ω, ở đây, ωi =ωi’ai. Như vậy, tồn tại các quy tắc A1→a1S, A2→a2S, , An-1→an-1S trong P’ và do đó tồn tại các quy tắc A1→a1, A2→a2, , An-1→an-1 trong P. Ta có S ω1’A1 ω1’a1=ω1, S ω2’A2 ω2’a2=ω2, , S ωn-1’An-1 ωn-1’an-1=ωn-1 là các suy dẫn trong G hay ω1, ω2, , ωn-1∈L(G). Mặt khác suy dẫn S ωn không n * sử dụng một quy tắc nào khác ngoài quy tắc của P, nên ωn∈L(G). Vậy ω∈L ⊂L . * n b) ω∈L \ {ε}: Tồn tại số nguyên dương n sao cho ω∈L hay ω=ω1ω2 ωn-1ωn, trong đó ωi∈L \ {ε}, 1 ≤ i ≤ n. Như vậy trong G có các suy dẫn S ωi’Ai ωi’ai=ωi và cuối các suy dẫn này có sử dụng các quy tắc Ai→ai, 1 ≤ i ≤ n, do đó ta có các quy tắc Ai→aiS trong G’. Từ đó ta có suy dẫn trong G’: S ω1’a1S ω1ω2’a2S ω1ω2 ωn-1’an-1S ω1ω2 ωn-1ωn = ω hay ω∈L(G’). Cuối cùng, theo Bổ đề 1.2.12, L(G) chính quy kéo theo L(G) ∪ {ε} cũng chính quy. 1.3.7. Mệnh đề: Mọi ngôn ngữ hữu hạn đều là ngôn ngữ chính quy. Chứng minh: Ngôn ngữ hữu hạn là hợp hữu hạn của các ngôn ngữ một từ, nên từ Thí dụ 13 (ngôn ngữ một từ là chính quy) và từ Hệ quả 1.3.3 (hợp hữu hạn của các ngôn ngữ chính quy là chính quy), ta có ngôn ngữ hữu hạn là chính quy. Thí dụ 16: Cho ngôn ngữ chính quy L={0, 01, 011, 0111}. Khi đó L sinh bởi văn phạm chính quy G = , trong đó P = {S→0, S→0A, A→1, A→1B, B→1, B→1C, C→1}. Văn phạm chính quy G’ = , trong đó P’ = {S→0, S→0S, S→0A, A→1, A→1S, A→1B, B→1, B→1S, B→1C, C→1, C→1S} * * sinh ra ngôn ngữ L \ {ε}. Do đó văn phạm sinh ra ngôn ngữ L là: G’’ = , trong đó P’’ = {S→0, S’→0, S→0S, S’→0S, S→0A, S’→0A, A→1, A→1S, A→1B, B→1, B→1S, B→1C, C→1, C→1S, S’→ε}. 18
  20. BÀI TẬP CHƯƠNG I: 1. Tìm các ngôn ngữ L1, L2, L3 sao cho: * * * a) (L1L2) ≠ L1 L2 . * * * b) (L1 ∩ L2) ≠ L1 ∩ L2 . * * * c) (L1 ∪ L2) ≠ L1 ∪ L2 . * * * * d) L1(L2 ∩ L3 ) ≠ (L1L2 ) ∩ (L1L3 ). 2. Cho L1, L2, L3 là các ngôn ngữ trên bảng chữ Σ. Chứng minh rằng: a) L1(L2 ∪ L3) = L1L2 ∪ L1L3, (L2 ∪ L3)L1 = L2L1 ∪ L3L1. * * * * b) (L1 L2 ) = (L1 ∪ L2) . 3. Hãy xác định xem các văn phạm dưới đây sinh ra các ngôn ngữ nào? a) G = . b) G = . c) G = . d) G = . 4. Hãy thành lập các văn phạm sinh ra các ngôn ngữ dưới đây: a) L = {ω∈{a}* | |ω| mod 3=0}. b) L = {a2n+1 | n ≥ 0}. * c) L = {ω∈{a, b} | na(ω)>nb(ω)} (nx(ω) là số chữ cái x có mặt trong ω}. d) L = {ambn | n ≥ 0, m ≥ n}. 5. Hãy xây dựng các văn phạm chính quy sinh ra các ngôn ngữ dưới đây trên bảng chữ Σ={0, 1}: a) L = {0ω1 | ω∈Σ*}. b) L = {ω∈Σ* | trong ω chứa đúng một chữ số 1}. c) L = {ω∈Σ* | trong ω chỉ chứa một số lẻ chữ số 0}. d) L = {ω∈Σ* | ω không kết thúc bằng hai chữ số 1}. 6. Hãy tìm văn phạm phi ngữ cảnh sinh ra ngôn ngữ sau: L = {anbm | n ≥ 0, m ≥ 0, n≠m}. 7. Hãy xây dựng các văn phạm chính quy sinh ra các ngôn ngữ dưới đây: a) L = {(baa)m(aab)n | m ≥ 1, n ≥ 1}. b) L = {1}*{010}{0}*. c) L = {010}* ∪ {1100}*. d) L = {ambnck | m ≥0, n ≥0, k ≥0}. 8. Chứng minh rằng lớp ngôn ngữ sinh bởi văn phạm là đóng đối với phép giao. 19
  21. CHƯƠNG II: ÔTÔMAT HỮU HẠN VÀ NGÔN NGỮ CHÍNH QUY 2.1. ÔTÔMAT HỮU HẠN. 2.1.1. Mở đầu: Một ôtômat hữu hạn là một mô hình tính toán thực sự hữu hạn. Mọi cái liên quan đến nó đều có kích thước hữu hạn cố định và không thể mở rộng trong suốt quá trình tính toán. Các loại ôtômat khác được nghiên cứu sau này có ít nhất một bộ nhớ vô hạn về tiềm năng. Sự phân biệt giữa các loại ôtômat khác nhau chủ yếu dựa trên việc thông tin có thể được đưa vào bộ nhớ như thế nào. Một ôtômat hữu hạn làm việc theo thời gian rời rạc như tất cả các mô hình tính toán chủ yếu. Như vậy, ta có thể nói về thời điểm “kế tiếp” khi “đặc tả” hoạt động của một ôtômat hữu hạn. Trường hợp đơn giản nhất là thiết bị không có bộ nhớ mà ở mỗi thời điểm, thông tin ra chỉ phụ thuộc vào thông tin vào lúc đó. Các thiết bị như vậy là mô hình của các mạch tổ hợp. Tuy nhiên, nói chung, thông tin ra sản sinh bởi một ôtômat hữu hạn phụ thuộc vào cả thông tin vào hiện tại lẫn các thông tin vào trước đó. Như vậy ôtômat có khả năng (với một phạm vi nào đó) ghi nhớ các thông tin vào trong quá khứ của nó. Một cách chi tiết hơn, điều đó có nghĩa như sau. Ôtômat có một số hữu hạn trạng thái bộ nhớ trong. Tại mỗi thời điểm i, nó ở một trong các trạng thái đó, chẳng hạn qi. Trạng thái qi+1 ở thời điểm sau được xác định bởi qi và thông tin vào ai cho ở thời điểm i. Thông tin ra ở thời điểm i được xác định bởi trạng thái qi (hay bởi cả ai và qi). 2.1.2. Định nghĩa: Một ôtômat hữu hạn đơn định hay một DFA (Deteministic Finite Automata) là một bộ năm A = , trong đó: − Q là một tập hữu hạn khác rỗng, được gọi là tập các trạng thái; − Σ là một bảng chữ, được gọi là bảng chữ vào; − δ: D ⎯⎯→ Q, trong đó D⊂Q x Σ, được gọi là ánh xạ chuyển; − q0∈Q, được gọi là trạng thái đầu; − F ⊂ Q, được gọi là tập các trạng thái kết thúc. Trong trường hợp D=Q x Σ, ta nói A là đầy đủ. Về sau ta sẽ thấy rằng mọi ôtômat hữu hạn đều đưa về được ôtômat hữu hạn đầy đủ tương đương. 20
  22. Hoạt động của ôtômat hữu hạn đơn định A = khi cho xâu vào ω=a1a2 an có thể được mô tả như sau: Khi bắt đầu làm việc, máy ở trạng thái đầu q0 và đầu đọc đang nhìn vào ô có ký hiệu a1. Tiếp theo máy chuyển từ trạng thái q0 dưới tác động của ký hiệu vào a1 về trạng thái mới δ(q0, a1)=q1∈Q và đầu đọc chuyển sang phải một ô, tức là nhìn vào ô có ký hiệu a2. Sau đó ôtômat A có thể lại tiếp tục chuyển từ trạng thái q1 nhờ ánh xạ chuyển δ về trạng thái mới q2=δ(q1, a2)∈Q. Quá trình đó sẽ tiếp tục cho tới khi gặp một trong các tình huống sau: − Trong trường hợp ôtômat A đọc hết xâu vào ω và δ(qn-1,an)=qn∈F, ta nói rằng A đoán nhận ω. − Trong trường hợp ôtômat A đọc hết xâu vào ω và δ(qn-1,an)=qn∉F hoặc tồn tại chỉ số j (j≤n) sao cho δ(qj-1,aj) không xác định, ta nói rằng A không đoán nhận ω. Q. Khi đó ôtômat dừng lại. Nếu qn∈F thì ta nói rằng ôtômat đã đoán nhận xâu ω. Xâu vào ω: a1 a2 a3 an-1 an q0 q1 q2 qn-2 qn-1 qn 2.1.3. Phương pháp biểu diễn ôtômat hữu hạn đơn định: Ánh xạ chuyển là một bộ phận quan trọng của một ôtômat hữu hạn đơn định. Nó có thể cho dưới dạng bảng chuyển hoặc cho dưới dạng đồ thị. 1) Phương pháp cho bảng chuyển: Trạng Ký hiệu vào thái a1 a2 . an q1 δ(q1,a1) δ(q1,a2) δ(q1,a2) q2 δ(q2,a1) δ(q2,a2) δ(q2,a2) q3 δ(q3,a1) δ(q3,a2) δ(q3,a2) qm δ(qm,a1) δ(qm,a2) δ(qm,a2) trong đó dòng i cột j của bảng là ô trống nếu (qi,aj)∉D, tức là δ(qi,aj) không xác định. 2) Phương pháp cho bằng đồ thị chuyển: Cho ôtômat A = . Ánh xạ chuyển δ có thể cho bằng một đa đồ thị có hướng, có khuyên G sau đây, được gọi là đồ thị chuyển của ôtômat A. Tập đỉnh của G là Q. Nếu a∈Σ và từ trạng thái q chuyển sang trạng thái p do đẳng thức δ(q, a)=p thì sẽ có một cung từ q tới p được gán nhãn a. 21
  23. Đỉnh vào của đồ thị chuyển là đỉnh ứng với trạng thái ban đầu q0. Các đỉnh sẽ được khoanh bởi các vòng tròn, tại đỉnh q0 có mũi tên đi vào, riêng đỉnh với trạng thái kết thúc được khoanh bởi vòng tròn đậm. Thí dụ 1: Cho hai ôtômat hữu hạn đơn định A1 = , trong đó δ(q0, a)=q0, δ(q0, b)=q1, δ(q1, a)=q0, δ(q1, b)=q2, δ(q2, a)=q2, δ(q2, b)=q2 và A2 = , trong đó δ(q0, 0)=q2, δ(q0, 1)=q1, δ(q1, 0)=q3, δ(q1, 1)=q0, δ(q2, 0)=q0, δ(q2, 1)=q3, δ(q3, 0)=q1, δ(q3, 1)=q2. Khi đó các bảng chuyển của A1 và A2 là: Trạng Ký hiệu vào Trạng Ký hiệu vào thái a b thái 0 1 q0 q0 q1 q0 q2 q1 q1 q0 q2 q1 q3 q0 q2 q2 q2 q2 q0 q3 q3 q1 q2 Dãy trạng thái của ôtômat A1 khi cho xâu α=ababbab vào là: a b a b b a b q0 q0 q1 q0 q1 q2 q2 q2∈F. Dãy trạng thái của ôtômat A2 khi cho xâu β=1010100 vào là: 1 0 1 0 1 0 0 q0 q1 q3 q2 q0 q1 q3 q1∉F. Đồ thị chuyển của ôtômat A1: a b b q0 q1 q2 a a b Đồ thị chuyển của ôtômat A2: 1 q0 q1 1 0 0 0 0 1 q2 q3 1 22
  24. Ta có thể mô tả quá trình đoán nhận xâu vào của ôtômat hữu hạn đơn định đầy đủ A bằng thuật toán mô phỏng sau: Đầu vào: − Một xâu ω, kết thúc bởi ký hiệu hết File là eof. − Một ôtômat hữu hạn đơn định đầy đủ A với trạng thái đầu q0 và tập trạng thái kết thúc là F. Đầu ra: “Đúng” nếu A đoán nhận xâu ω. “Sai” nếu A không đoán nhận xâu ω. Thuật toán: Begin S:=q0; C:=ký hiệu tiếp theo; While C eof do begin S:=δ(S, C); C:=ký hiệu tiếp theo; end; if S in F return (True) else return (False); End. Để mô tả hình thức quá trình đoán nhận một từ (xâu vào), người ta đưa vào ánh xạ mở rộng δ’ từ tập con của Q x Σ* vào Q như trong định nghĩa sau. 2.1.4. Định nghĩa: Cho ôtômat hữu hạn đơn định A = . Mở rộng δ’ của δ là một ánh xạ từ tập con của Q x Σ* vào Q được xác định như sau: 1) δ’(q, ε)=q, ∀q∈Q, 2) δ’(q, ωa)=δ(δ’(q, ω), a), ∀a∈Σ, ∀q∈Q, ∀ω∈Σ* sao cho δ’(q, ω) được xác định. Ta có δ’(q, a)=δ’(q, εa) = δ(δ’(q, ε), a) = δ(q, a), ∀a∈Σ, ∀q∈Q. Do đó trên Q x Σ, ta có thể đồng nhất δ’ với δ. Nếu không cần phân biệt, từ đây về sau ta viết δ thay cho δ’. * 2.1.5. Định nghĩa: Cho ôtômat hữu hạn đơn định A = , ω∈Σ và L là một ngôn ngữ trên Σ. Ta nói: − ω được đoán nhận bởi A nếu δ(q0, ω)∈F; * − L được đoán nhận bởi A nếu L={ω∈Σ | δ(q0, ω)∈F} và ký hiệu L là T(A). Lưu ý rằng trong đồ thị chuyển của A, ω∈Σ* được đoán nhận bởi A khi và chỉ khi ω ứng với một đường đi từ đỉnh q0 đến một trong các đỉnh kết thúc. Cụ thể là nếu ω=a1a2 an thì đường đi là (q0, q1, , qn) với cung (qi-1, qi) có nhãn ai 23
  25. (1≤i≤n) và qn∈F. Như vậy, T(A) là tập hợp tất cả các đường đi từ q0 đến các đỉnh kết thúc. 2.1.6. Định nghĩa: Hai ôtômat hữu hạn đơn định A và A’ được gọi là tương đương nếu T(A)=T(A’). Thí dụ 2: Cho ôtômat hữu hạn đơn định: A = , trong đó δ(q0,0)=q0, δ(q0,1)=q1, δ(q1,0)=q3, δ(q1,1)=q2, δ(q2,0)=q2, δ(q2,1)=q2, δ(q3,1)=q3, δ(q4,0)=q2, δ(q4,1)=q3. Đồ thị chuyển của A là: 0 0 1 1 q0 q1 q2 1 0 0 1 1 q3 q4 Trước hết, ta nhận thấy rằng không có đường đi từ q0 đến đỉnh kết thúc q4, do đó ôtômat A tương đương với ôtômat A’ sau: A’ = , trong đó δ(q0,0)=q0, δ(q0,1)=q1, δ(q1,1)=q2, δ(q2,0)=q2, δ(q2,1)=q2. Đồ thị chuyển của A’ là: 0 0 1 1 q0 q1 q2 1 n Các đường đi từ q0 đến đỉnh kết thúc q1 ứng với các xâu 0 1, n≥0. Các đường n * đi từ q0 đến đỉnh kết thúc q2 ứng với các xâu 0 11ω, n≥0, ω∈{0, 1} . Vậy T(A)=T(A’)={0n1, 0n11ω | n≥0, ω∈{0, 1}*}. 2.1.7. Bổ đề: Cho ôtômat hữu hạn đơn định A = . Khi đó ∀ω1, * ω2∈Σ , ∀q∈Q sao cho δ(q, ω1ω2) xác định, ta có: δ(q, ω1ω2) = δ(δ(q, ω1), ω2). Chứng minh: Ta chứng minh đẳng thức trên bằng quy nạp theo độ dài của ω2. Khi d(ω2)=0 hay ω2=ε, ta có δ(δ(q, ω1), ε)=δ(q, ω1)=δ(q, ω1ε). Giả sử đẳng thức đúng * với mọi ω2 có độ dài ≤n. Với ω’2 có độ dài n+1, ta có ω’2=ω2a, với ω2∈Σ , d(ω2)=n, a∈Σ và δ(q, ω1ω’2)=δ(q, ω1ω2a)=δ(δ(q, ω1ω2), a)=δ(δ(δ(q, ω1), ω2), a)= δ(δ(q, ω1), ω2a)=δ(δ(q, ω1), ω’2). Do đó đẳng thức đúng đến n+1. 2.1.8. Định lý: Nếu L là ngôn ngữ được đoán nhận bởi ôtômat hữu hạn đơn định thì tồn tại số tự nhiên n sao cho với mọi α∈L có d(α)≥n đều có thể phân tích dưới dạng α=uvw, trong đó d(uv)≤n, d(v)≥1 và với mọi i∈N, ta có uviw∈L. 24
  26. Chứng minh: Giả sử L=T(A) , với A = là một ôtômat hữu hạn đơn định. Gọi n=|Q|. Ta chứng minh n là số tự nhiên cần tìm. Cho α=a1a2 am∈L với m≥n. Khi đó ∃q1, , qm∈Q sao cho δ(qi-1, ai)=qi, 1≤i≤m và qm∈F. Do m≥n nên trong dãy q0, q1, , qm có ít nhất hai trạng thái trùng nhau. Gọi k là số nhỏ nhất sao cho tồn tại i (i là văn phạm phi ngữ cảnh. Giả sử L=T(A) với A= là một ôtômat hữu hạn đơn định. Với n đủ lớn, α=anbn có d(α)≥|Q|. Theo Định lý 2.1.8, anbn=uvw, trong đó d(uv)≤|Q|, d(v)≥1, uviw∈L, ∀i∈N. − Nếu na(v)>0 và nb(v)=0 thì với i đủ lớn na(v)>nb(v). − Nếu nb(v)>0 và na(v)=0 thì với i đủ lớn nb(v)>na(v). i − Nếu na(v)>0 và nb(v)>0 thì với i=2 ta có a và b xen kẻ nhau trong uv w. Cả ba trường hợp đều mâu thuẫn với uviw∈L. Vậy không tồn tại một ôtômat hữu hạn đơn định nào đoán nhận A. Về sau, ta sẽ thấy rằng điều kiện cần và đủ để một ngôn ngữ được đoán nhận bởi một ôtômat hữu hạn đơn định là chính quy. Do đó hệ quả trên cho biết tồn tại một ngôn ngữ phi ngữ cảnh mà không là ngôn ngữ chính quy, tức là lớp các ngôn ngữ chính quy là con thực sự của lớp các ngôn ngữ phi ngữ cảnh. 25
  27. 2.1.11. Chú ý: Với ôtômat hữu hạn đơn định A= bất kỳ, ta luôn có thể xây dựng một ôtômat hữu hạn đơn định đầy đủ A’ tương đương với A. Thật vậy, lấy S∉Q (do đó S∉F), đặt Q’=Q∪{S} và δ’: Q’ x Σ ⎯⎯→ Q’ xác định bởi: ∀q∈Q, ∀a∈Σ, δ’(q, a)=δ(q, a) nếu δ(q, a) được xác định, δ’(q, a)=S nếu δ(q, a) không được xác định và δ’(S, a)=S. Khi đó A’= là ôtômat hữu hạn đơn định đầy đủ mà T(A’)=T(A). 2.1.12. Định nghĩa: Một ôtômat hữu hạn không đơn định hay một NDFA (Nondeteministic Finite Automata) là một bộ năm A = , trong đó Q, Σ, q0, F như trong Định nghĩa 2.1.2 và δ: Q x Σ ⎯⎯→ P(Q) (P(Q) là tập hợp các tập con của Q) gọi là ánh xạ chuyển. Trong trường hợp δ(q, a)≠∅, ∀q∈Q, ∀a∈Σ, ta nói A là đầy đủ. Nếu δ(q, a)={p1, p2, , pk} thì ta nói rằng ôtômat A ở trạng thái q gặp ký hiệu a thì có thể chuyển đến một trong các trạng thái p1, p2, , pk. Nếu δ(q, a)={p} thì ở trạng thái q gặp ký hiệu a, ôtômat A chỉ chuyển đến một trạng thái duy nhất p. Nếu δ(q, a)=∅ thì ở trạng thái q gặp ký hiệu a, ôtômat A không thể chuyển đến trạng thái nào. Trường hợp này tương tự như δ(q, a) không xác định của ôtômat hữu hạn đơn định. Như vậy, ta thấy rằng một ôtômat hữu hạn đơn định là một trường hợp đặc biệt của một ôtômat hữu hạn không đơn định. Hoạt động của ôtômat hữu hạn không đơn định A = khi cho xâu vào ω=a1a2 an có thể được mô tả như sau: Khi bắt đầu làm việc, máy ở trạng thái đầu q0 và đầu đọc đang nhìn vào ô có ký hiệu a1. Từ trạng thái q0, dưới tác động của ký hiệu vào a1, δ(q0, a1)={p1, , pk}, máy xác định các trạng thái có thể tiếp theo là p1, , pk và đầu đọc chuyển sang phải một ô, tức là nhìn vào ô có ký hiệu a2. Tiếp tục với mỗi pi (1≤i≤k) và ký hiệu tiếp theo là a2, các trạng thái tiếp theo có thể đến được là δ(p1, a2)∪ ∪δ(pk, a2). Quá trình đó sẽ tiếp tục cho tới khi gặp một trong các tình huống sau: − Trong trường hợp tập trạng thái tiếp theo sau khi đọc aj nào đó là rỗng hoặc sau khi đọc ký hiệu an là Q’ mà Q’∩F=∅, ta nói rằng A không đoán nhận ω. − Trong trường hợp tập trạng thái tiếp theo sau khi đọc ký hiệu an là Q’ mà Q’∩F≠∅, ta nói rằng A đoán nhận ω. Một ôtômat hữu hạn không đơn định có thể biểu diễn dưới dạng bảng chuyển hoặc đồ thị chuyển như trong trường hợp ôtômat hữu hạn đơn định. Nếu δ(q, a)={p1, p2, , pk} thì trong đồ thị chuyển có k cung từ q sang p1, , pk cùng một nhãn a. Quá trình đoán nhận một xâu vào ω của một ôtômat hữu hạn không đơn định A có thể biểu diễn bằng một cây có gốc mà gốc là trạng thái đầu q0. Trong cây này, 26
  28. nếu có một đường đi qua một dãy các trạng thái ứng với xâu vào ω từ q0 đến một lá chứa trạng thái kết thúc thì xâu vào này được đoán nhận bởi ôtômat A. Ngược lại, nếu không có một lá nào trong cây chứa trạng thái kết thúc thì ω không được đoán nhận bởi A. Thí dụ 3: Cho ôtômat hữu hạn không đơn định: A = , trong đó δ(q0,0)={q0,q3}, δ(q0, 1)={q0,q1}, δ(q1, 0)=∅, δ(q1, 1)={q2}, δ(q2, 0)={q2}, δ(q2, 1)={q2}, δ(q3, 0)={q4}, δ(q3, 1)=∅, δ(q4, 0)={q4}, δ(q4, 1)={q4}. Cho xâu vào ω=01001. Ta có cây đoán nhận ω như sau: q 0 q0 q3 ∅ q0 q1 ∅ q q 0 3 q 0 q3 ∅ q4 q q 0 1 q4 Trong cây trên có một đường đi từ q0 đến q4∈F nên xâu ω=01001 là xâu được đoán nhận bởi ôtômat A. Đồ thị chuyển của ôtômat A là: 0 0 1 q0 q1 q2 1 q3 1 0 q4 2.1.13. Định nghĩa: Cho ôtômat hữu hạn không đơn định A = . Mở rộng của δ là ánh xạ δ’ từ tập Q x Σ* vào P(Q) được xác định như sau: 1) δ’(q, ε)={q}, ∀q∈Q, 2) δ’(q, ωa)= δ ( p,a) , ∀q∈Q, ∀ω∈Σ*, ∀a∈Σ. p∈δU'(q,ω) 27
  29. Ta có δ’(q, a)=δ’(q, εa)= δ ( p,a)=δ(q, a), ∀q∈Q, ∀a∈Σ. Vì vậy, cũng p∈δU'(q,ε ) như trường hợp ôtômat hữu hạn đơn định, ta có thể sử dụng ký hiệu δ thay cho δ’. 2.1.14. Định nghĩa: Cho ôtômat hữu hạn không đơn định A = , ω∈Σ* và L là một ngôn ngữ trên Σ. Ta nói: − ω được đoán nhận bởi A nếu δ(q0, ω)∩F≠∅; * − L được đoán nhận bởi A nếu L={ω∈Σ | δ(q0, ω)∩F≠∅} và ký hiệu L là T(A). Hai ôtômat hữu hạn không đơn định (hoặc một đơn định một không đơn định) A và A’ được gọi là tương đương nếu T(A)=T(A’). Thí dụ 4: Cho ôtômat hữu hạn không đơn định: A = , trong đó δ(q0, a)={q0}, δ(q0, b)={q0, q1}, δ(q1, a)={q1}, δ(q1, b)={q1, q2}, δ(q2, a)={q2}, δ(q2, b)={q2}. Đồ thị chuyển của A là: a a a b b q0 q1 q2 b b b * T(A)={ω1bω2bω3 | ω1, ω2, ω3∈{a, b} }. 2.2. QUAN HỆ GIỮA ÔTÔMAT HỮU HẠN VÀ NGÔN NGỮ CHÍNH QUY. 2.2.1. Định lý: Nếu ngôn ngữ L được đoán nhận bởi một ôtômat hữu hạn không đơn định thì tồn tại một ôtômat hữu hạn đơn định đoán nhận L. Chứng minh: Giả sử L=T(A), với A = là một ôtômat hữu hạn không đơn định. Xét ôtômat hữu hạn đơn định A’ = , trong đó − Q’ là tập trạng thái mới mà |Q’|=|P(Q)| và ta có thể đồng nhất mỗi phần tử của P(Q) với mỗi phần tử của Q’ như sau: mỗi tập con {p1, p2, , pn}∈P(Q) được đặt tương ứng với phần tử của Q’ ký hiệu t[p1, p2, , pn]; − ∀a∈Σ, ∀t[p1, p2, , pn]∈Q’, δ’(t[p1, p2, , pn], a)=t[r1, r2, , rk] nếu {r1, r2, , rk}=δ(p1, a)∪δ(p2, a)∪ ∪δ(pn, a); − t0=t[q0]; − F’={t[p1, p2, , pn]∈Q’ | {p1, p2, , pn}∩F≠∅}. Ta chứng minh T(A’)=L. Để có điều này, ta chứng minh mệnh đề sau: * ∀ω∈Σ , δ’(t[q0], ω)=t[p1, p2, , pn]⇔δ(q0, ω)={p1, p2, , pn} bằng quy nạp theo độ dài của ω. Nếu d(ω)=0 thì ω=ε, khi đó δ(q0, ε)={q0} và theo định nghĩa δ’(t[q0], ε)=t[q0]. 28
  30. * Giả sử mệnh đề đúng với mọi từ ω1 có d(ω1)≤m (m≥1). Cho ω∈Σ có * d(ω)=m+1. Đặt ω=ω1a, với a∈Σ, ω1∈Σ , d(ω1)=m. Giả sử δ’(t[q0], ω1)=t[p1, , pn]. Khi đó theo định nghĩa của δ’, ta có δ’(t[q0], ω1a)=δ’(δ’(t[q0], ω1), a)=δ’(t[p1, , pn], a). Theo giả thiết quy nạp, δ’(t[q0], ω1)=t[p1, , pn]]⇔δ(q0, ω1)={p1, , pn}. Mặt khác, n δ’(t[p1, , pn], a)=t[r1, r2, , rk]⇔{r1, r2, , rk}= δ ( pi ,a)=δ(q0, ω1a). Ui=1 Vậy mệnh đề đúng đến m+1. Cuối cùng ta có: ω∈T(A’)⇔δ’(t[q0], ω)=t[p1, , pn]∈F’⇔{p1, , pn}∩F≠∅⇔δ(q0, ω)∩F≠∅ ⇔ω∈T(A). Thí dụ 5: Cho ôtômat hữu hạn không đơn định: A = , trong đó δ(q0, a)={q0}, δ(q0, b)={q0, q1}, δ(q1, a)={q0, q1}, δ(q1, b)=∅. Đồ thị chuyển của A là: a b a q0 q1 a b Ta xây dựng ôtômat A’=<Q’, {a, b}, δ’, t0, F’} tương đương với A, trong đó: − Q’={t∅, t[q0], t[q1], t[q0, q1]} − t0=t[q0], − F’={t[q1], t[q0, q1]}, − δ’ được xác định như sau: δ’(t[q0], a)=t[q0], δ’(t[q0], b)=t[q0, q1], δ’(t[q1], a)=t[q0, q1], δ’(t[q1], b)=t∅, δ’(t∅, a)=t∅, δ’(t∅, b)=t∅, δ’(t[q0, q1], a)=t[q0, q1], δ’(t[q0, q1], b)=t[q0, q1]. Đặt t1=t[q1], t2=t[q0, q1], t3=t∅, ta có đồ thị chuyển của A’ là: a a b t t 0 2 b a b t1 t∅ a b 29
  31. Rõ ràng A’ tương đương với ôtômat A’’ có đồ thị chuyển sau: a a b t t 0 2 b và T(A)=T(A’)=T(A’’)={anbω | n≥0, ω∈{a, b}*}. 2.2.2. Định lý: Nếu L là một ngôn ngữ chính quy thì tồn tại một ôtômat hữu hạn không đơn định đoán nhận L. Chứng minh: Giả sử L=L(G), với G= là văn phạm chính quy. Xét ôtômat hữu hạn không đơn định A= , trong đó − Q=∆∪{E}, E∉Σ∪∆; − q0=S; − F={E} nếu S→ε∉P và F={E, S} nếu S→ε∈P; − δ(A, a)={B | A→aB∈P}∪{E | A→a∈P} và δ(E, a)=∅, ∀A∈∆, ∀a∈Σ. Ta chứng minh L=T(A). 1) ω∈L: a) ω=ε: S→ε∈P, do đó S∈F. Trong trường hợp này δ(S, ε)={S} nên ε∈T(A). b) ω=a1a2 an ≠ε: Ta có suy dẫn S a1A1 a1a2A2 a1a2 an-1An-1 a1 an-1an Do đó tồn tại dãy quy tắc S→a1A1, A1→a2A2, , An-1→an trong P. Từ định nghĩa của δ, ta có A1∈δ(S, a1), A2∈δ(A1, a2), , An-1∈δ(An-2, an-1), E∈δ(An-1, an). Như vậy, E∈δ(S, a1a2 an) hay ω∈T(A). 2) ω∈T(A): a) ω=ε: δ(S, ε)∩F≠∅ hay S∈F hay S→ε∈P, do đó ε∈L. b) ω=a1a2 an ≠ε: δ(S, ω)∩F≠∅ với ω≠ε hay E∈δ(S, ω), do đó tồn tại các trạng thái A1, A2, , An-1∈∆ sao cho A1∈δ(S, a1), A2∈δ(A1, a2), , An-1∈δ(An-2, an-1), E∈δ(An-1, an). Từ đó ta có S→a1A1, A1→a2A2, , An-1→an∈P hay trong G có một suy dẫn là S a1A1 a1a2A2 a1a2 an-1An-1 a1 an-1an=ω. Vì vậy ω∈L. Thí dụ 6: Cho ngôn ngữ L={ωabnab | n≥0, ω∈{a, b}*}. Ta có L=L(G) trong đó G= là văn phạm chính quy. Xét ôtômat hữu hạn không đơn định A= , trong đó δ(S, a)={S, A}, δ(S, b)={S}, δ(A, a)={B}, δ(A, b)={A}, δ(B, a)=∅, δ(B, b)={E}, δ(E, a)=∅, δ(E, b)=∅. Đồ thị chuyển của A là: a b a a b S A B E b T(A)=L={ωabnab | n≥0, ω∈{a, b}*}. 30
  32. 2.2.3. Định lý: Nếu L là ngôn ngữ được đoán nhận bởi một ôtômat hữu hạn đơn định thì L là một ngôn ngữ chính quy. Chứng minh: Giả sử L=T(A), với A = là một ôtômat hữu hạn đơn định. Xét văn phạm G= , trong đó P={q→ap | δ(q, a)=p}∪{q→a | δ(q, a)=p∈F}. Khi đó G là một văn phạm chính quy. Ta chứng minh L(G)=L \ {ε}. 1) ω=a1a2 an∈L(G): ω≠ε và tồn tại suy dẫn: q0 a1p1 a1a2p2 a1a2 an-1pn-1 a1 an-1an=ω. Do đó q0→a1p1, p1→a2p2, , pn-1→an-1pn-1, pn-1→an∈P hay ta có p1=δ(q0, a1), p2=δ(p1, a2), , pn-1=δ(pn-2, an-1), pn∈F tức là δ(q0, ω)=pn∈F hay ω∈T(A) \ {ε}=L \ {ε}. 2) ω=a1a2 an∈L \ {ε}: Tồn tại dãy trạng thái p1, p2, , pn sao cho δ(q0, a1)=p1, δ(p1, a2)=p2, , δ(pn-2, an-1)=pn-1, pn∈F. Do đó q0→a1p1, p1→a2p2, , pn-1→an-1pn-1, pn-1→an∈P hay q0 a1p1 a1a2p2 a1a2 an-1pn-1 a1 an-1an=ω hay ω∈L(G). Trong trường hợp ε∈L, ta xây dựng G’ tương đương với G trong đó ký hiệu đầu không xuất hiện trong bất kỳ vế phải của quy tắc nào, đồng thời thêm vào G’ quy tắc q’0→ε (q’0 là ký hiệu đầu của G’) để nhận được văn phạm chính quy G’’ sao cho L(G’’)=L(G’)∪{ε}=L(G)∪{ε}. Thí dụ 7: Cho ôtômat hữu hạn đơn định A= , trong đó δ(q0, 0)=q1, δ(q1, 0)=q2, δ(q1, 1)=q0, δ(q2, 1)=q0. Đồ thị chuyển của A là: 0 0 q0 q1 q2 1 1 T(A)={ω00 | ω∈{01, 001}*} là ngôn ngữ chính quy. 2.2.4. Chú ý: Từ các định lý trên với chú ý là mỗi ôtômat hữu hạn đơn định có thể xem như là một ôtômat hữu hạn không đơn định, ta có thể rút ra kết luận sau. Gọi D là lớp các ngôn ngữ được đoán nhận bởi ôtômat hữu hạn đơn định, N là lớp các ngôn ngữ được đoán nhận bởi ôtômat hữu hạn không đơn định và R là lớp các ngôn ngữ chính quy. Định lý 2.2.1 cho biết N ⊂ D. Định lý 2.2.2 cho biết R ⊂ N. Định lý 2.2.3 cho biết D ⊂ R. Vậy D = N = R. 31
  33. 2.3. BIỂU THỨC CHÍNH QUY. 2.3.1. Định nghĩa: Trên bảng chữ Σ, ta định nghĩa biểu thức chính quy theo các bước đệ quy sau đây: 1) ∅ là biểu thức chính quy, nó biểu diễn ngôn ngữ rỗng. 2) ε là biểu thức chính quy, nó biểu diễn ngôn ngữ {ε}. 3) Nếu a∈Σ thì a là biểu thức chính quy, nó biểu diễn ngôn ngữ {a}. 4) Nếu r, s tương ứng là biểu thức chính quy trên Σ biểu diễn ngôn ngữ R, S thì (r+s) là biểu thức chính quy biểu diễn ngôn ngữ R∪S, (rs) là biểu thức chính quy biểu diễn ngôn ngữ R.S và (r*) là biểu thức chính quy biểu diễn ngôn ngữ R*. Trong biểu thức chính quy, ta có thể bỏ các dấu ngoặc và quy ước thứ tự thực hiện các phép tính là phép lặp, phép ghép, phép hợp. Chẳng hạn, biểu thức chính quy ab*a+ba thay cho biểu thức (((a(b*))a)+(ba). Ngoài ra, nếu không sợ nhầm lẫn, ta có thể sử dụng ký hiệu a thay cho biểu thức chính quy a với mỗi a∈Σ. 2.3.2. Định nghĩa: Hai biểu thức chính quy r và s được gọi là tương đương, ký hiệu r=s, nếu chúng biểu diễn cùng một ngôn ngữ. Với r, s, t là các biểu thức chính quy trên bảng chữ Σ, dễ dàng có được các tương sau: 1) r+s = s+r, 2) (r+s)+t = r+(s+t), 3) r+r = r, 4) (rs)t = r(st), 5) r(s+t) = rs+rt, (s+t)r = sr+tr, 6) ∅* = ε, 7) (r*)* = r*, 8) rr*+ε=r*, 9) (r*s*)* = (r+s)*, Thí dụ 8: Cho biểu thức chính quy (01*+02)1+(0+1)(220*1)*. a) (01*+02)1 = 01*1+021 là biểu thức chính quy biểu diễn ngôn ngữ được đoán nhận bởi ôtômat hữu hạn có đồ thị chuyển là: 1 1 q2 q1 0 1 q0 0 q4 q3 2 32
  34. b) (0+1)(220*1)* là biểu thức chính quy biểu diễn ngôn ngữ được đoán nhận bởi ôtômat hữu hạn có đồ thị chuyển là: q6 2 0 q0 q5 2 1 1 q7 0 Vì vậy, biểu thức chính quy đã cho biểu diễn ngôn ngữ được đoán nhận bởi ôtômat hữu hạn có đồ thị chuyển là: 1 q2 q1 1 q6 0 2 0 q 2 1 0 q5 1 0 1 q 4 2 q3 q7 0 2.3.3. Định lý: Cho L là một ngôn ngữ trên bảng chữ Σ. Khi đó L là một ngôn ngữ chính quy khi và chỉ khi tồn tại một biểu thức chính quy trên Σ biểu diễn L. Chứng minh: Giả sử tồn tại một biểu thức chính quy trên bảng chữ Σ={a1, , an } biểu diễn ngôn ngữ L. Theo định nghĩa của biểu thức chính quy thì L là tập hợp được tạo thành từ các tập cơ sở ∅, {ε}, {a1}, , {an} bằng việc áp dụng một số hữu hạn các phép hợp, ghép, lặp. Vì các tập cơ sở trên là ngôn ngữ chính quy và hợp, ghép, lặp của một số hữu hạn của chúng cũng là ngôn ngữ chính quy. Do đó L là một ngôn ngữ chính quy. Giả sử L là một ngôn ngữ chính quy trên bảng chữ Σ. Khi đó theo Mục 2.2, L=T(A), với A= là một ôtômat hữu hạn đơn định. k Giả sử Q={q0, q1, , qm}. Ký hiệu Rij là tập hợp tất cả các từ mà dưới tác động của chúng, ôtômat A chuyển từ trạng thái qi đến qj, thêm vào đó các trạng thái k mà A đi qua có chỉ số không vượt quá k. Trên đồ thị chuyển của A, Rij là tập hợp các từ ứng với các đường đi từ qi đến qj không đi qua qk+1, , qm. k Một cách hình thức, ta có thể định nghĩa Rij bằng đệ quy như sau: −1 −1 Rij ={a∈Σ | δ(qi, a)=qj}, i≠j; Rii ={a∈Σ | δ(qi, a)=qi}∪{ε}; 33
  35. k k−1 k−1 k−1 * k−1 Rij = Rij ∪ Rik ( Rkk ) Rkj , ∀i, j, k=0, 1, , m. Bằng quy nạp theo k, tồn tại một biểu thức chính quy biểu diễn ngôn ngữ k Rij , ∀i, j=0, 1, , m. Giả sử F={q , q , , q }. Khi đó L=T(A)= R m ∪ R m ∪ ∪ R m (nếu tồn i1 i2 ik 0i1 0i2 0ik m ∗ tại j sao cho ij=0 thì thành phần thứ j của hợp là (R00 ) . Do đó tồn tại biểu thức chính quy biểu diễn ngôn ngữ L. Thí dụ 9: Cho ôtômat hữu hạn không đơn định A có đồ thị chuyển là: 1 q0 q1 0 1 1 1 ∗ 0 0 0 ∗ 0 ∗ Theo chứng minh của Định lý 2.3.3, ta có: T(A)=(R00 ) =(R00 ∪ R01 (R11 ) R10 ) . Từ đồ thị chuyển ta thấy rằng: * 0 − Biểu thức chính quy 1 biểu diễn R00 . * 0 − Biểu thức chính quy 1 1 biểu diễn R01 . * 0 − Biểu thức chính quy 1 01 biểu diễn R11. * 0 − Biểu thức chính quy 1 0 biểu diễn R10 . Vậy T(A) biểu diễn bởi biểu thức chính quy (1*+1*1(1*01)1*0)*=(1*+11*0)*. 2.4. CỰC TIỂU HOÁ ÔTÔMAT HỮU HẠN. Cùng một ngôn ngữ chính quy L, có thể có nhiều ôtômat hữu hạn đoán nhận nó. Nhưng trước hết người ta phải quan tâm đến các ôtômat có số trạng thái ít nhất cùng đoán nhận ngôn ngữ L. Từ đó ta có khái niệm ôtômat tối tiểu. 2.4.1. Định nghĩa: Ôtômat có số trạng thái ít nhất trong các ôtômat hữu hạn đơn định đầy đủ cùng đoán nhận ngôn ngữ L được gọi là ôtômat tối tiểu của ngôn ngữ L. Việc tìm ôtômat tối tiểu M sao cho T(M)=T(A) với A là ôtômat hữu hạn đơn định đầy đủ cho trước gọi là cực tiểu hoá ôtômat hữu hạn A. 2.4.2. Định nghĩa: Cho A = là một ôtômat hữu hạn đơn định đầy * đủ. Trên Σ có quan hệ RA được định nghĩa như sau: * ∀α, β∈Σ , αRAβ ⇔ δ(q0, α) = δ(q0, β). Dễ dàng thấy rằng RA có các tính chất sau: * − RA có tính phản xạ vì ∀α∈Σ , αRAα. * − RA có tính đối xứng vì ∀α, β∈Σ , αRAβ kéo theo βRAα. * − RA có tính bắc cầu vì ∀α, β, γ∈Σ , αRAβ và βRAγ kéo theo αRAγ. * Do đó RA là một quan hệ tương đương, nên quan hệ RA phân hoạch Σ thành các lớp tương đương. Từ định nghĩa của RA, ta thấy rằng mỗi lớp tương đương ứng với một trạng thái. Vì vậy số các lớp tương đương theo RA không lớn hơn số các trạng thái của A. 34
  36. 2.4.3. Định nghĩa: Quan hệ tương đương R trên Σ* được gọi là bất biến phải nếu ∀α, β, γ∈Σ*, αRβ ⇒ αγRβγ. Quan hệ RA như trên là bất biến phải. Thật vậy, * ∀α, β, γ∈Σ , αRAβ ⇒ δ(q0, α) = δ(q0, β) ⇒ δ(q0, αγ) = δ(δ(q0, α), γ)=δ(δ(q0, β), γ) =δ(q0, βγ) ⇒ αγRAβγ. Bây giờ ta xét một quan hệ tương đương bất biến phải khác trên Σ* mà nó được xác định bởi một ngôn ngữ L cho trước như dưới đây. 2.4.4. Định nghĩa: Cho L là một ngôn ngữ trên bảng chữ Σ. Trên Σ* có quan hệ RL được định nghĩa như sau: * * ∀α, β∈Σ , αRLβ ⇔ (∀γ∈Σ , αγ∈L ⇔ βγ∈L). Kiểm tra dễ dàng rằng RL thoả mãn các tính chất phản xạ, đối xứng và bắc cầu, do đó RL là một quan hệ tương đương. Hơn thế nữa, RL cũng bất biến phải. 2.4.5. Định lý: Cho L là một ngôn ngữ trên bảng chữ Σ. Khi đó L là ngôn ngữ * chính quy khi và chỉ khi RL phân hoạch Σ thành một số hữu hạn các lớp tương đương. Chứng minh: Giả sử L là một ngôn ngữ chính quy. Khi đó tồn tại một ôtômat hữu hạn đơn định đầy đủ A = sao cho L=T(A). * * * Xét quan hệ RA trên Σ . Với α, β∈Σ sao cho αRAβ thì ∀γ∈Σ ta có αγ∈L ⇔ δ(q0, αγ)∈F ⇔ δ(q0, βγ)∈F ⇔ βγ∈L. Điều này có nghĩa là αRLβ. Như vậy, αRAβ kéo theo αRLβ hay quan hệ RA mịn hơn quan hệ RL. Do đó số lớp tương đương theo quan hệ RL không lớn hơn số lớp tương đương theo quan hệ RA, mà số này là hữu hạn nên số lớp tương đương theo quan hệ RL là hữu hạn. Bây giờ giả sử L là một ngôn ngữ trên bảng chữ Σ mà số lớp tương đương theo quan hệ RL là hữu hạn. Ta xây dựng một ôtômat hữu hạn đơn định đầy đủ là A = , trong đó: * * − Q={[α] | α∈Σ } ([α]={β∈Σ | αRLβ} là lớp tương đương theo quan hệ RL); − q0=[ε]; − δ: Q x Σ ⎯⎯→ Q cho bởi δ([α], a)=[αa] (do RL là bất biến phải nên nếu αRLβ thì αaRLβa, do đó định nghĩa của δ là tốt). − F={[α] | ∃β∈[α], β∈L}. Khi đó nếu [α]∈F thì ∀γ∈[α], ta có γ∈L. Thật vậy, với β∈[α], β∈L, ta có βRLγ, từ đó do β=βε∈L nên γ=γε∈L. Ngoài ra, ta có T(A)=L. Thật vậy, ω∈T(A) ⇔ δ([ε], ω)=[εω]=[ω]∈F ⇔ ω∈L. Thí dụ 10: Cho A là một ôtômat hữu hạn đơn định đầy đủ có đồ thị chuyển được cho dưới đây: 35
  37. 1 1 0 0 q q q 1 2 3 1 1 q 0 1 0 0 0 1 0 q q 4 5 1 q6 0 * Ký hiệu Ci là lớp tương đương xác định bởi qi, nghĩa là Ci = {α∈Σ | δ(q0, α)=qi}. C0 = {ε}, * C1 = 11 , * C2 = 11 0, * * * C3 = 11 001 +0011 , C4 = 0, * * * * * C5 = (01+000+11 01+11 001 0+0011 0)(0+1) , C6 = 00. * * * * * Dễ dàng thấy rằng T(A) = C3∪C6=0011 +00+11 001 =1 001 . * * Với L=T(A)=1 001 , ta tìm các lớp tương đương theo quan hệ RL. Với α, * β∈{0, 1} , αRLβ khi và chỉ khi một trong các mệnh đề dưới đây thoả mãn: a) α và β không chứa số 0. b) α và β chứa đúng một chữ số 0 ở cuối. c) α và β chứa đúng hai chữ số 0 liên tiếp nhau. d) α và β hoặc là chỉ chứa một chữ số 0 không phải ở cuối câu, hoặc là hai chữ số 0 không đứng cạnh nhau, hoặc chứa nhiều hơn 2 chữ số 0. Khi đó các lớp tương đương theo quan hệ RL là: * [ε] = C0∪C1 = ε+11 , * [0] = C2∪C4 = 11 0+0, * * * [00] = C3∪C6 = 11 001 +0011 +00, * * * * * [000] = C5 = (01+000+11 01+11 001 0+0011 0)(0+1) . Trên cơ sở chứng minh của Định lý 2.4.5, ta có ôtômat hữu hạn đơn định: M = <{[ε], [0], [00], [000]}, {0, 1}, δ, [ε], {[00]}, trong đó, δ([ε], 0)=[0], δ([ε], 1)=[ε], δ([0], 0)=[00], δ([0], 1)=[000], δ([00], 0)=[000], δ([00], 1)=[00], δ([000], 0)=[000], δ([000], 1)=[000]. Đồ thị chuyển của M là: 36
  38. 0 0 [0] [00] 1 [ε] 1 0 1 0 [000] 1 T(M) = T(A) = 1*001*. Lưu ý rằng hai ôtômat được xem là như nhau nếu có một phép đổi tên các trạng thái sao cho hai đồ thị chuyển của chúng là giống nhau. 2.4.6. Định lý: Nếu L là một ngôn ngữ chính quy thì tồn tại duy nhất một ôtômat hữu hạn đơn định tối tiểu đoán nhận L. Chứng minh: Gọi M = là ôtômat hữu hạn đơn định đoán nhận ngôn ngữ L được xây dựng như trong Định lý 2.4.5. Cho A là ôtômat hữu hạn đơn định đầy đủ tuỳ ý đoán nhận L. Khi đó số trạng thái của A không ít hơn số lớp tương đương theo quan hệ RA và do đó không ít hơn số lớp tương đương theo quan hệ RL, tức là số trạng thái của M. Giả sử A’ = là ôtômat hữu hạn đơn định đoán nhận L có số trạng thái bằng số trạng thái của M. ∀q’∈Q’, do số lớp tương đương theo quan * hệ RA’ bằng số trạng thái của A’, nên ∃ω∈Σ sao cho δ’(q’0, ω)=q’. Đặt q=δ(q0, ω). * Nếu ∃α∈Σ sao cho δ’(q’0, ω)=δ’(q’0, α)=q’ thì ωRA’α. Từ sự bằng nhau giữa số lớp tương đương theo RA’ và theo RL, ta suy ra ωRLα. Do đó ta có: δ([ε], ω) = [ω] = [α] = δ([ε], α) (ở đây q0=[ε]). Bằng phương pháp như vậy, ta có thể đồng nhất các trạng thái của M với các trạng thái của A’. Chính xác hơn, tồn tại song ánh f từ Q’ lên Q thoả mãn: * f(δ’(q’0, α)) = δ(q0, α), ∀α∈Σ . Điều này cho biết hai ôtômat M và A’ được xem là như nhau và M là ôtômat hữu hạn đơn định tối tiểu duy nhất đoán nhận L. 2.4.7. Định nghĩa: Trạng thái q của ôtômat hữu hạn đơn định đầy đủ A= được gọi là đến được nếu ∃ω∈Σ sao cho δ(q0, ω)=q. Khi đó mỗi lớp tương đương theo quan hệ RA có thể được đồng nhất với một trạng thái đến được. 2.4.8. Chú ý: Cho A= là một ôtômat hữu hạn đơn định đầy đủ đoán nhận ngôn ngữ chính quy L trên bảng chữ Σ. Chúng ta sẽ chỉ ra phương pháp tìm ôtômat hữu hạn đơn định tối tiểu M đoán nhận L. Để tìm các trạng thái của M, ta cần tìm các lớp tương đương theo quan hệ RL, mà mỗi lớp tương đương theo RL lại là hợp của một số lớp tương đương theo quan hệ RA. Do ta đồng nhất mỗi lớp tương đương theo RA với một trạng thái đến được của A nên ta sẽ xây dựng một 37
  39. quan hệ tương đương trên tập hợp K tất cả các trạng thái đến được mà quan hệ này có thể đồng nhất với RL. Trên tập hợp K xét quan hệ ≡ sau: ∀p,q∈K, p≡q ⇔ (∀γ∈Σ*, δ(p, γ)∈F ⇔ δ(q, γ)∈F). Rõ ràng ≡ là một quan hệ tương đương trên K. * ∀p,q∈K, ∃α, β∈Σ sao cho p=δ(q0, α) và q=δ(q0, β). Khi đó ta có: * p≡q ⇔ (∀γ∈Σ , δ(δ(q0, α), γ)∈F ⇔ δ(δ(q0, β), γ)∈F) * ⇔ (∀γ∈Σ , δ(q0, α γ)∈F ⇔ δ(q0, β γ)∈F) ⇔ (∀γ∈Σ*, α γ∈L ⇔ βγ∈L) ⇔ αRLβ. Tập K các trạng thái đến được có thể nhận được như sau. Đặt K0={q0}, K1=K0∪{δ(q0, a) | a∈Σ}. Nếu K1≠K0, đặt K2=K1∪{δ(p, a) | a∈Σ, p∈K1 \ K0}. Tương tự như vậy, ta có thể tìm được Kj+1 thông qua Kj (j≥0). Nếu tồn tại i sao cho Ki+1=Ki thì ta có K=Ki. Bây giờ ta tìm các lớp tương đương theo quan hệ ≡ trên K bằng thuật toán như dưới đây. 1. Chọn ra các cặp trạng thái (p, q) mà p∈F và q∉F. Gán số 0 cho các cặp này và đánh dấu mỗi cặp bằng dấu *. 2. Chọn ra các cặp (p, q) mà nó chưa được đánh dấu và xét các cặp (δ(p, a), δ(q, a)) với mỗi a∈Σ. Nếu trong số các cặp này tìm thấy một cặp đã được đánh dấu thì ta đánh dấu cặp (p, q). Thêm vào đó, nếu đối với cặp đã chọn (δ(p, a), δ(q, a)) đã được gán số k thì ta gán số k+1 cho cặp (p, q). Ngược lại, nếu không tìm thấy cặp được đánh dấu * thì ta xếp cặp (p, q) cùng với các cặp (δ(p, a), δ(q, a)) thành danh sách riêng biệt. 3. Nếu một cặp (p, q) đã được đánh dấu * và được gán số k thì ta đánh dấu * tất cả các cặp mà trước đó ta đã xếp chúng vào danh sách riêng đối với (p, q) và chưa được gán bởi một số nào, ta gán số k−1 cho mỗi cặp đã ký hiệu. 4. Lặp lại Bước 2 cho đến khi không còn các cặp (p, q) không được đánh dấu * mà chưa được đưa ra xét. Ta sẽ chứng tỏ rằng các trạng thái p, q∈K là không tương đương (theo quan hệ ≡) khi và chỉ khi trong quá trình trên, cặp (p, q) bị đánh dấu *. Trước hết, giả sử p và q không tương đương và γ∈Σ* sao cho δ(p, γ)∈F và δ(q, γ)∉F. Bằng quy nạp theo độ dài của γ, ta chỉ ra rằng cặp (p, q) được đánh dấu *. Nếu γ=ε thì δ(p, ε)=p, δ(q, ε)=q, nên cặp (p, q) được đánh dấu *. Giả sử mệnh đề đúng đối với mọi cặp trạng thái mà chúng được chỉ ra là không tương đương với nhau bằng một từ có độ dài nhỏ hơn n. Lấy γ∈Σ* mà d(γ)=n, ta có γ=aγ’, với a∈Σ và γ’∈Σ* mà d(γ’)<n. Giả sử δ(p, a)=r, δ(q, a)=s. Khi đó r, s được chỉ ra là không 38
  40. tương đương bằng từ γ’, nên theo giả thiết quy nạp (r, s) đã được đánh dấu *, do đó cặp (p, q) được đánh dấu *. Bây giờ giả sử cặp (p, q) đã được đánh dấu *. Ta cần chứng tỏ các trạng thái p và q là không tương đương. Bằng quy nạp theo số k gán cho cặp (p, q), ta có thể chứng minh điều này. Khi k=0, ta có p∈F và q∉F, điều này có nghĩa là các trạng thái p và q là không tương đương. Giả sử mệnh đề đúng đối với mọi cặp được gán với số h , trong đó: − Q’={[q] | q∈K} ([q] là lớp tương đương theo quan hệ ≡), − F’={[q] | q∈F}, − δ’: Q’ x Σ ⎯⎯→ Q’ cho bởi δ’([q], a)=[δ(q, a)]. Bằng quy nạp theo độ dài của từ ω, dễ dàng có được δ’([q], ω)=[δ(q, ω)]. Từ đó suy ra T(M)=T(A)=L. Vậy M là ôtômat hữu hạn đơn định tối tiểu đoán nhận L. Thí dụ 11: Cho ôtômat hữu hạn đơn định đầy đủ A = , trong đó δ(q0, a)=q4, δ(q0, b)=q6, δ(q1, a)=q2, δ(q1, b)=q0, δ(q2, a)=q2, δ(q2, b)=q2, δ(q3, a)=q3, δ(q3, b)=q2, δ(q4, a)=q2, δ(q4, b)=q5, δ(q5, a)=q5, δ(q5, b)=q5, δ(q6, a)=q6, δ(q6, b)=q7, δ(q7, a)=q3, δ(q7, b)=q5. Đồ thị chuyển của A là: a a b a q1 q2 q3 b b a a a b b q0 q4 q5 a b b b a q6 q7 Trước hết, ta tìm các trạng thái đến được của A. Ta có: 39
  41. K0={q0},K1={q0, q4, q6},K2={q0, q4, q6, q2, q5, q7}, K4=K3={q0, q4, q6, q2, q5, q7,q3}. Trên cơ sở Bước 1, ta đánh dấu các cặp trạng thái sau: (q0, q2), (q0, q3), (q0, q5), (q0, q6), (q0, q7), (q4, q2), (q4, q3), (q4, q5), (q4, q6), (q4, q7). Vì δ(q0, a)=q4, δ(q4, a)=q2 và (q4, q2) đã được đánh dấu nên ta đánh dấu (q0, q4). Tương tự như vậy đối với các cặp khác. Kết quả có được trong bảng sau: q7 q6 q5 q4 * * * q3 * q2 * q0 * * * * * * Các trạng thái đến được chia thành các lớp tương đương sau: [q0] = {q0}, [q2] = {q2, q3, q5, q6, q7}, [q4] = {q4}. Vậy ôtômat hữu hạn đơn định tối tiểu đoán nhận L=T(A) là: M = , trong đó, δ’([q0], a)=[δ(q0, a)]=[q4], δ’([q0], b)=[δ(q0, b)]=[q2], δ’([q2], a)=[δ(q2, a)]=[q2], δ’([q2], b)=[δ(q2, b)]=[q2], δ’([q4], a)=[δ(q4, a)]=[q2], δ’([q4], b)=[δ(q4, b)]=[q2]. Đồ thị chuyển của M là: [q4] a [q ] a b 0 b b [q2] a T(M) = T(A) = (b+aa+ab)(a+b)*. 40
  42. BÀI TẬP CHƯƠNG II: 1. Hãy xây dựng các ôtômat hữu hạn có đồ thị chuyển sau và xác định các ngôn ngữ được đoán nhận bởi chúng. 0 a) 0 0 1 q0 q1 q2 q3 1 1 1 a b b) q0 q1 a c) q1 b b a b q0 a a q2 2. Hãy xây dựng các ôtômat hữu hạn đơn định đoán nhận các ngôn ngữ sau: a) L = {anbm | n≥1, m≥1}. b) L = {ω∈{0, 1}* | ω bắt đầu đúng 3 chữ số 0}. c) L = {ω∈{0, 1}* | ω không bắt đầu bởi hai chữ số 1 liên tiếp}. d) L = {(01)n, (101)n | n≥0}. e) L = {(aab)n(baa)m | n≥1, m≥1}. 3. Chứng minh rằng không tồn tại ôtômat hữu hạn đơn định nào đoán nhận các ngôn ngữ sau: a) L = {ωω | ω∈{a, b}*}. b) L = {ap | p là một số nguyên tố}. 4. Hãy xây dựng các ôtômat hữu hạn không đơn định đoán nhận các ngôn ngữ sau: * a) L = {ω1abaω2 | ω1, ω2∈{a, b} }. b) L = {ω∈{0, 1}* | ω bắt đầu bằng luỹ thừa dương của 101}. c) L = {(1111)nω | ω∈{0, 1}*, n≥0}. 5. Hãy thành lập các văn phạm chính quy sinh ra các ngôn ngữ mà được đoán nhận bởi các ôtômat hữu hạn không đơn định sau: a) A = , trong đó δ(q0, a)={q0, q1}, δ(q0, b)={q0, q1}, δ(q1, a)=∅, δ(q1, b)={q2}, δ(q2, a)={q2}, δ(q2, b)={q2}, δ(q3, a)={q4}, δ(q3, b)=∅, δ(q4, a)={q4}, δ(q4, b)={q4}. b) A = , trong đó 41
  43. δ(q0, 0)={q0, q1}, δ(q0, 1)={q1}, δ(q1, 0)=∅, δ(q1, 1)={q0, q1}. 6. Hãy xây dựng các ôtômat hữu hạn đơn định đoán nhận các ngôn ngữ mà được sinh bởi các văn phạm chính quy sau: a) G= . b) G= . * 7. Cho k là một số nguyên dương và Lk = {ω∈{1} | d(ω)=nk, n=1, 2, }. Chứng minh rằng Lk có thể được biểu diễn bởi một biểu thức chính quy. Hãy cho các ôtômat hữu hạn đơn định đoán nhận L2, L3, L5. n n 8. Cho L = {0 1 | n≥0}. Hãy xác định các lớp tương đương theo quan hệ RL và từ đó suy ra L không là ngôn ngữ chính quy. 9. Hãy thay các biểu thức chính quy sau bằng biểu thức tương đương, đơn giản hơn, trong đó không chứa phép cộng: a) E = 00+0011*+1*1001*. b) E = 100*100*+1100*+100*1+11. 10. Hãy xây dựng các ôtômat hữu hạn đơn định đoán nhận các ngôn ngữ được biểu diễn bởi các biểu thức chính quy sau: a) bba(a+b)*. b) (a+b)*bab. c) (bb+a)*(aa+b)*. d) (ε+1+11)(01)*. e) (0+1)(0+1)(0+1)*. 11. Hãy cực tiểu hoá ôtômat hữu hạn đơn định sau: A = , trong đó: δ(q0, 0)=q1, δ(q0, 1)=q3, δ(q1, 0)=q7, δ(q1, 1)=q1, δ(q2, 0)=q0, δ(q2, 1)=q5, δ(q3, 0)=q5, δ(q3, 1)=q9, δ(q4, 0)=q1, δ(q4, 1)=q7, δ(q5, 0)=q8, δ(q5, 1)=q4, δ(q6, 0)=q3, δ(q6, 1)=q8, δ(q7, 0)=q8, δ(q7, 1)=q7, δ(q8, 0)=q7, δ(q8, 1)=q8, δ(q9, 0)=q8, δ(q9, 1)=q9. 42
  44. CHƯƠNG III: ÔTÔMAT ĐẨY XUỐNG VÀ NGÔN NGỮ PHI NGỮ CẢNH Đối với các lớp văn phạm được phân loại theo Chomsky, lớp văn phạm phi ngữ cảnh có vai trò quan trọng nhất trong việc ứng dụng để xây dựng các ngôn ngữ lập trình và chương trình dịch. Trong quá trình dịch từ chương trình nguồn ra chương trình đích, người ta sử dụng cấu trúc cú pháp của văn phạm phi ngữ cảnh để phân tích các xâu vào. Cấu trúc cú pháp của một xâu vào được xác định từ dãy các quy tắc suy từ xâu đó. Dựa vào dãy các quy tắc đó, bộ phân tích cú pháp của chương trình dịch sẽ cho biết xâu vào đang xét có thuộc vào xâu do văn phạm phi ngữ cảnh sinh ra hay không. Nói cách khác là với xâu vào ω và một văn phạm phi ngữ cảnh G, hỏi xem ω∈L(G) hay không? Nếu có thì hãy tìm cách biểu diễn ω bằng văn phạm, tức là tìm các quy tắc sinh của văn phạm G để sinh ra xâu ω. 3.1. VĂN PHẠM PHI NGỮ CẢNH VÀ CÂY SUY DẪN CỦA NÓ. 3.1.1. Định nghĩa: Cho văn phạm phi ngữ cảnh G= . Cây suy dẫn trong văn phạm G là một cây có gốc thoả mãn bốn yêu cầu sau: 1. Ở mỗi đỉnh được gán một nhãn. Nhãn gán ở đỉnh là các ký hiệu trong tập Σ∪∆. Gốc của cây được gán nhãn là S. 2. Mỗi đỉnh trong được gán nhãn là một ký hiệu nào đó trong ∆. 3. Mỗi đỉnh ngoài (lá của cây) được gán nhãn là một ký hiệu trong tập Σ. 4. Nếu đỉnh m được gán nhãn là A∈∆, còn các đỉnh n1, n2, , nk là các con của đỉnh m theo thứ tự từ trái sang phải và được gán nhãn B1, B2, , Bk tương ứng thì A→B1B2 Bk là một quy tắc trong P của văn phạm G. Nếu đọc tất cả nhãn ở các lá theo thứ tự từ trái sang phải, ta sẽ nhận được một từ nào đó. Từ đó sẽ là một phần tử trong L(G) và được gọi là kết quả của cây suy dẫn trong G. Thí dụ 1: Cho các văn phạm phi ngữ cảnh: G1= , G2= , G3= , G4= . Cây suy dẫn của từ b+(a+c)∗b trong G1 là: 43
  45. S S + S b A ∗ A ( S + S ) b a c n n m Cây suy dẫn của từ a b a trong G2 là: S S a m lần a S A a a A b a A b n lần A a A b a A b a b R Cây suy dẫn của từ ωω =a1a2 anan a2a1 trong G3 là: 44
  46. S a1 S a1 a2 S a 2 S an-1 S an-1 an an Hai cây suy dẫn của từ ω=if b then for c do if b then a else a trong G3 là: S S if b then A if b then A else S for c do S for c do S a if b then A else S if b then A a a a 3.1.2. Định lý: Cho G= là văn phạm phi ngữ cảnh và ω∈Σ* \ {ε}. Khi đó ω∈L(G) khi và chỉ khi tồn tại một cây suy dẫn trong G có kết quả là ω. Chứng minh: Do ω≠ε nên ta có thể giả thiết rằng S→ε∉P. Bây giờ với mọi A∈∆, đặt GA= , ta có GA là văn phạm phi ngữ cảnh. Ta sẽ chứng tỏ rằng ω∈L(GA) khi và chỉ khi tồn tại một cây suy dẫn trong GA có kết quả là ω. Giả sử ω là kết quả của một cây suy dẫn trong GA và n là số ký hiệu không kết thúc trong cây. Bằng quy nạp theo n, ta sẽ chỉ ra rằng ω∈L(GA). Nếu tổng số ký hiệu không kết thúc trong cây là 1, ký hiệu này phải là A và là gốc của cây, do đó các con của A phải là các đỉnh được gán bởi các ký hiệu kết 45
  47. thúc, chẳng hạn b1, b2, , bk. Theo định nghĩa của cây suy dẫn, ta có A→b1b2 bk hay A ω. Giả sử mệnh đề đúng với mọi cây suy dẫn có số ký hiệu không kết thúc là n−1. Xét một cây suy dẫn trong GA có kết quả là ω và trong cây có n ký hiệu không kết thúc. Gọi các con của A theo thứ tự từ trái sang phải là B1, B2, , Bk. Nếu các đỉnh này đều là lá thì cây gốc A chỉ có một đỉnh có ký hiệu không kết thúc. Giả sử trong các đỉnh này có các đỉnh trong là C1, C2, , Cm. Xét các cây con mà gốc của nó là C1, C2, ,Cm. Gọi αi là kết quả của cây suy dẫn gốc Ci. Theo giả thiết quy nạp, αi∈L(Gi). Vì tập các quy tắc trong GCi chứa trong tập các quy tắc trong GA nên ta có các suy dẫn trong GA là C1 α1, C2 α2, , Cm αm. Sử dụng các suy dẫn này và quy tắc A→B1B2 Bk, ta nhận được: A B1B2 Bk ω1C1ω2C2 ωmCmωm+1 ω1α1ω2α2 ωmαmωm+1. Do kết quả của cây suy dẫn trong GA là ω nên ω=ω1α1ω2α2 ωmαmωm+1 hay ω∈L(GA). Đảo lại, ta cần chứng minh rằng nếu có suy dẫn A ω (ω≠ε) trong GA thì có thể xây dựng một cây suy dẫn trong GA có kết quả là ω. Mệnh đề này được chứng minh bằng quy nạp theo độ dài của suy dẫn. Trước hết, nếu A ω=b1b2 bk (suy dẫn một bước) thì có thể xây dựng một cây có gốc là A và các con từ trái sang phải lần lượt là b1, b2, , bk. Giả sử mệnh đề đúng với mọi suy dẫn có độ dài không lớn hơn n. Cho suy dẫn trong GA là A ω có độ dài n+1. Giả sử quy tắc đầu tiên trong suy dẫn này là A→B1B2 Bk và C1, C2, , Cm là các ký hiệu không kết thúc trong các Bi (1≤i≤k), có nghĩa là B1B2 Bk=ω1C1ω2C2 ωmCmωm+1, ở đây Ci αi có độ dài không vượt quá n. Theo giả thiết quy nạp, tồn tại các cây Ti của GCi mà kết quả của nó là αi và do đó ta có thể xây dựng trong GA cây suy dẫn có kết quả là ω như sau: S . C1 . C2 . Cm . ω1 ω2 ωm+1 . α α1 2 αm 3.1.3. Định nghĩa: Cho văn phạm phi ngữ cảnh G= . Ta nói văn phạm G là nhập nhằng hay đa nghĩa nếu tồn tại một xâu ω là kết quả của hai cây suy dẫn khác nhau trong G. 46
  48. Trong trường hợp ngược lại, ta nói G là không nhập nhằng hay đơn nghĩa. Một văn phạm phi ngữ cảnh được gọi là nhập nhằng vĩnh cửu nếu không tồn tại văn phạm phi ngữ cảnh đơn nghĩa nào tương đương với nó. Ngôn ngữ do văn phạm G sinh ra gọi là ngôn ngữ nhập nhằng nếu G là văn phạm nhập nhằng. Thí dụ 2: Văn phạm phi ngữ cảnh sau là nhập nhằng: G = , vì xâu ω=b+a∗b+a có hai suy dẫn trái khác nhau trong G. S S S + S S ∗ S b S ∗ S S + S S + S a S + S b a b a b a Cùng với văn phạm G ở trên, văn phạm G’ = là đơn nghĩa và L(G’)=L(G). Trong một văn phạm phi ngữ cảnh có thể có nhiều yếu tố thừa, chẳng hạn có những ký hiệu không hề tham gia vào quá trình sinh các ngôn ngữ, hoặc có những quy tắc dạng A→B chỉ làm mất thời gian trong quá trình hình thành các xâu của ngôn ngữ. Vì lẽ đó cần loại bỏ những yếu tố dư thừa không có ích trong việc sinh ngôn ngữ, sao cho việc loại bỏ đó không làm ảnh hưởng tới quá trình sinh ngôn ngữ. Điều đó có nghĩa là chỉ cần giữ lại các ký hiệu và các quy tắc có ích trong văn phạm G mà chúng thực sự là cần thiết trong quá trình sinh ngôn ngữ mà thôi. 3.1.4. Định nghĩa: Cho văn phạm phi ngữ cảnh G= . X được gọi là ký hiệu có ích nếu tồn tại suy dẫn S αXβ ω, trong đó α, β∈(Σ∪∆)*, X∈Σ∪∆ và ω∈Σ*. Nếu ký hiệu X không thoả mãn điều kiện trên thì X được gọi là ký hiệu thừa. Như vậy X là ký hiệu thừa nếu từ X không thể dẫn ra một xâu ω∈Σ*. Ký hiệu X có tính chất như thế còn được gọi là ký hiệu vô sinh. Nếu từ ký hiệu đầu S không dẫn được một xâu nào có chứa ký hiệu X thì ta nói ký hiệu X là ký hiệu không đến 47
  49. được. Như vậy một ký hiệu là thừa nếu nó là ký hiệu vô sinh hoặc là không đến được. 3.1.5. Bổ đề (loại ký hiệu vô sinh): Cho văn phạm phi ngữ cảnh G= với L(G)≠∅. Khi đó tồn tại văn phạm phi ngữ cảnh G’= tương đương với G sao cho mỗi A∈∆’ có một xâu ω∈Σ* để A ω. Chứng minh: Từ tập quy tắc P của G, ta xây dựng ∆’ như sau: − Nếu trong P có quy tắc dạng A→ω với A∈∆, ω∈Σ* thì kết nạp A vào ∆’. − Nếu A→X1X2 Xn là quy tắc trong P mà Xi∈Σ hoặc Xi là biến đã được kết nạp vào ∆’ thì đưa A vào ∆’. Cứ tiếp tục xét các quy tắc trong P, ta sẽ xây dựng các ký hiệu cho tập ∆’. Vì P là hữu hạn nên quá trình sẽ được dừng lại sau một số hữu hạn bước. Khi đó ta xây dựng được tập ∆’. Ta xây dựng tiếp tập quy tắc P’ gồm các quy tắc trong P mà các ký hiệu có mặt trong đó đều thuộc tập Σ∪∆’. 3.1.6. Bổ đề (loại ký hiệu không đến được): Cho văn phạm phi ngữ cảnh G= . Khi đó tồn tại văn phạm phi ngữ cảnh G’= tương đương với G sao cho mỗi X∈Σ’∪∆’ có α, β∈(Σ’∪∆’)* để cho S αXβ. Chứng minh: Xây dựng tập Σ’ và ∆’ như sau: Đưa ký hiệu S vào ∆’. Nếu một biến A đã được kết nạp vào ∆’ và A→α, ở đây α∈(Σ’∪∆’)* thì ta kết nạp các ký hiệu biến trong α vào ∆’, còn các ký hiệu kết thúc trong α thì kết nạp vào Σ’. Thủ tục kết nạp trên sẽ ngừng khi không còn bổ sung thêm được bất kỳ ký hiệu nào nữa vào các tập Σ’ và ∆’. Tập quy tắc P’ được xây dựng như sau: P’ bao gồm mọi quy tắc trong P mà các ký hiệu thuộc tập Σ’∪∆’. Với cách xây dựng đó, ta có L(G)=L(G’), trong đó G’ gồm các ký hiệu đến được. Từ hai bổ đề trên ta có: 3.1.7. Định lý: Mọi ngôn ngữ phi ngữ cảnh khác rỗng đều có thể được sinh ra từ một văn phạm phi ngữ cảnh không có ký hiệu thừa. 3.1.8. Định nghĩa: Cho văn phạm phi ngữ cảnh G= . Quy tắc trong P có dạng A→B, ở đây A, B∈∆, được gọi là quy tắc đơn hay phép đổi tên. Quy tắc đơn có tác dụng làm kéo dài quá trình sinh ra ngôn ngữ, vì vậy ta sẽ tìm cách loại quy tắc đơn mà không làm ảnh hưởng tới quá trình sinh ra ngôn ngữ của văn phạm đã cho. Lưu ý rằng quy tắc A→a, với A∈∆ và a∈Σ không phải là quy tắc đơn. 48
  50. 3.1.9. Định lý: Đối với mọi văn phạm phi ngữ cảnh mà trong tập các quy tắc của nó có quy tắc đơn thì tồn tại một văn phạm phi ngữ cảnh tương đương với nó mà trong tập các quy tắc của nó không chứa quy tắc đơn. Chứng minh: Giả sử G= là văn phạm phi ngữ cảnh có chứa quy tắc đơn (và không chứa ký hiệu thừa). Ta xây dựng văn phạm phi ngữ cảnh G’= tương đương với G và không chứa quy tắc đơn. Đưa tất cả các quy tắc không đơn của P vào P’. Nếu trong P có quy tắc A→B, với A, B∈∆, thì tồn tại suy dẫn S αAβ αBβ αωβ, ở đây α,β∈(Σ∪∆)*, ω∈Σ* do ∆ gồm các ký hiệu không thừa. Vậy thay cho A→B, ta đưa vào P’ quy tắc S→αAβ và A→ω đều là các quy tắc không đơn nhưng chức năng sinh ngôn ngữ tương đương với quy tắc A→B. Thí dụ 3: Văn phạm phi ngữ cảnh G= tương đương với văn phạm phi ngữ cảnh sau không còn các quy tắc đơn: G’ = . 3.1.10. Định lý: Cho G= là văn phạm mà các quy tắc của nó có dạng A→α, ở đây A∈∆, α∈(Σ∪∆)*. Khi đó L(G) là ngôn ngữ phi ngữ cảnh. Chứng minh: Đối với văn phạm G như ở trên, ta cũng có thể định nghĩa cây suy dẫn bằng cách sử dụng từ ε và như vậy ta có thể xác định được rằng A ε hay không? Để làm việc này, ta chỉ cần xét các cây suy dẫn trong G trong đó không có con đường nào dài hơn số phần tử của ∆. Giả sử A1, A2, , An là các ký hiệu không kết thúc mà đối với chúng ta có Ai ε. Cuối cùng ta giả thiết rằng S không có mặt trong vế phải của bất kỳ quy tắc nào của P. Ta xây dựng văn phạm phi ngữ cảnh G= , trong đó P’ chứa S→ε nếu S ε và mọi quy tắc dạng A→α1 αk nếu A→C1 Ck (k≥1) là một quy tắc trong P và αi=Ci, trong đó Ci∈Σ∪∆ \ {A1, , An} hoặc αi∈{Ci, ε}, trong đó Ci∈{A1, , An}, ở đây ta ràng buộc mỗi một α không thể bằng ε. i G Bằng quy nạp theo độ dài suy dẫn, ta có thể chỉ ra rằng với ω∈Σ*, S ω khi và chỉ khi S G’ ω . 3.1.11. Định lý: Cho L là một ngôn ngữ phi ngữ cảnh. Khi đó tồn tại số tự nhiên n thoả mãn điều kiện với mỗi ω∈L có d(ω)>n, tồn tại các từ u, v, w, x và y sao cho ω=uvwxy, ở đây d(w)≥1, d(vx)≥1, d(vwx)≤n và với mọi i (i≥0), uviwxiy∈L. Chứng minh: Giả sử G= là văn phạm phi ngữ cảnh sinh ra L và P không chứa các quy tắc đơn. Gọi m là số phần tử của ∆ và n=lm+1, với l là độ dài cực đại của tất cả các vế phải của các quy tắc trong P. Lấy ω∈L(G) sao cho d(ω)>n=lm+1. Khi đó tồn tại cây suy dẫn mà kết quả là ω. Giả sử T là cây suy dẫn có kết quả ω mà chiều cao của nó nhỏ nhất. Dễ dàng 49
  51. thấy rằng đối với cây suy dẫn chiều cao h thì độ dài của từ nhận được không vượt quá lh. Vì ω là kết quả của cây T nên d(ω)≤lh. Mặt khác từ d(ω)>lm+1 nên suy ra h>m+1. Điều này có nghĩa là trong T tồn tại một đường đi từ gốc đến lá có nhiều hơn m+1 nút và trên đường này có ít nhất m+1 ký hiệu không kết thúc. Vì rằng số phần tử của ∆ là m nên trên đường này có ít nhất hai nút có cùng một tên A. Gọi T’ và T’’ là hai cây con lớn nhất có cùng gốc ký hiệu A nằm trên đường đi đã chỉ ra. T S T’ A T’’ A u v w x y Bây giờ ta xét kết quả ω của cây T và phân tích nó như trên hình vẽ, ω=uvwxy. Vì rằng trong G không có quy tắc đơn, nên từ nút A có ít nhất là hai nhánh đi ra, do đó d(vx)≥1 và d(w)≥1. Độ cao của cây T’ cùng lắm là m+1, ta đã chứng minh các nút được ký hiệu bởi A sao cho phần đầu tiên trong T’ của con đường đã xét mỗi ký hiệu chỉ xuất hiện một lần, do đó ta có d(vwx)≤lm+1=n. Từ cây T, ta có S uAy. Tiếp theo ta xét cây T’ mà nó là một cây suy dẫn của văn phạm GA= , ta có A vAx trong GA, do đó A vAx trong G. Tiếp đến xét cây T’’, ta có A w trong GA, do đó A w trong G. Cuối cùng, S uAy, A vAx và A w. Từ đó, ta có S uAy uwy, S uAy uvAxy uvwxy, S uAy uvAxy uviwxiy. 3.1.12. Hệ quả: Tồn tại ngôn ngữ cảm ngữ cảnh mà nó không phải là phi ngữ cảnh. Chứng minh: Trong Thí dụ 10 của Chương I, ta đã biết ngôn ngữ L={ambmcm | m ≥ 1} được sinh bởi văn phạm cảm ngữ cảnh G = , trong đó P = {S→aSAC, S→abC, CA→BA, BA→BC, BC→AC, bA→bb, C→c}. Ta sẽ chứng minh rằng không tồn tại văn phạm phi ngữ cảnh nào sinh ra L. 50
  52. Giả sử tồn tại một văn phạm như vậy. Theo định lý trên, tồn tại số tự nhiên n sao cho với mọi từ ω có d(ω)>n đều được phân tích thành ω=uvwxy, d(vx)≥1 và uviwxiy∈L với mọi i=0, 1, 2, Lấy từ ω=anbncn, với d(ω)=3n>n. Do đó ta có ω=anbncn=uvwxy, d(vx)≥1. Trước hết ta thấy rằng nếu trong v hoặc trong x chứa hai trong ba ký hiệu a, b, c thì uviwxiy∉L, do đó x chỉ chứa một loại ký hiệu và trong trường hợp này thì với i đủ lớn, số ký hiệu a, b, c trong uviwxiy không bằng nhau và vì vậy uviwxiy∉L. Điều này mâu thuẫn với kết quả trên. Vậy không tồn tại văn phạm phi ngữ cảnh nào sinh ra L. 3.2. ÔTÔMAT ĐẨY XUỐNG. Như ta đã biết, lớp các ngôn ngữ chính quy do văn phạm chính quy sinh ra cũng trùng với lớp các ngôn ngữ được đoán nhận bởi ôtômat hữu hạn (đơn định hoặc không đơn định). Tương tự, ta sẽ thấy trong phần này là lớp các ngôn ngữ phi ngữ cảnh do các văn phạm phi ngữ cảnh sinh ra sẽ trùng với lớp các ngôn ngữ được đoán nhận bởi ôtômat đẩy xuống không đơn định (Nondeteministic Pushdown Automata). Đáng lưu ý, chỉ có lớp ôtômat đẩy xuống không đơn định mới có thể đoán nhận hết lớp ngôn ngữ phi ngữ cảnh. Còn ôtômat đẩy xuống đơn định chỉ có khả năng đoán nhận được lớp con thực sự của lớp ngôn ngữ phi ngữ cảnh mà thôi. Tuy vậy, lớp ngôn ngữ được đoán nhận bởi lớp các ôtômat đẩy xuống đơn định là khá rộng, nó bao gồm phần lớn các ngôn ngữ lập trình hiện nay. Ở đây, ta chỉ đề cập tới ôtômat đẩy xuống không đơn định mà người ta thường gọi tắt là NDPA hay gọn hơn là PA. 3.2.1. Mở đầu: Một ôtômat đẩy xuống bao gồm một băng vào, một ngăn xếp và một bộ điều khiển như hình dưới đây: x x xn-1 xn Băng vào 1 2 q Bộ điều khiển Ngăn xếp Ôtômat đẩy xuống cũng như ôtômat hữu hạn có bộ điều khiển là tập hữu hạn các trạng thái. Đầu đọc của ôtômat cho phép đọc lần lượt các ký hiệu trên băng vào 51
  53. từ trái sang phải. Ngoài ra, ôtômat đẩy xuống còn có thêm băng làm việc (ngăn xếp) hay stack, nhờ có nó mà bộ nhớ của ôtômat đẩy xuống được tăng lên so với khả năng nhớ của ôtômat hữu hạn. Ngăn xếp được tổ chức theo nguyên tắc ký hiệu vào sau thì ra trước, giống như ổ nạp đạn. Khi đưa ký hiệu vào ngăn xếp thì ký hiệu đó được trở thành ký hiệu đầu của ngăn xếp. Khi ngăn xếp đọc thì ký hiệu đó là ký hiệu trên cùng và khi ký hiệu đó được xong thì nó sẽ bị loại khỏi ngăn xếp. Một ngăn xếp như vậy còn được gọi là một danh sách đẩy xuống. Căn cứ vào trạng thái hiện tại của bộ điều khiển, ký hiệu vào mà đầu đọc đang quan sát và ký hiệu đầu của ngăn xếp, ôtômat đẩy xuống sẽ chuyển sang một trạng thái mới nào đó và đồng thời đầu đọc có thể được chuyển sang ô bên phải. Nếu đầu đọc chuyển sang ô bên phải thì ta gọi quá trình trên là một bước chuyển. Ngược lại, nếu ký hiệu vào không ảnh hưởng tới bước chuyển thì ta gọi đó là bước chuyển “nhắm mắt” và trong bước chuyển đó đầu đọc vẫn đứng yên tại chỗ. Thực chất của bước chuyển “nhắm mắt” là sự tạm ngừng quan sát băng vào để chấn chỉnh lại ngăn xếp. Có hai cách đoán nhận xâu vào của ôtômat đẩy xuống: − Cách 1: Xâu vào được đọc xong và ôtômat đẩy xuống chuyển được về một trạng thái kết thúc nào đó. − Cách 2: Xâu vào được đọc xong và ngăn xếp trở thành rỗng. Sau này ta sẽ chỉ ra hai cách đoán nhận trên là tương đương. Thí dụ 4: Cho văn phạm phi ngữ cảnh: G = . Dễ dàng thấy rằng L(G)={ωcωR | ω∈{0, 1}*} (ωR là xâu viết các ký hiệu của xâu ω theo một thứ tự ngược lại). Chẳng hạn, đối với xâu ω=010011 thì xâu ωcωR=010011c110010 sẽ có dẫn xuất sau đây: (S, 0S0, 01S10, 010S010, 0100S0010, 01001S10010, 010011S110010, 010011c110010). Mặt khác xâu ωcωR có thể được đoán nhận bởi ôtômat đẩy xuống như sau: Trước hết đặt xâu x=ωcωR lên băng vào. Đầu đọc dịch chuyển từ trái sang phải. Ban đầu ngăn xếp rỗng. Ôtômat đẩy xuống có hai trạng thái p, q trong đó p là trạng thái đầu. Khi ở trạng thái đầu p, đầu đọc đọc ký hiệu trên băng vào là 0 hoặc 1 và nó đưa ký hiệu đó vào ngăn xếp. Trạng thái của ôtômat đẩy xuống lúc đó vẫn là p. Đầu đọc dịch chuyển sang bên phải một ô và đọc ký hiệu trên ô mới này. Nếu ký hiệu này là 0 hoặc 1 thì ôtômat đẩy xuống đưa ký hiệu đó vào ngăn xếp, trạng thái của ôtômat vẫn là p và đầu đọc lại được chuyển sang phải một ô. Quá trình đó vẫn tiếp tục cho tới khi đầu đọc gặp ký hiệu c. Khi đó ôtômat sẽ chuyển trạng thái p sang trạng thái q và đầu đọc chuyển sang phải một ô. Tại thời điểm này ngăn xếp xuất hiện xâu ω. Ký hiệu bên phải nhất của ω nằm trên cùng 52
  54. của ngăn xếp, còn trạng thái của ôtômat là q. Đầu đọc đang chỉ ô bên phải ký hiệu c. Nếu ký hiệu của ô này là ký hiệu của ô trên cùng của ngăn xếp thì ôtômat đẩy xuống loại ký hiệu trên cùng ra khỏi ngăn xếp, ký hiệu dưới nó lại lên vị trí đầu của ngăn xếp, ôtômat đẩy xuống chuyển đầu đọc sang phải một ô, còn trạng thái vẫn là q. Quá trình đó cứ tiếp tục và có hai khả năng xảy ra: 1) Ôtômat đẩy xuống đọc hết xâu x và ngăn xếp trở thành rỗng thì ôtômat dừng lại và đoán nhận được xâu x=ωcωR. 2) Các ký hiệu ở ngăn xếp chưa bị loại hết thì đầu đọc gặp ký hiệu trên xâu vào khác ký hiệu trên cùng của ngăn xếp. Trong trường hợp này ôtômat đẩy xuống không đoán nhận xâu x. Nhờ có ngăn xếp mà ôtômat đẩy xuống có khả năng nhớ được nửa đầu của xâu x=ωcωR với ω có độ dài tuỳ ý và sau đó nó so sánh dần với nửa cuối ωR của x. Ôtômat hữu hạn không có khả năng này. Bây giờ ta định nghĩa một cách hình thức ôtômat đẩy xuống như sau: 3.2.2. Định nghĩa: Một ôtômat đẩy xuống là một bộ bảy: M = , trong đó, − Σ là một bảng chữ, gọi là bảng chữ vào, mỗi ký hiệu trong Σ gọi là ký hiệu vào; − Q là một tập hữu hạn, khác rỗng các trạng thái sao cho Σ∩Q=∅; − ∆ là một bảng chữ mà các ký hiệu của nó gọi là các ký hiệu của ngăn xếp; − z0∈∆ là ký hiệu đặc biệt, gọi là ký hiệu đáy của ngăn xếp (còn gọi là ký hiệu đầu của danh sách đẩy xuống); − q0∈Q gọi là trạng thái đầu; − F⊂Q gọi là tập các trạng thái kết thúc; − δ: Q x (Σ∪{ε}) x ∆ ⎯⎯→ P(Q x ∆*) gọi là hàm chuyển của M. Một đẳng thức dạng: δ(q, a, z)={ , , , }, * trong đó q, qi∈Q, a∈Σ, z∈∆, γi∈∆ , i=1, , m được gọi là một bước chuyển của ôtômat đẩy xuống M. Nó đang ở trạng thái q, đọc ký hiệu a ở băng vào và z là ký hiệu ở đỉnh ngăn xếp. Khi đó nó chuyển sang trạng thái qi, thay ký hiệu z ở đỉnh ngăn xếp bằng xâu γi, i=1, , m, đồng thời chuyển đầu đọc sang bên phải một ô. Quy ước rằng khi đưa γi vào ngăn xếp, ký hiệu bên trái nhất của γi sẽ nàm ở phần dưới, còn ký hiệu bên phải nhất của γi sẽ nằm ở ô đầu ngăn xếp. Một đẳng thức dạng: δ(q, ε, z)={ , , , } diẽn tả một bước chuyển “nhắm mắt” của ôtômat đẩy xuống M: Ôtômat ở trạng thái q, ký hiệu z ở đỉnh ngăn xếp. Khi đó ôtômat đẩy xuống chuyển trạng thái q về 53
  55. qi và thay z∈∆ ở đỉnh ngăn xếp bởi xâu γi (1≤i≤m), còn đầu đọc thì không dịch chuyển. Ở một thời điểm, tình huống tức thời của ôtômat đẩy xuống xác định bởi ba yếu tố: − Xâu γ∈∆* trong ngăn xếp (với quy ước là ký hiệu bên trái nhất của γ nằm ở đáy ngăn xếp). − Trạng thái q∈Q. − Phần xâu vào x∈Σ* chưa được đọc đến trên băng vào (với quy ước ký hiệu bên trái nhất của x là ký hiệu sẽ được đọc tiếp). 3.2.3. Định nghĩa: Cho ôtômat đẩy xuống M = . Một hình trạng (hay cấu hình) của M là một bộ ba , trong đó q∈Q, α∈Σ*, β∈∆*. * * Giả sử α=a1a2 ak∈Σ , β=x1x2 xm∈∆ . Dưới tác động của ánh xạ chuyển trạng thái, M có thể chuyển từ hình trạng này sang hình trạng khác theo nguyên tắc sau: 1) Nếu ∈δ(q, a1, xm) thì hình trạng có thể chuyển sang hình trạng và ký hiệu: . 2) Nếu ∈δ(q, ε, xm) thì hình trạng có thể chuyển sang hình trạng và ký hiệu: . * 3.2.4. Định nghĩa: Cho ôtômat đẩy xuống M = và ω∈Σ . Ta nói rằng ôtômat M đoán nhận từ ω theo tập trạng thái kết thúc nếu tồn tại một dãy hữu hạn các hình trạng K0, K1, , Kn sao cho: 1) K0= , gọi là hình trạng đầu; 2) Kn= , p∈F, gọi là hình trạng kết thúc; 3) K0 K1 K2 Kn. Ký hiệu T(M)={ω∈Σ*|ω được đoán nhận bởi M theo tập trạng thái kết thúc}. T(M) được gọi là ngôn ngữ được đoán nhận bởi ôtômat đẩy xuống M theo tập trạng thái kết thúc. * 3.2.5. Định nghĩa: Cho ôtômat đẩy xuống M = và ω∈Σ . Ta nói rằng ôtômat M đoán nhận từ ω theo ngăn xếp rỗng nếu tồn tại một dãy hữu hạn các hình trạng K0, K1, , Kn sao cho: 1) K0= , gọi là hình trạng đầu; 2) Kn= gọi là hình trạng kết thúc; 3) K0 K1 K2 Kn. Ký hiệu N(M)={ω∈Σ* | ω được đoán nhận bởi M theo ngăn xếp rỗng}. 54
  56. N(M) được gọi là ngôn ngữ được đoán nhận bởi ôtômat đẩy xuống M theo ngăn xếp rỗng. Thí dụ 5: Cho ôtômat đẩy xuống M= , trong đó δ(q0, ε, z0)={ }, δ(q0, a, z0)={ }, δ(q1, a, z1)={ }, δ(q1, b, z1)={ }, δ(q2, b, z1)={ }, δ(q2, ε, z0)={ } (ở đây, ảnh của các bộ ba khác qua δ được hiểu là ∅). Xét các từ α=aabb và β=abaab. Ta có: . . Do đó α∈N(M), β∉N(M), β∉T(M). Tổng quát, ta có thể chứng minh được rằng N(M)=T(M)={anbn | n≥0}. Thí dụ 6: Cho ôtômat đẩy xuống M= , trong đó δ(q0, 0, z0)={ }, δ(q0, 0, z1)={ , }, δ(q0, 0, z2)={ }, δ(q0, 1, z0)={ }, δ(q0, 1, z1)={ }, δ(q0, 1, z2)={ , }, δ(q1, 0, z1)={ }, δ(q1, 1, z2)={ , }, δ(q0, ε, z0)={ }, δ(q1, ε, z0)={ }. Xét ω=110011, ta có thể vẽ cây biểu diễn các khả năng biến đổi của các hình trạng như sau: 1 0 0 0 2 2 1 1 2 55