TIỂU LUẬN LÝ THUYẾT TÍNH TOÁN Nội dung tiểu luận gồm 2 phần: Phần I. Lý thuyết (trang 3 > trang 16): Chapter 6. ContextFree Grammar Section 6.5. An Unambiguous CFG for Algebric Expressions Section 6.6. Simplified Form and Normal Forms Phần II. Bài tập (trang 17 > trang 21): Cho là một bảng chữ có kích thước (bản số) n. Với mọi câu w, ký hiệu |w| là độ dài của w và m(w) là số thứ tự của w trong thứ tự phân cấp đã cho. Hãy viết một chương trình trong một ngôn ngữ tùy chọn để tính m(w) khi biết w Phần I. Lý thuyết 6.5. Một cấu trúc CFG rõ ràng áp dụng giải thích các biểu thức đại số . Mặc dù một số CFL là vốn mơ hồ theo nghĩa đó chúng không thể được tạo ra ngoại trừ bằng một cấu trúc ngữ pháp mơ hồ, sự mơ hồ như vậy thường là đặc tính của cấu trúc ngữ pháp hơn là ngôn ngữ. Nếu một CFG là mơ hồ, nó thường có thể, và thường mong muốn tìm một CFG tương đương rõ ràng cho nó. Trong phần này, chúng ta sẽ giải quyết vấn đề này trong trường hợp ngữ pháp của biểu thức đại số được thảo luận trong ví dụ 6.5 này. Để đơn giản, chúng ta chỉ sử dụng hai toán tử + và trong phần thảo luận của chúng ta, vì vậy mà G có cấu trúc sau: S S + S | S S | (S) | a Sau khi chúng ta có được mộtcấu trúc ngữ pháp rõ ràng tương đương với trường hợp này, việc phục hồi các chức năng khác sẽ là hiển nhiên. Như chúng ta đã thấy, cấu trúc S S + S bản thân nó đã không không rõ ràng, và chúng ta sẽ cần phải loại bỏ các loại cấu trúc này. Đồng thời chúng ta sẽ lưu ý về khả năng, được đề cập trong ví dụ 6.5, kết hợp cấu trúc ngữ pháp vào các quy tắc chuẩn của cấu trúc trật tự và ưu tiên: cần phải có ưu tiên cao hơn +, a + b + c nên hiểu là ( a + b) + c, không phải là a + (b + c). Bởi không mong muốn S S + S, nên chúng ta sẽ không nghĩ đến biểu thức liên quan đến + như phép tính tổng như trong các biểu thức khác. Hiển nhiên, chúng là phép tính tổng của cái gì đó; chúng ta hãy sử dụng từ term để thay cho những cái được thêm vào (tức là, kết hợp sử dụng +) để tạo ra các biểu thức. Biến tương ứng trong ngữ pháp sẽ là T. Biểu thức cũng có thể là sản phẩm, tuy nhiên, vì hai biểu thức a + b c và a b + c là công thức tính tổng, nên thích hợp hơn để hiểu rằng số hạng có thể là sản phẩm. (Hãy nhớ rằng một biểu thức có thể bao gồm một số hạng duy nhất.) và chúng ta nói rằng hệ số là cái được nhân lên (kết hợp sử dụng ) để tạo ra số hạng. biểu thức như thế này sẽ được đại diện bởi biến số F. Cho đến nay, chúng ta có một hệ thống phân cấp của các cấp. Các biểu thức, các đối tượng chung nhất được dùng là tổng của một hay nhiều số hạng, và các số hạng là sản phẩm của một hoặc nhiều thừa số. Hệ thống Phân cấp này kết hợp của phép nhân hơn hơn phép cộng. Bây giờ chúng ta giải quyết với dấu ngoặc đơn. Chúng ta có thể nói rằng (A) có thể là một biểu thức, thuật ngữ, hay một thừa số. Tuy nhiên, bởi vì chúng ta muốn cho phép chúng ta chỉ có một cách để thu được (A) mà chúng ta nhầm hiểu là thích hợp nhất khi đã được đánh giá xong. Nói cách khác, việc đánh giá một biểu thức trong dấu ngoặc
Lý thuyết: Chapter 6. Context-Free Grammar (Section 6.5, 6.6) Bài tập: Viết chương trình tính số thứ thứ tự của câu trong thứ tự phân cấp. Lý thuyết: Chapter 6. Context-Free Grammar (Section 6.5, 6.6) Bài tập: Viết chương trình tính số thứ thứ tự của câu trong thứ tự phân cấp. GVHD: PGS.TS PHAN HUY KHÁNH Học viên: Nhóm 5 1. Ngô Phương Nam 2. Trần Anh Tài 3. Nguyễn Trần Trọng Ngành: KHOA HỌC MÁY TÍNH Khóa: 12 (2009-2011) ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN o O o Đà Nẵng, 5/2010 TIỂU LUẬN LÝ THUYẾT TÍNH TOÁN TIỂU LUẬN LÝ THUYẾT TÍNH TOÁN Nội dung tiểu luận gồm 2 phần: Phần I. Lý thuyết (trang 3 -> trang 16): * Chapter 6. Context-Free Grammar - Section 6.5. An Unambiguous CFG for Algebric Expressions - Section 6.6. Simplified Form and Normal Forms Phần II. Bài tập (trang 17 -> trang 21): * Cho Σ là một bảng chữ có kích thước (bản số) n. Với mọi câu w∈Σ * , ký hiệu | w| là độ dài của w và m(w) là số thứ tự của w trong thứ tự phân cấp đã cho. Hãy viết một chương trình trong một ngôn ngữ tùy chọn để tính m(w) khi biết w? 2 Phần I. Lý thuyết 6.5. Một cấu trúc CFG rõ ràng áp dụng giải thích các biểu thức đại số . Mặc dù một số CFL là "vốn mơ hồ" theo nghĩa đó chúng không thể được tạo ra ngoại trừ bằng một cấu trúc ngữ pháp mơ hồ, sự mơ hồ như vậy thường là đặc tính của cấu trúc ngữ pháp hơn là ngôn ngữ. Nếu một CFG là mơ hồ, nó thường có thể, và thường mong muốn tìm một CFG tương đương rõ ràng cho nó. Trong phần này, chúng ta sẽ giải quyết vấn đề này trong trường hợp ngữ pháp của biểu thức đại số được thảo luận trong ví dụ 6.5 này. Để đơn giản, chúng ta chỉ sử dụng hai toán tử + và * trong phần thảo luận của chúng ta, vì vậy mà G có cấu trúc sau: S S + S | S * S | (S) | a Sau khi chúng ta có được mộtcấu trúc ngữ pháp rõ ràng tương đương với trường hợp này, việc phục hồi các chức năng khác sẽ là hiển nhiên. Như chúng ta đã thấy, cấu trúc S S + S bản thân nó đã không không rõ ràng, và chúng ta sẽ cần phải loại bỏ các loại cấu trúc này. Đồng thời chúng ta sẽ lưu ý về khả năng, được đề cập trong ví dụ 6.5, kết hợp cấu trúc ngữ pháp vào các quy tắc chuẩn của cấu trúc trật tự và ưu tiên: * cần phải có ưu tiên cao hơn +, a + b + c nên "hiểu là" ( a + b) + c, không phải là a + (b + c). Bởi không mong muốn S S + S, nên chúng ta sẽ không nghĩ đến biểu thức liên quan đến + như phép tính tổng như trong các biểu thức khác. Hiển nhiên, chúng là phép tính tổng của cái gì đó; chúng ta hãy sử dụng từ term để thay cho những cái được thêm vào (tức là, kết hợp sử dụng +) để tạo ra các biểu thức. Biến tương ứng trong ngữ pháp sẽ là T. Biểu thức cũng có thể là sản phẩm, tuy nhiên, vì hai biểu thức a + b * c và a * b + c là công thức tính tổng, nên thích hợp hơn để hiểu rằng số hạng có thể là sản phẩm. (Hãy nhớ rằng một biểu thức có thể bao gồm một số hạng duy nhất.) và chúng ta nói rằng "hệ số" là cái được nhân lên (kết hợp sử dụng *) để tạo ra số hạng. biểu thức như thế này sẽ được đại diện bởi biến số F. Cho đến nay, chúng ta có một hệ thống phân cấp của các cấp. Các biểu thức, các đối tượng chung nhất được dùng là tổng của một hay nhiều số hạng, và các số hạng là sản phẩm của một hoặc nhiều thừa số. Hệ thống Phân cấp này kết hợp của phép nhân hơn hơn phép cộng. Bây giờ chúng ta giải quyết với dấu ngoặc đơn. Chúng ta có thể nói rằng (A) có thể là một biểu thức, thuật ngữ, hay một thừa số. Tuy nhiên, bởi vì chúng ta muốn cho phép chúng ta chỉ có một cách để thu được (A) mà chúng ta nhầm hiểu là thích hợp nhất 3 khi đã được đánh giá xong. Nói cách khác, việc đánh giá một biểu thức trong dấu ngoặc đơn , chúng ta phải sẽ ưu tiên tính toán các số hạng trong đó trước. Các thừa số sẽ được đánh giá trước tiên trong hệ thống phân cấp, và do đó hợp lý khi nói rằng (A) là một thừa số và rằng A chính nó có thể là một biểu thức tùy ý. Ở giai đoạn này, biểu thức là tổng của một hay nhiều số hạng, số hạng là các sản phẩm của một hoặc nhiều thừa số, và các thừa số là một trong hai biểu thức trong ngoặc đơn hoặc là định danh duy nhất. "tổng của các số hạng" có thể có nghĩa như là S T + T | T Tuy nhiên, để có được một tổng hợp của ba thừa số với phương pháp tiếp cận này, chúng ta sẽ buộc phải thử T T + T hay cái gì so sánh, và một lần nữa, chúng ta lại có thể bị mơ hồ. Và chúng ta co thể nói rằng một biểu thức là một số hạng duy nhất hoặc là tổng của một số hạng và một biểu thúc khác và câu hỏi duy nhất là liệu chúng ta muốn S S + T hay là S T + S. Nếu chúng ta nhớ rằng a + b + c = (a + b) + c, chúng ta có lẽ sẽ có S S + T một cách thích hợp; nói cách khác, một biểu thức với nhiều hơn một số hạng sẽ có được bằng cách thêm các số hạn cuối vào các biểu thức phụ có chứa tất cả, ngoại trừ số hạng cuối cùng. Vì lý do đó, chúng ta tạo ra cấu trúc T T * F, thay vì T F * T. Các cấu trúc ngữ pháp có được là G1 = (V, Σ, S, P), với V = (S, T, F) và P chứa các sản phẩm S S + T | T T T * F | F F (S) | a Bây giờ chúng ta phải chứng minh được hai điều: Thứ nhất, G1 thực sự là tương đương với cấu trúc ngữ pháp G ban đầu, và thứ hai, G1 là rõ ràng. Để tránh nhầm lẫn, chúng ta thay thế nhãn hiệu biểu tượng bắt đầu trong G1. Định lý 6.2. Cho G là một cấu trúc ngữ pháp tự do ta có: S S + S | S * S | (S) | a và cho G1 là CFG với các sản phẩm là S1 S1 + T | T T T * F | F F (S1) | a suy ra L (G) = L (G1) Chứng minh. Trước tiên, để chứng minh rằng L(G1)…. L(G), chứng minh bằng phép quy nạp độ dài của một chuỗi trong L (G1). Các bước cơ bản để cho thấy rằng a… L(G), và điều này là rõ ràng. 4 Trong bước quy nạp chúng ta cho rằng k ≥ 1 và rằng mọi y trong L (G1), đáp ứng | y | ≤ k là trong L (G). Chúng ta thấy rằng nếu x L (G1) và | x | = k + 1, suy ra x L(G). Bởi vì x ≠ a, bất kỳ sự suy diễn nào của x trong G1 phải bắt đầu bằng một trong ba cách sau: S1 S1 + T S1 T T * F S1 F (S1) Chúng ta chứng minh một trường hợp đầu tiên, và hai trường hợp còn lại là tương tự. Nếu x ban đàu có một lối diển dịch S1 S1 + T, suy ra x = y + z, với S1 * G1 y và T * G1 z. Vì S1 T G1 *, suy ra S1 * G1 z. Vì vậy, vì | y | và | z | ≤ k, giả sử ta quy nạp y, z là cả hai trong L (G). vì G chứa các sản phẩm S S + S, y + z là chuỗi diển dịch từ S ở G, và do đó x … L (G). Thứ hai, để chứng minh rằng L(G)…. L(G1). Một lần nữa, chúng ta sử dụng phép quy nạp trên | x |, và cũng giống như ở phần trước, bước cơ sở là đơn giản. Chúng ta giả định rằng k ≥ 1 và rằng cho mỗi y L (G) với y k | ≤ |, y L (G1); chúng ta muốn chứng minh rằng nếu x L (G) và | x | = k + 1, suy ra x L (G1). Trường hợp đơn giản là trong đó x có một lối diển dịch trong đó G bắt đầu bằng S (S). Trong trường hợp này x = (y) + z, suy ra cả y và z đều thuộc L (G), và giả sử rằng y … L (G1). Vì vậy, chúng ta có thể lấy được x trong G1 bằng cách bắt đầu suy diển S1 T F (S1) vậy suy ra y bắt nguồn từ S1. Giả sử x có một sự diển dịch trong G bắt đầu S S + S. Suy ra, giống như trước, các giả thuyết quy nạp cho chúng ta biết x = y + z, trong đó y, z là cả hai trong L (G1). Bây giờ, tuy nhiên, để kết luận rằng x L (G1), chúng ta cần z tới diển dịch từ T; nói cách khác, chúng ta muốn Z phải là một thuật ngữ duy nhất, cuối cùng của số hạng có tổng là x. Với điều này, hãy cho x = x 1 + x 2 + + x n trong đó mỗi x 1 L (G1) và n là như là số lớn nhất có thể. Chúng ta đã xác định rằng n ≥ 2. Bởi vì các n cách được xác định, không có x i 's có thể có một lối diển dịch trong G1 bắt đầu S1 S1 + T, do vậy, mỗi x i có thể được bắt nguồn từ T trong G1. Để cho y = x 1 + x 2 + + x n-1 (z = x n) Suy ra, y có thể được bắt nguồn từ S1, kể từ S1 T G1 * + T + + T (n-1 từ), và Z có thể được bắt nguồn từ T. gian suy ra x L (G1), kể từ khi chúng ta có thể bắt đầu với tạo ra S1 S + T. Cuối cùng, giả sử rằng mọi lối diển dịch của x trong G bắt đầu S S * S. Suy ra cho một số y, z trong L (G), x = y * z. lúc này, chúng ta cho phép 5 x = x 1 * x 2 * * x n Trong đó mỗi x i L (G1) và n là như là lớn nhất có thể. (Lưu ý sự khác biệt câu phát biểu náy khác với câu trước). Theo giả thuyết quy nạp, mỗi x i L (G1). lúc này, chúng ta muốn mỗi x i được diển dịch từ F trong G 1. Chúng ta có thể dễ dàng quy tắc ra trường hợp trong đó một số x i có một lối diển dịch trong G1 bắt đầu S1 T T * F. Nếu điều này là đúng, x i sẽ là của i y mẫu * z i cho một số i y, z i L (G1), tuy nhiên, bởi vì chúng ta biết rằng L (G1) L (G), điều này sẽ mâu thuẫn với các đặt tính tối đa số hạng n. Giả sử rằng một số x i có lối diển dịch là G1 S1 S1 + T. Suy ra, x i = i y + z i cho một số i y, z i L (G1) L (G). Trong trường hợp này, x = x 1 * x 2 * * x i-1 * y i + z i * x i +1 * * x n Nhưng điều này cũng không thể. Nếu chúng ta để cho u và v là chuỗi con trước và sau khi +, tương ứng, chúng ta rõ ràng có u, v L (G), và do đó x = u + v. Điều này có nghĩa rằng chúng ta có thể lấy được x trong G sử dụng một lối diển dịch bắt đầu S S + S, và chúng ta đã nhận định rằng đây không phải là trường hợp. Chúng ta có thể kết luận rằng mỗi x i là diển dịch từ F trong G1. Suy ra, như chúng ta đã làm trong trường hợp trước, chúng ta cho phép x = x 1 * x 2 * * x n-1 z = x n Các chuỗi y là T mẫu diển dịch tại G1, kể từ F * F * * F (n-1 thừa số) là diển dịch từ T trong G1. Vì vậy, chúng ta có thể lấy được x từ S1 trong G1 bằng cách bắt đầu các lối diển dịch S1 T * F, và do đó x L (G1). Để chứng minh cấu trúc ngữ pháp G1 là rõ ràng, thật hữu ích để tập trung vào các dấu ngoặc đơn trong chuỗi, tạm thời bỏ qua các biểu tượng khác. Theo đó, chúng ta muốn thuyết phục bản thân rằng ngữ pháp là phạm vi rõ ràng là nó tạo ra chuỗi ngoặc đơn; do đó nó sẽ cho phép chúng ta để chứng minh các sự rõ ràng của toàn bộ cấu trúc ngữ pháp. Trong bài tập 5.11, chúng ta xác định một chuỗi các dấu ngoặc đơn trong chuỗi cân bằng nếu đó là một chuỗi các dấu ngoặc đơn xuất hiện trong một số biểu thức đại số. tuy nhiên, chúng ta cần phải hiểu rõ hơn. Định nghĩa 6.4. Một chuỗi các ngoặc trái và phải được cân bằng nếu nó có số lượng bằng nhau của ngoặc trái và bên phải, và hiển nhiên không có nhiều tiền tố bên phải hơn trái. Dấu ngoặc trái trong chuỗi cân bằng là dấu Ngoặc phải đầu tiên để cân bằng cho chuỗi chứa hai và nhiều số hạng ở giữa ngoặc. Nếu x là một chuỗi có chứa ngoặc đơn và các ký hiệu khác, và các ngoặc đơn trong x tạo thành một chuỗi cân bằng, một biểu tượng trong δ x trong ngoặc đơn nếu δ xuất hiện giữa một ngoặc trái và ngoặc phải. 6 Bạn nên nghĩ rằng mỗi một dấu ngoặc trái trng chuỗi cân bằng đều có dấu ngoặc phải (bài tập 6.30). Đầu tiên, chúng ta làm một cuộc quan sát để thấy rằng một chuỗi dấu ngoặc đơn ở bất kỳ một chuỗi nào từ S1 trong ngữ pháp G1 là được cân bằng. Chắc chắn số lượng của ngoặc trái bằng nhau với bên phải, bởi vì chúng tồn tại trong một cặp. Hơn nữa, cứ mỗi ngoặc đơn phải được tạo ra bởi một lối diển dịch tại G1, và một ngoặc trái xuất hiện trước nó sẽ tồn tại đồng thời, và do đó không không thể tồn tại nhiều dấu ngoặc phải hơn dấu ngoặc trái. Thứ hai, quan sát rằng trong bất kỳ lối diển dịch tại G1 nào, các ngoặc giữa và bao gồm cả cặp ngoặc được tạo ra bởi một công thức duy nhất F (S1) tạo thành một chuỗi cân bằng. Điều này là do ngoặc trong chuỗi xuất phát từ S1 làm, và bởi vì việc kèm theo một chuỗi ngoặc đơn cân đối trong ngoặc tạo thành một chuỗi cân bằng. Bây giờ giả sử x L (G1), và (0 là bất kỳ dấu ngoặc trái nào trong x. Các phát biểu rằng chỉ có một lối diển dịch tận cùng bên trái của x trong G1 nằm ở sau cùng và nếu chúng ta có thể thấy rằng G1 là rõ ràng, và chúng ta sẽ sớm có thể làm điều này. Tuy nhiên, cuộc thảo luận trước đó cho phép chúng ta nói rằng, ngay cả khi có một vài lối diển dịch tận cùng bên trái của x, thì ngoặc đơn bên phải cũng xuất hiện đồng thời. - đơn giản là chúng tồn tại lẫn nhau (0. Để thấy điều này, chúng ta hãy xem xét một lối diển dịch cố định của x. Trong lối diển dịch này, các bước trong đó (0 là sản phẩm còn tạo ra một ngoặc đơn bên phải, mà chúng ta gọi) 0. Như chúng ta đã thấy trong đoạn trước, trong ngoặc đơn x bắt đầu với (0 và kết thúc với) 0, bởi vì đó là cách mà "một cặp" được xác định. Tuy nhiên, nó không thể xuất hiện trước khi một trong hai dấu xuất hiện, chúng xuất hiện đồng thời. Bởi vì chuỗi dấu ngoặc bắt đầu bằng dấu ngoặc đơn với (0 và kết thúc với dấu tương ứng với nó là cân bằng, các chuỗi thu được bằng cách bỏ đi (0 có một dấu ngặc phải dư; nếu cặp ngoặc tương ứng của 0 (0 xuất hiện trước) , cũng có thể là tiền tố của chuỗi ngoặc đơn cân đối giữa (0 và) 0. Vì vậy ta sẽ có cặp ngoặc tương ứng của 0 (0 song trùng) . Điểm chính của cuộc thảo luận này là khi chúng ta bắt gặp cái gì đó "trong ngoặc đơn," chúng ta có thể chắc chắn rằng hai ngoặc tạo ra bởi F (S1), sẽ không có vấn đề gì khi chúng ta bắt gặp bất kì một lối diễn dịch nào . Đây là thành phần chúng ta cần bổ sung trong định lý. Định lý 6,3 cấu trúc ngữ pháp G1 tự do với các sản phẩm của nó. S1 S1 + T | T T T * F | F F (S1) | a là rõ ràng. 7 Chứng minh. Chúng ta muốn chứng minh rằng mỗi chuỗi x trong L (G1) chỉ có một lối diển dịch tận cùng bên trái từ S1. Phương pháp chứng minh bằng phép quy nạp toán học trên | x |, và nó thực sự sẽ dễ dàng hơn để chứng minh một cách rõ ràng và chặt chẽ hơn. Đối với bất kỳ x diển dịch từ một trong các biến S1, T, hoặc F, x chỉ có một lối diển dịch tận cùng bên trái từ biến đó. Đối với những bước cơ bản, chúng ta quan sát rằng a có thể được bắt nguồn từ một trong ba biến, và rằng trong mỗi trường hợp chỉ có một lối diển dịch. Trong bước quy nạp, chúng ta giả định rằng k ≥ 1 và rằng cho mỗi y xuất phát từ S1, T, hay F mà | y | ≤ k, y chỉ có một lối diển dịch tận cùng bên trái từ biến đó. Chúng ta muốn hiển thị các kết quả tương tự cho một chuỗi x với | x | = k + 1. Hãy xem xét, đầu tiên là trường hợp trong đó x có chứa ít nhất một + không nằm trong ngoặc đơn. Bởi vì chỉ + 's nằm trong chuỗi xuất phát từ T hoặc F là mới trong ngoặc đơn, x có thể chỉ xuất phát từ S1, và lối diển dịch bất kỳ của x phải bắt đầu S1 S1 + T, với + là cuối + trong x không phải là trong dấu ngoặc đơn. Vì vậy, bất kỳ lối diển dịch tận cùng bên trái của x từ S1 đều có dạng S1 S1 + T * y + T * y + z Trường hợp này hai bước cuối cùng đại diện lối diển dịch tận cùng bên trái của x từ S1 và z từ T, tương ứng, và + vẫn là một nhân tố không nằm trong dấu ngoặc đơn. Giả thuyết quy nạp cho chúng ta biết, y chỉ có một lối diển dịch tận cùng bên trái từ S1 và z chỉ có một từ T. Vì vậy, x chỉ có một lối diển dịch tận cùng bên trái từ S1. Tiếp theo là trường hợp trong đó x không chứa + ngoặc đơn bên ngoài, nhưng ít nhất một * ngoài ngoặc đơn. Lúc này x có thể chỉ xuất phát từ S1 hoặc T; bất kỳ lối diển dịch từ S1 phải bắt đầu S1 T T * F; và lối diển dịch nào phải bắt đầu từ T T T * F. Trong mỗi trường hợp, * phải là nhân tố cuối cùng trong x không nằm trong ngoặc đơn. Như trong trường hợp đầu tiên, các bước tiếp theo của bất kỳ lối diễn dịch nào tận cùng bên trái thì có lối diễn dịch sau T * F * y * F * y * z Bao gồm phần đầu tiên của một lối diển dịch tận cùng bên trái của y từ T và là phần của một lối diển dịch tận cùng bên trái của z từ F. Một lần nữa, giả thuyết quy nạp cho chúng ta biết chỉ có một cách để có thể có những lối diển dịch, và do đó chỉ có một của lối diển dịch tận cùng bên trái x từ S1 hoặc T. Cuối cùng, giả sử x không chứa + 's hoặc *' s bên ngoài ngoặc đơn. Suy ra x có thể được bắt nguồn từ bất kỳ các biến nào, tuy nhiên lối diễn dịch duy nhất từ S1 được bắt đầu S1 T T F (S1), và lối diển dịch duy nhất từ T hoặc F bắt đầu theo cùng một cách như vậy, với một hoặc hai bước đầu tiên được lược bỏ. Do đó, x = (y), S1 8 * y. Theo các giả thuyết quy nạp, y chỉ có một lối diển dịch tận cùng bên trái từ S1, và suy ra x chỉ có một trong ba biến và chúng ta đã hoàn thành việc chứng minh. 6.6. Hình thức đơn giản và hình thức thường Sự mơ hồ là một trong những điều không mong muốn của một ngôn ngữ phi ngữ cảnh mà chúng ta muốn loại bỏ. Trong phần này chúng ta thảo luận về một số vấn đề đơn giản nhằm cải tiến hơn về ngữ pháp mà không làm thay đổi kết quả của ngôn ngữ. Đầu tiên bằng cách loại bỏ một số loại sản phẩm làm bất tiện công việc, và sau đó tiêu chuẩn hóa các sản phẩm để tất cả đều có " hình thức bình thường." Chúng tôi bắt đầu bằng cách cố gắng để loại bỏ “ ^- sản phẩm”,có dạng A -> ^, trong đó đơn giản là biến này được thay thế bằng biến khác. Để minh họa làm thế nào các cải tiến này có thể có ích, giả sử không có cú pháp loại hình sản xuất, và xem xét một mã nguồn có chứa các phần β ⇒∞ Nếu ở đó không có ^ - sản xuất, sau đó là chuỗi β phải có ít nhất miễn là ∞ , nếu không có các đơn vị sản xuất, ∞ và β có thể được chiều dài bằng nhau chỉ khi tập hợp các bước này thay thế một biến bằng một thiết bị đầu cuối duy nhất. Nói cách khác, nếu và đại diện cho chiều dài của chuỗi hiện tại và số lượng thiết bị đầu cuối trong chuỗi hiện hành tương ứng, sau đó số lượng phải gia tăng tại mỗi bước của derivation này. Giá trị của t + là cho chuỗi S và 2k cho một chuỗi dài x của k trong ngôn ngữ. Chúng tôi có thể kết luận rằng một derivation của x có thể có không quá 2k - bước l. Đặc biệt, hiện nay chúng tôi có một lgorithm để xác định liệu một chuỗi cho x là trong ngôn ngữ tạo ra bởi văn phạm sau: Nếu | x | = k, hãy thử tất cả các dãy có thể có của 2k - 1 sản phẩm, và xem nếu có sản xuất ra x. Mặc dù đây không phải là một thuật toán thực tế, ít nhất là nó minh họa một một cách thực tế là thông tin về các hình thức sản xuất có thể được sử dụng để lấy được kết luận về các ngôn ngữ kết quả. Trong khi đang cố gắng để loại bỏ - sản phẩm từ ngữ pháp, chúng ta phải bắt đầu với một tiêu chuẩn. Chúng tôi rõ ràng là không thể loại bỏ tất cả các sản phẩm của mẫu này nếu chuỗi A chính nó là trong ngôn ngữ. trở ngại này chỉ là nhỏ, tuy nhiên: Chúng tôi sẽ có thể cho thấy rằng đối với bất kỳ ngôn ngữ phi ngữ cảnh { } ∧−LL, có thể được tạo ra bởi một CFG với ^- sản xuất. Một ví dụ sơ bộ sẽ giúp chúng tôi xem làm thế nào để tiến hành. Chọn G và các với các sản phẩm ABCBCDAS → CDA → CbB → ∧→ |aC ∧→ |bDD Điều đầu tiên ở ví dụ này có lẽ là minh họa phải rõ ràng: Chúng tôi có thể không chỉ đơn giản là ^- sản xuất mà không cần thêm bất cứ điều gì. Trong trường hợp này, nếu AD → đã loại trừ và không có gì có thể được bắt nguồn, bởi vì các ^-sản phẩm là cách duy nhất để loại bỏ các D biến từ chuỗi hiện hành. 9 Hãy cho chúng tôi xem xét việc sản xuất ABCBCDAS → , mà chúng tôi viết tạm thời là DABCABCS 21 → Ba biến C2 C1, và D ở phía bên phải tất cả bắt đầu ^-sản phẩm, và mỗi cũng có thể được sử dụng để lấy được một chuỗi. Trong vấn đề này chúng tôi có thể thay thế không có bất kỳ hoặc tất cả bằng A. Nếu không có một sản phẩm chúng tôi sẽ cần phải cho phép cho tất cả các tùy chọn này bằng cách thêm các sản phẩm α →S của các hình thức, mà là một chuỗi thu được từ ABCBCDA bằng cách xóa một số hoặc tất cả tập D} C2, {C1, . Nói cách khác, chúng tôi sẽ cần ít nhất các sản phẩm |A BCABC |BDA ABC |DA ABBCS 2112 → |BA ABC |A ABBC |ABBCDA 12 ABBA Để đảm bảo thu được tất cả các chuỗi có thể được thu được từ ngữ pháp ban đầu. Nếu bây giờ chúng ta xem xét các biến A, chúng ta thấy rằng các sản phẩm vẫn còn chưa đủ. Mặc dù A không bắt đầu một ^-sản xuất, chuỗi A có thể xuất phát từ A (như chuỗi có thể khác). Bắt đầu với đưa ra CD -A > chúng ta có thể bỏ qua C hoặc D, bằng cách sử dụng các đối số như trước. Chúng ta không thể bỏ qua cả hai. bởi vì chúng ta không muốn các sản phẩm ∧→A trong ngữ pháp cuối cùng của chúng ta. Nếu chúng ta thêm phần đến xuất hiện của A, như chúng ta đã làm cho những phần ở C, do đó việc sản xuất ban đầu là 2211 DABCBCAS → Chúng ta cần thêm sản phẩm, trong đó phía bên phải là thu được bằng cách để lại một số tập hợp con của { } DCCAA ,,,, 2121 trong đó có 32 tập con, có nghĩa là từ này sản xuất ban đầu chúng ta có được những người khác 3L đó sẽ được thêm vào ngữ pháp của chúng ta. Lý do áp dụng cùng để đón các sản phẩm chính ban đầu. Nếu chúng ta có thể xác định trong sản xuất α →X tất cả các biến xảy ra trong α từ đó ∧ có thể được bắt nguồn, sau đó chúng tôi có thể thêm tất cả các sản phẩm ' α →X nơi ' α thu được từ α bằng cách xoá bỏ một số trong những lần xuất hiện. Nói chung thủ tục này có thể sản xuất mới ^- sản xuất nếu có, họ sẽ được bỏ qua, và nó có thể sản xuất các sản phẩm của các hình thức X - X > mà cũng không có gì để góp phần ngữ pháp và có thể được bỏ qua. Trong trường hợp này văn phạm phi ngữ cảng sau cùng chúng ta có 40 sản phẩm, bao gồm S-32 sản xuất đã được đề cập. bbDD aC bCbB DCCDA | | || → → → → Các thủ tục nêu trong Ví dụ 6,14 là một trong đó chúng tôi sẽ hiển thị làm việc nói chung. Hiện tại nó có hệ thống hơn, chúng tôi cung cấp cho cách khử đệ quy đầu tiên của một biến không có hiệu lực (A từ đó có thể được xuất phát), và sau đó chúng ta cung cấp cho các thuật toán được đề xuất bởi thành phần này để xác định các biến đó. 10 [...]... biểu mạnh hơn trong các định lý: đối với bất kỳ biến A є V, và đối với các giá trị không rỗng bất kỳ x є Σ *, A => *Gx nếu và chỉ nếu A> = *G1x Chúng ta sử dụng ký hiệu A => kG x có nghĩa là có một phép lấy đạo hàm k-bước của x từ A trong G 11 Chúng ta thấy trước rằng đối với bất kỳ n ≥ 1, nếu A => n Gx, thì A> = * G1 x Bằng chứng là do lý luận bằng phương pháp quy nạp toán học trên n Đối với bước... dụng thuật toán FindNull 3 Đối với mỗi sản xuất A-> α trong P, thêm vào mỗi P1 sản xuất có thể thu được từ này bằng cách xóa từ α một hoặc nhiều lần xuất hiện của các biến có giá trị null trong α 4 Xóa tất cả các sản xuất từ P1 Cũng xóa bất kỳ bản sao, cũng như sản phẩm của mẫu A-> A Định lý 6,5 Cho G = (V, Σ, S, P) bởi ngôn ngữ phi ngữ cảnh, và để cho G1 là ngôn ngữ thu được từ G bằng thuật toán 6.1... tất cả các đơn vị sản xuất từ P1 Định lý 6,6 Cho G là CFG bất kỳ mà không ^-sản xuất, và cho G1 là CFG thu được từ G bằng thuật toán 6.2 thì, G1 không chứa các đơn vị sản xuất và L (G1) = L (G) Bằng chứng là bỏ qua (Bài tập 6,62) Đó là điểm không có giá trị, một lần nữa không có bằng chứng, nếu G là ngôn ngữ rõ ràng, thì là ngôn ngữ G1 cũng nhận được từ các thuật toán Ví dụ loại bỏ sản xuất đơn lẻ: Cho... cách làm này là hoang tốn, trong giới hạn số lượng biến ít , không nghi ngờ hiệu quả của 5 phép toán đặc trưng tương đương với phép sinh ban đầu Bổ sung các biến mới, các phép sinh mới không làm thay đổi ngôn ngữ sinh Nếu chúng ta có đầy đủ luận cứ cho thông tin này chúng ta sẽ thu được kết quả sau: Định lý 6.7 Cho văn phạm phi ngữ cảnh bất kỳ G = G=(V, ∑, S, P) , có một CFG G’ = (V’, ∑, S, P’) trong... đã sử dụng thuật toán 6.1 Nếu cần thiết ngôn ngữ không có ^-sản xuất Trong trường hợp này là một biến có thể được bắt nguồn từ một chỉ bởi một chuỗi các đơn vị sản xuất Đối với bất kỳ biến A, chúng ta có thể xây dựng các định nghĩa đệ quy sau đây của các bộ "A-derivable" (chủ yếu, biến B khác với A mà A => * B) và sau đó định nghĩa có thể dễ dàng được điều chỉnh để có được một thuật toán 1 nếu A ->... được nullable Thuật toán FindNull (Tìm các biến nullabla trong A) CFG G = ( V, ∑, S, P ) ) N 0 = { A ∈ V | P contains the production A - > A }; i = 0; do i = i + 1; N i = N i -1 ∪ { A | P contains A → α of for some α ∈ N*-1 i } While Ni ≠ N i −1 N i là tập hợp của các biến nullable Bạn có thể dễ dàng chấp nhận rằng các biến được định nghĩa trên là 6,6 các biến A mà Lấy Findnull thuật toán từ định nghĩa... sử dụng bất cứ khi nào chúng ta có một định nghĩa đệ quy (xem Tập thể dục ,70) Khi chúng tôi áp dụng các thuật toán Ví dụ 6,14, thiết lập được Các thiết lập cũng có chứa A, như là kết quả của sản xuất Do không có sản phẩm khác có mặt ngay trong ba là các chỉ biến nullable trong ngữ pháp Thuật toán 6.1 (Tìm một CFG tương đương với sản phẩm không-A) Cho một CFG, G = (V, Z, S, P), xây dựng một CFG G1 =... -> aC | a Và xóa S -> C Giới hạn vế phải của phép sinh cho phép toán cuối hoặc chuỗi có hơn 2 biến Bước này sẽ tạo ra các phép sinh sau: S -> AACD | ACD | AAC | CD | AC | XnC | A A -> XaAXb | XaXb C -> XaC | a D -> XaDXa | XbDXb | XaXa | XbXb Xa -> a Xb -> b Bước cuối cùng chuyển sang CNF: Có 6 phép sinh mà vế phải quá dài Áp dụng thuật toán 6.1 để tạo ra ngôn ngữ có các phép sinh như sau: S -> AT1... số thứ tự 15 Biểu diễn trên sơ đồ dạng cây: e1 a2 aa5 aaa14 ab6 aab15 b3 ac7 ba8 bb9 c4 bc10 ca11 aac16 cb12 cc13 Từ sơ đồ trên, để tính số thứ tự của một chuỗi trong thứ tự phân cấp ta tìm được hai cách giải quyết như sau: Cách 1: Sử dụng hàng đợi Q Cách 2: Tương tự cách tính giá trị một số dựa vào vị trí các chữ số của chúng Cách 1: * Từ sơ đồ trang trước ta thấy, các chuỗi sinh ra theo thứ tự phân... sothutu, Q); EndIf; Until (i>n); {n: số phần tử của bảng chữ} Until (temp = chuỗinhập); {w: chuỗi nhập} Write(sothutu); Thuật toán 1 được hiện thực bằng chương trình BT_LTTT.PAS và mô phỏng bằng đồ họa ở chương trình BT_LTTT1.PAS viết trên Ngôn ngữ lập trình Pascal Cách 2: 18 Dựa vào cách tính giá trị của một số (trong hệ đếm B) dựa vào vị trí của các chữ số trong số đó Ví dụ: Số 1101 viết trong hệ nhị phân . nhập} Write(sothutu); Thuật toán 1 được hiện thực bằng chương trình BT _LTTT. PAS và mô phỏng bằng đồ họa ở chương trình BT _LTTT1 .PAS viết trên Ngôn ngữ lập trình Pascal. Cách 2: 18 Dựa vào cách. Giatri() trả về vị trí của một ký tự trong bảng chữ} Thuật toán 2 được hiện thực bằng chương trình BT _LTTT2 .PAS và được viết trên Ngôn ngữ lập trình Pascal. 20