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
Trang 1Lý 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.
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
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
o O o
-TIỂU LUẬN
LÝ THUYẾT TÍNH TOÁN
Trang 2TIỂ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?
Trang 3Phầ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
Trang 4khi đã đượ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
Trang 5Trong 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
Trang 6x = 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
Trang 7Bạ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
Trang 8Chứ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
Trang 9 * 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
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 +tlà 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 L, L−{ }∧ 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
ABCBCDA
S →
CD
A→
Cb
B→
∧
→a|
C
∧
→bD|
D
Đ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 D→A đã 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
Trang 10Hãy cho chúng tôi xem xét việc sản xuất S→ABCBCDA, mà chúng tôi viết tạm thời là
DA BC
ABC
S → 1 2
Ba biến C1,C2 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 {C1,C2,D} Nói cách khác, chúng tôi sẽ cần ít nhất các sản phẩm
S→ABBC2DA |ABC1BDA |ABC1BC2A |
|
BA ABC |
A ABBC |
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 A - > CD 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à S → A1BC1BC2DA2
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
{A1,A2,C1,C2,D} 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ứcX->X mà cũng không có gì để góp
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.
b bD D
a C
b Cb B
D C CD A
|
|
|
|
→
→
→
→
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 đó