Tải bản đầy đủ (.doc) (31 trang)

BÁO CÁO LIỂU LUẬN MÔN LÝ THUYẾT TÍNH TOÁN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (482.33 KB, 31 trang )

Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
ĐẠI HỌC ĐÀ NẴNG
ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO LIỂU LUẬN
BÁO CÁO LIỂU LUẬN
MÔN : LÝ THUYẾT TÍNH TOÁN
Giảng viên
Giảng viên
:
:


GS. TS. Phan Huy Khánh
GS. TS. Phan Huy Khánh
Nhóm thực hiện:
Nhóm thực hiện:
Huỳnh Kim Tân
Huỳnh Kim Tân
Nguyễn Thị Hồng Thuý
Nguyễn Thị Hồng Thuý
Vũ Thị Diệu Thư
Vũ Thị Diệu Thư
Lớp:
Lớp:
KHMT K12
KHMT K12







KHMTK12 - Nhóm 7 1
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8

NỘI DUNG BÁO CÁO
PHẦN 1 - LÝ THUYẾT
Câu 2:
Chapter 6. Context-Free Grammar.
- Section 6.1. Definition of Context-Free Grammar.
- Section 6.2. More exemples… [1] p163-171.
PHẦN 2 - BÀI TẬP
Câu 8:
Viết chương trình RAM chuẩn và RAM thô
sơ kiểm tra điều kiện các số a, b, c cho trước
một cách ngẫu nhiên lần lượt là các cạnh và
đường chéo của một hình chữ nhật.
KHMTK12 - Nhóm 7 2
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
PHẦN 1 – LÝ THUYẾT
Chương 6: VĂN PHẠM PHI NGỮ CẢNH
(CONTEXT-FREE GRAMMARS)
6.1 Các định nghĩa và các ví dụ:
Nhiều ngôn ngữ mà chúng ta từng biết, cả ngôn ngữ có qui tắc lẫn ngôn ngữ
bất qui tắc, có thể được mô tả bằng các định nghĩa đệ quy. Trong ví dụ đầu tiên, bao
hàm một ngôn ngữ qui tắc rất đơn giản, việc định dạng sơ sài của định nghĩa đệ quy
dẫn đến ý tưởng của văn phạm phi ngữ cảnh. Dạng văn phạm này và nhiều văn phạm

tổng quát khác mà chúng ta sẽ học tạo thành các công cụ mạnh mẽ hỗ trợ mô tả và
phân tích các ngôn ngữ.
Ví dụ 1: Sử dụng các qui tắc văn phạm để mô tả ngôn ngữ.
Cho rằng ngôn ngữ L = {a,b}* của tất cả các chuỗi trên bảng chữ cái {a, b}.
Trong ví dụ 2.15, chúng ta đã thấy định nghĩa đệ quy của L được biễu diễn như sau:
1. A ∈ L
2. Cho bất cứ S ∈ L, Sa ∈ L.
3. Cho bất cứ S ∈ L, Sb ∈ L.
4. Không có các chuỗi khác thuộc L.
Cho rằng S ở đây là một biến, biễu diễn cho 1 phần tử bất kỳ của L, mà giá trị
của phần tử tồn tại bởi một vài kết nối của các qui tắc từ 1 đến 3. Qui tắc 1có dạng
khi chúng ta ghi S → A, chỉ định cách cho S một giá trị để A thay thế. Qui tắc 2 và 3
có thể được viết S → Sa và S → Sb. Điều này có nghĩa S cũng có thể được thay thể
bởi Sa hoặc Sb; ngoài ra phải tồn tại giá trị cuối bằng cách tiếp tục sử dụng các qui
tắc gán giá trị cho S mới.
Biểu tượng → được sử dụng cho từng qui tắc khi một biến được thay thế bởi
một chuỗi. Cho 2 chuỗi α và β, khi ký hiệu α ⇒ β có nghĩa là β có thể tồn tại bằng
cách cung cấp một trong những qui tắc đến một biến đơn trong xâu chuỗi α. Sử dụng
ký hiệu này trong ví dụ, chúng ta có thể viết:
S ⇒ Sa ⇒ Sba ⇒ Sbba ⇒ Abba = bba.
để mô tả thứ tự từng bước (ứng dụng của các qui tắc 2,3,3, và 1) được dùng để tồn tại
hoặc chuyển hóa, xâu chuỗi bba. Sự chuyển hóa kết thúc tại điểm thay thế S bằng
một xâu chuỗi thực của các ký hiệu bảng chữ cái (trong trường hợp A này); mỗi bước
tương tự trước khi gọi qui nạp, kể từu khi thay thế xâu chuỗi S bằng 1 xâu chuỗi vẫn
còn chứa 1 biến.
Thậm chí, có thể chú thích một cách đơn giản cho các ký hiệu | nghĩa là
“hoặc” và ghi 3 qui tắc đầu tiên như:
S → A | Sa | Sb
KHMTK12 - Nhóm 7 3
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8

(Trong các chú thích mới, bỏ qua cách viết qui tắc 4, mặc dù kết quả vẫn không
tường minh ). Chúng ta lưu ý về các tham chiếu mới trong một biểu thức như là Sa |
Sb, hai khả năng là Sa và Sb, không là a và S- trong các từ khác, việc nối các xâu
chuỗi có quyền ưu tiên trên quá trình hoạt động.
Trong ví dụ 2.15, chó thấy rằng khả năng của L:
1. A ∈ L.
2. a ∈ L.
3. b ∈ L.
4. Cho mỗi x và y trong L, x,y ∈ L.
5. Không có xâu chuỗi khác trong L.
Sử dụng chú thích mới, chúng ta sẽ tổng quát hóa ‘các qui tắc văn phạm’ được
viết :
S → A | a | b| SS
Với cách thức đó, có nhiều cách để chứa xâu chuỗi bba. Hai dẫn xuất được
hiển thị như sau :
S ⇒ SS ⇒ bS ⇒ bSS ⇒ bbS ⇒ bba
S ⇒ SS ⇒ Sa ⇒ Ssa ⇒ bSa ⇒ bba
Năm bước trong dòng đầu phù hợp với các qui tắc 4, 3, 4, 3, và 2, và trong dòng thứ 2
phù hợp với các qui tắc 4, 2, 4, 3, và 3.
Trong cả 2 trường hợp trong ví dụ 6.1, các định dạng được sử dụng trong định
nghĩa đệ quy có thể được giải thích như các qui tắc văn phạm trong văn phạm phi
ngữ cảnh. Trước khi đưa ra định nghĩa chính thức của văn phạm, chúng ta nên xem
thêm 2 ví dụ. Trong ví dụ 6.2, mặc dù văn phạm tương đối đơn giản hơn trong ví dụ
6.1, ngôn ngữ tương ứng thuộc loại bất qui tắc. Trong ví dụ 6.3 thì tiêu biểu hơn cho
kiểu văn phạm chứa nhiều hơn 1 biến.
Ví dụ 6.2: Ngôn ngữ {a
n
b
n
| n ≥ 0}

Các qui tắc văn phạm
S → aSb | A
Là một cách khác để mô tả ngôn ngữ L được định nghĩa như sau:
1. A ∈ L.
2. Cho mỗi x ∈ L, axb ∈ L.
3. Không có gì nữa trong L.
Ngôn ngữ L đơn giản được xem là ngôn ngữ bất qui tắc {a
n
b
n
| n ≥ 0}. Các qui
tắc văn phạm trong phần đầu của ví dụ 6.1, cho ngôn ngữ {a,b}*, cho phép a’s và b’s
được thêm vào một cách độc lập lẫn nhau. Ở đây, theo hướng xử lý khác, mỗi lần
một ký hiệu được thêm vào cuối mỗi xâu chuỗi bởi ứng dụng của qui tắc văn phạm S
KHMTK12 - Nhóm 7 4
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
→ aSb, ký hiệu ngược lại đồng thời được thêm vào cuối xâu chuỗi khác. Như vậy,
ràng buộc không chỉ một mà còn có thể sư dụng bởi bất cứ biểu thức qui tắc.
Ví dụ 6.3: Tính đối xứng.
Xem xét cả 2 ngôn ngữ pal của tính chất đối xứng trên bảng chữ cái {a, b} và
phần bổ sung N, tập hợp các thành phần không đối xúng trên {a, b}. Từ ví dụ 2.16,
chúng ta có định nghĩa qui nạp của pal :
1. A, a, b ∈ pal
2. Cho bất cứ S ∈ pal, aSa và bSb tồn tại trong pal.
3. Không có các xâu chuỗi khác trong pal.
Vì vậy, có thể mô tả pal trong văn phạm phi ngữ cảnh với các qui tắc văn
phạm:
S → A| a | b | aSa | bSb
Ngôn ngữ N cũng tuân theo qui tắc 2: Cho bất cứ x không đối xứng, cả hai axa
và bxb sẽ không đối xứng. Tuy nhiên, định nghĩa qui nạp của N không thể đơn giản

như định nghĩa của pal, bởi vì không có tập hợp vô hạn của các xâu chuỗi mà có thể
phân phối như các phần tử cơ bản trong định nghĩa. Tồn tại tập vô hạn N
0
để mỗi
thành phần không đối xứng có thể vẫn tồn tại từ 1 phần tử của N
0
bởi các ứng dụng
của qui tắc 2 (Bài tập 6.42). Cho 1 chuỗi không đối xứng :
abbaaba
Nếu bắt đầu tại các điểm cuối và làm việc theo cách thử kết hợp các ký hiệu
tại điểm đầu với các ký hiệu tại điểm kết thúc, xâu chuỗi này xem như một chuỗi đối
xứng cho 2 bước đầu tiên. Để biến nó thành xâu chuỗi không đối xứng tại phần chính
giữa baa, phần bắt đầu với 1 ký hiệu và kết thúc với 1 ký hiệu ngược lại; xâu chuỗi ở
giữa hai có thể bất cứ kiểu gì. Một chuỗi không đối xứng nếu và chỉ nếu nó có phần
giữa thuộc kiểu này. Có các xâu chuỗi không đối xứng “cơ bản”, và vì vậy có thể đưa
ra định nghĩa của N:
1. Cho bất cứ A {a, b}*, aAb và bAa tồn tại trong N.
2. Cho bất cứ S N, aSa và bSb tồn tại trong N.
3. Không tồn tại các xâu chuỗi khác trong N.
Để tồn tại văn phạm phi ngữ cảnh mô tả N, bây giờ có thể giới thiệu một cách
đơn giản một biên A thứ 2, biễu diễn cho một phần tử bất kỳ của {a, b}*, và kết hợp
các qui tắc văn phạm cho ngôn ngữ này từ ví dụ 6.1:
S → aAb | bAa | aSa | bSb
A → A | Aa | Ab
Một dẫn xuất của chuỗi không đối xứng abbaaba, ví dụ như sau:
S ⇒ aSa ⇒ abSba ⇒ abbAaba ⇒ abbAaaba ⇒ abbAaaba = abbaaba
KHMTK12 - Nhóm 7 5
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
Nói chung và thường cần thiết nên bao gồm một vài biến trong văn phạm phi
ngữ cảnh mô tả ngôn ngữ L. Sẽ vẫn có một biến đặc biệt để biễu diễn một chuỗi tùy

ý trong L, và thông thường để chứng tỏ một chuỗi S (biến bắt đầu). Sau đó, các biến
khác có thể xem như các chuỗi đặc trưng trong các ngôn ngữ hỗ trợ chắc chắn bao
hàm trong định nghĩa của L. (Chúng ta có thể vẫn giải thích văn phạm như định
nghĩa qui nạp của L, nếu mở rộng khái niệm qui nạp một cách không đáng kể bao
hàm cả ý tưởng của qui nạp lẫn nhau: đúng hơn một đối tượng được định nghĩa trong
các thời kỳ của chính nó, một vài đối tượng được định nghĩa trong các thời kỳ lẫn
nhau.)
Một định nghĩa tổng quát đưa ra từ các ví dụ này:
Giả sử G = (V, ∑, P, S) là một CFG. Như trong 3 ví dụ đầu, chúng ta sẽ duy trì
ký hiệu → cho các dẫn xuất riêng biệt trong P. Sử dụng ký hiệu ⇒ cho các bước
trong một dẫn xuất như trong ví dụ 6.1 và 6.3. Trong 1 vài trường hợp, nó hữu ích để
chỉ định rõ ràng dẫn xuất chi tiết tới văn phạm G, và trong trường hợp này, ghi là ⇒
G
.
α ⇒
G
β
nghĩa là xâu chuỗi β có thể chứa trong xâu chuỗi α bằng cách thay thế một vài biến
xuất hiện trên phần bên trái của một dẫn xuất trong G bởi phần bên phải tương ứng,
hoặc là:
α = α
1

2
β = α
1
ϒα
2
Và một trong các dẫn xuất trong G là A → ϒ. (Bây giờ có thể hiểu rõ hơn về
phần phi ngữ cảnh. Nếu tại một vài điểm trong một dẫn xuất, chúng ta đã duy trì một

xâu chuỗi α chứa biến A, thì có lẽ tiếp tục bằng cách thay thế ϒ cho A, không vấn đề
gì cho các xâu chuỗi α
1


α
2
không phụ thuộc vào ngữ cảnh.)
Trong trường hợp này, chúng ta sẽ nói rằng α dẫn xuất β, hoặc β được dẫn
xuất từ α, trong từng bước. Tổng quát là:
α ⇒
*
G
β
(và có thể ngắn gọn hơn α ⇒
*
β nếu không bao hàm văn phạm) nếu α dẫn xuất β
trong các bước hoặc không bước nào; hoặc α = β, hoặc thoát khỏi 1 số nguyên k ≥ 1
KHMTK12 - Nhóm 7 6
Định nghĩa 6.1: Định nghĩa của văn phạm phi ngữ cảnh
Một văn phạm phi ngữ cảnh (CFG) là 1 bộ G =(V, ∑, P, S), mà trong đó: V và
∑ là các tập hữu hạn tách rời nhau, S là một phần tử của V, và P là một tập hữu hạn
của các cách thức theo dạng A → α, mà A ∈ V và α ∈ (V ∪ ∑)*.
Các phần tử của V được gọi là biến, hoặc ký hiệu không chưa kết thúc, và các
phần tử của bảng chữ cái ∑ được gọi là ký hiệu kết thúc, hoặc điểm kết thúc. S được
gọi là ký hiệu bắt đầu; và các phần tử của P gọi là các qui tắc văn phạm, hoặc các
dẫn xuất.
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
và các xâu chuỗi α
0

,

α
1
, …, α
k
, với α
0
= α và α
k
= β, đến nỗi α
i

G
α
i+1
cho mỗi i với
0 ≤ i ≤ k -1.
Ví dụ 6.4: Ngôn ngữ của các biểu thức đại số.
Một ngôn ngữ quan trọng trong khoa học máy tính là ngôn ngữ của các biểu
thức đại số hợp lệ. Đơn giản, chúng ta hạn chế một vài biểu thức đơn mà có thể định
dạng cho 4 toán tử hai ngôi +, -, *, /, dấu ngoặc đơn trái và phải, và định danh đơn a.
Một vài tính năng bỏ quên, vì vậy các toán tử một ngôi, bất cứ các toán tử hai ngôi
khác ngoài 4 toán tử trên, số nguyên mẫu như là 3.0 hoặc …, các biểu thức bao gồm
chú thích mang tính chức năng, và nhiều định danh chung hơn. Hầu hết các chức
năng có thể được xử lý đủ đơn giản; ví dụ như, ngôn ngữ của các định danh bất kỳ có
thể được “thêm vào” các chức năng này bằng cách sử dụng biến A mặc dù ký hiệu
kết thúc a và mô tả dẫn xuất cho phép bất cứ định danh được dẫn xuất từ A (Xem ví
dụ 3.5 và 3.6.)
Một định nghĩa qui nạp của ngôn ngữ được dựa trên sự theo dõi mà các biểu

thức hợp lệ có thể được định dạng bằng cách nối 2 biểu thức hợp lệ sử dụng một
trong bốn toán tử hoặc bằng cách đóng biểu thức hợp lệ với dấu ngoặc đơn, và 2 tài
khoản điều hành này cho tất cả các biểu thức hợp lệ ngoại trừ định danh đơn a. Cách
dễ hiểu nhất cho văn phạm phi ngữ cảnh, vì vậy, có lẽ là dùng các dẫn xuất
S → S + S | S – S | S * S | S/S | (S)| a
Xâu chuỗi a + (a * a)/a – a có thể bao hàm từ dẫn xuất
S ⇒ S – S ⇒ S + S –S ⇒ a + S – S ⇒ a + S/S – S
⇒ a + (S)/S – S ⇒ a + (S * S)/S – S ⇒ a + (a * S)/S – S
⇒ a + (a * a)/S – S ⇒ a + (a * a)/a – S ⇒ a + (a * a )/a – a
Dễ dàng nhìn thấy có nhiều dẫn xuất khác cũng tốt. Ví dụ:
S ⇒ S/S ⇒ S + S/S ⇒ a + S/S ⇒ a + (S)/S
⇒ a + (S * S)/S ⇒ a + (a * S)/S ⇒ a + (a * a)/S
⇒ a + (a * a )/S - S ⇒ a + (a * a)/a – S ⇒ a + (a * a)/a –a
Lần đầu dẫn xuất thường nguyên mẫu hơn lần thứ 2. Các bắt đầu lần đầu với dẫn
xuất:
S → S – S
KHMTK12 - Nhóm 7 7
Định nghĩa 6.2: Ngôn ngữ được phát sinh từ một CFG
Cho G =(V, ∑, P, S) là 1 CFG. Ngôn ngữ được phát sinh bởi G là
L(G) = {x ∈ ∑* | S ⇒
*
G
x}
Một ngôn ngữ L là ngôn ngữ phi ngữ cảnh (CFL) nếu có một CFG G mà L = L(G).
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
và vì vậy chỉ định làm sáng tỏ các biểu thức nguyên mẫu, sự khác nhau giữa nó với
các biểu thức khác. Điều này dường như đúng bới biểu thức thường được đánh giá
như sau:
1. Đánh giá a * a, và gọi nó có giá trị A.
2. Đánh giá A/a, và gọi nó có giá trị B.

3. Đánh giá a + B, và gọi nó có giá trị C.
4. Đánh giá C – a.
Biểu thức “là” khác với biểu thức con với giá trị C và biểu thức con a. Dẫn
xuất thứ 2, trái ngược hoàn toàn, làm sáng tỏ biểu thức như kết quả phép chia. Mặc
dù không cò gì trong văn phạm ảnh hưởng đến dẫn xuất này, nó không phản ánh cách
nhìn nhận về cấu trúc đúng của biểu thức.
Phần kết thúc có thể tồn tại trong văn phạm phi ngữ cảnh dành cho ngôn ngữ
có lẽ không là thích hợp nhất. Nó không kết hợp chặt chẽ theo bất cứ cách qui ước
chuẩn, phải thực hiện với quyền ưu tiên của các toán tử và theo thứ tự tính toán từ
trái qua phải, được áp dụng tính toán biểu thức.(Quyền ưu tiên của các toán tử được
áp dụng trong biểu thức a + b * c, phép nhân được thực hiện trước phép cộng; và biểu
thức a – b + c có nghĩa (a - b) + c), không phải a- (b + c). Tuy nhiên, việc chọn giữa
hai dẫn xuất của một xâu chuỗi, nó thường mong đợi chọn lựa, nếu có thể, một CFG
cho một xâu chuỗi có thể chỉ có một dẫn xuất (ngoại trừ sự khác nhau không đáng kể
giữa thứ tự hai biến trong một vài chuỗi trung gian được chọn để thay thế). Chúng ta
sẽ gặp lại câu hỏi này trong phần 6.4, khi thảo luận về sự nhập nhằng trong văn phạm
phi ngữ cảnh.
Ví dụ 6.5: Cú pháp của ngôn ngữ lập trình
Ngôn ngữ trong các ví dụ trước và ngôn ngữ giống như ví dụ 3.5 và 3.6 là các
thành phần đơn giản có liên quan với nhau của ngôn ngữ lập trình như C và Pascal.
Để mở rộng hơn, văn phạm phi ngữ cảnh có thể được dùng đê mô tả cú pháp tổng thể
của ngôn ngữ.
Trong C, việc thử định dạng các qui tắc văn phạm để chỉ rõ cú pháp của câu
lệnh hợp lệ. (Như ngoại lệ, một chỉ định hoàn thành cũng bao gồm.). Hai kiểu của câu
lệnh trong C là câu lện if và câu lệnh for; nếu biễu diễn câu lệnh bất kỳ với các biến
(câu lệnh), kết quả câu lện giống như:
(câu lệnh) → … | (câu lệnh if) | (câu lệnh for ) |
Cú pháp của 2 kiểu câu lệnh này có thể được mô tả bởi các qui tắc:
(câu lệnh if) → if ({biểu thức}) {câu lệnh}
(câu lệnh for) → for({biểu thức}; (biểu thức)) {câu lệnh}

Mà {biểu thức}là biến khác, kết quả cũng khó khăn để mô tả một cách hoàn thành.
KHMTK12 - Nhóm 7 8
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
Mặc dù trong cả hai trường hợp, phần cuối trên phần bên phải chỉ rõ câu lệnh
đơn, tính logic của chương trình thường yêu cầu nhiều hơn một. Vì vậy, thật cần thiết
cho định nghĩa của {câu lệnh }cho phép một câu lện kép, đơn giản là thứ tự của
nhiều câu lệnh hoặc không được đóng bởi {}. Có thể dễ dàng viết định nghĩa cho
{câu lệnh kép}cho trường hợp này. Mô hình cú pháp như sự trình bày thiết lập cho
cùng loại.

{câu lệnh }
Một phần thông qua mô hình bắt đầu với {, kết thúc với}, và có thể vượt qua
vòng lặp nhiều lần hoặc không lần nào.
Ví dụ 6.6: Các qui tắc văn phạm cho tiếng Anh.
Ưu điểm của việc sử dụng ngôn ngữ lập trình bậc cao giống như C và Pascal
mà cho phép chúng để viết các câu lệnh giống như tiếng Anh. Nếu có thể sử dụng
văn phạm phi ngữ cảnh để nắm bắt nhiều qui tắc của các ngôn ngữ lập trình, mà về
chính tiếng Anh, tuân theo “các qui tắc văn phạm” hay không ?
Các câu tiếng Anh mà đơn giản đầy đủ có thể được mô tả bởi CFGs. Nhiều
câu phức tạp có thể phân tích bởi tính dẫn xuất
{câu tường thuật} → {mệnh đề chủ ngữ}{mệnh đề động từ} {bổ ngữ}|
{mệnh đề chủ ngữ}{mệnh đề động từ}
Nếu cung cấp các lý do cho mỗi phần của ba biến ở phần bên phải. Tạo các lý
do khác nhau, các câu tiếng Anh có nhiều thành ngữ với văn phạm phi ngữ cảnh,
thậm chí văn phạm phi ngữ cảnh với kích thước giới hạn, thì không khó; cái khó là
làm điều này và tại cùng thời điểm không cho phép câu nói sai ngữ pháp. Thậm chí
khó hơn là các câu không tuân theo cú pháp tiếng Anh nhưng với người nói tiếng
Anh gốc có lẽ sẽ không bao giờ nói, bởi vì họ không phát âm đúng.
Ví dụ đơn giản này có lẽ minh họa cho điểm. Xem xét các dẫn xuất:
{câu tường thuật}→ {chủ ngữ}{động từ}{bổ ngữ}

{chủ ngữ} → {danh từ thích hợp}
{danh từ thích hợp} → John | Jane
{động từ} → nhớ
{bổ ngữ} → {danh từ thích hợp} | {đại từ phản thân}
{đại từ phản thân} → himself | herself
Nhiều hơn một câu lệnh tuân theo văn phạm này không hoàn toàn làm việc, ví
dụ: “John nhớ chính cô ấy” và “Jane nhớ chính cậu ấy”. Điều này có thể được lọa
KHMTK12 - Nhóm 7 9
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
trừ trong cách thức dễ hiểu (bao gồm sự phức tạp của văn phạm ) bằng cách đưa ra
dẫn xuất giống như:
{câu tường thuật} → {danh từ giống đực}{động từ}{đại từ phản thân giống
đực}
Rõ ràng hơn nhiều vấn đề tinh tế là “Jane nhớ Jane”. Bình thường, chúng ta
không nói như vậy, trừ khi có 2 người khác nhau nhưng trùng tên, nhưng không có
cách rành mạch để ngăn cấm điều đó và cũng không ngăn cấm “Jane nhớ John”. (Ít
nhất, không có cách rõ ràng thật sự cần thiết sử dụng một dẫn xuất khác nhau cho
mỗi câu). Tùy chọn không đáng kể này có sẵn, kể từ khi ngôn ngữ có ngôi. Để phân
biệt “Jane nhớ John,” là một câu tiếng Anh tốt một cách hoàn hảo, từ “Jane nhớ
Jane” yêu cầu sử dụng ngữ cảnh và một cách chính xác điều này văn phạm phi ngữ
cảnh không cho phép.
6.2 Các ví dụ mở rộng.
Nói chung, để trình bày một ngôn ngũ CFG tổng quát, chúng ta phải trình bày
hai điều: thứ nhất mỗi xâu chuỗi trong ngôn ngữ có thể được dẫn xuất từ văn phạm,
và thứ hai, không xâu chuỗi nào khác có thể. Trong một vài ví dụ trong phần này, ít
nhất một trong hai câu này ít rõ ràng hơn.
Ví dụ 6.7: Một CFG cho {x | n
0
(x) = n
1

(x)}
Xem xét ngôn ngữ
L = {x ∈ {0,1}* | n
0
(x) = n
1
(x)}
mà n
i
(x) là số của i’s trong xâu chuỗi x.
Như trong ví dụ 6.1 – 6.3, chúng ta có thể bắt đầu nghĩ về một định nghĩa qui
nạp của L, và một lần tìm thấy một. Chúng ta có thể dễ dàng chuyển nó về văn phạm
phi ngữ cảnh.
Một cách rõ ràng, A ∈ L. Cho xâu chuỗi x trong L, sẽ tạo 1 xâu chuỗi dài hơn
trong L bằng cách thêm một số 0 và một số 1. (Ngược lại, bất cứ xâu rỗng trong L có
thể được dùng theo cách này). Một cách để thêm một ký hiệu vào điểm cuối, thực
hiện hoặc 0x1 hoặc 1x0. Nó gợi ý cho dẫn xuất :
S → A | 0S1 | 1S0
Không có xâu chuỗi nào trong L có thể chứa trong các dẫn xuất này, bởi vì các
phần tử của L bắt đầu và kết thúc với cùng ký hiệu ; các xâu chuỗi 0110, 10001101,
và 0010111100 là ví dụ. Nếu tìm kiếm các cách thức nhấn mạnh mỗi phần này trong
các đọan của các phần tử đơn giản của L, chú ý mỗi phần tử trong sự kết hợp hai
phần tử không rỗng của L (ví dụ, xâu chuỗi thứ ba là sự kết hợp của 001011 và
1100). Nhận xét này gợi ý dẫn xuất S → SS.
Lý do rõ ràng nếu G là một CFG chứa các dẫn xuất thì
S → A | 0S1 | 1S0 | SS
sau đó sự dẫn xuất trong G tạo duy nhất xâu chuỗi trong L. Sẽ xác nhận ngược lại,
rằng L ⊆ L (G)
KHMTK12 - Nhóm 7 10
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8

Sẽ hỗ trợ khi giới thiệu :
d(x) = n
0
(x) – n
1
(x)
Vì vậy, cho bất cứ xâu chuỗi x với d(x) = 0, x ∈ L(G). Chứng minh tính toán học trên
|x|.
Trong bước cơ bản của chứng minh, chúng ta phải trình bày rằng nếu |x| = 0 và
d(x) = 0 (tất nhiên, giả thuyết thứ 2 là thừa), sau đó x ∈ L(G). Điều nầy đúng bởi vì
một trong các dẫn xuất trong G là S → A.
Theo giả thuyết ban đầu, k ≥ 0 và cho bất cứ y với |y| ≤ k và d(y) = 0, y ∈
L(G). Nếu |x| = k + 1 và d(x) = 0, thì x ∈ L(G).
Nếu x bắt đầu 0 và kết thúc 1, thì x = 0y1 cho vài xâu chuỗi y thỏa mãn d(y) =
0. Theo giả thuyết ban đầu, y ∈ L(G). Vậy, khi S ⇒
*
G
y, dẫn xuất x từ S bắt đầu với
dẫn xuất S → 1S0 và tiếp tục dẫn xuất y từ S thứ hai. Khi x bắt đầu 1 kết thúc 0 thì
được xử lý cùng cách, ngoại trừ S → 1S0 thường bắt đầu dẫn xuất.
Trường hợp còn lại x bắt đầu và kết thúc cùng ký hiệu . Khi d(x) = 0 có chiều
dài ít nhất 2; giả định x = 0y0 cho vài xâu chuỗi y. Chúng ta nên trình bày x là một
dẫn xuất trong G. Một dẫn xuất phải bắt đầu với sản phẩm S → SS; để trình bày đó
là một dẫn xuất thì phải x = wz, trong đó w và z là các xâu chuỗi ngắn có thể được
dẫn xuất từ S (có thể cho phép dẫn xuất với S → SS, sau đó tiếp tục dẫn xuất w từ S
ban đầu và z từ S tiếp theo.). Cách khác để nhấn mạnh điều kiện này thì cho rằng x là
tiền tố của w sao cho 0 < |w| < |x| và d(w) = 0.
Cho d(w) có tiền tố w của x. Tiền tố ngắn nhất không rỗng là 0, và d(0) = 1;
tiền tố dài nhất ngắn hơn x là 0y, và d(0y) = -1 (bởi ký hiệu cuối cùng của x là 0, và
d(x) =0). Hơn nữa, giá trị d- của tiền tố thay đổi bằng 1, một ký hiệu mở rộng được

thêm vào mỗi lần. Có thể là tiền tố w, dài hơn 0 và ngắn hơn 0y, với d(w) = 0. Đó là
kết quả cần đạt. Trường hợp khi x = 1y1 là như nhau, và sự chứng minh hoàn thành.
Ví dụ 6.8: CFG khác cho {x | n
0
(x) = n
1
(x)}
Tiếp tục với ngôn ngữ L ={x ∈ {0,1}* | n
0
(x) = n
1
(x)} cho ví dụ sau cùng;
chúng ta xây dựng một CFG với 3 biến, dựa trên cách thức khác nhau để định nghĩa
quy nạp cho L.
Để bao hàm một phần tử của L là thêm cả hai ký hiệu thành xâu chuỗi sẵn có
trong L. Tuy nhiên, cách khác là thêm một ký hiệu đơn vào xâu chuỗi rất hiếm thấy
của ký hiệu ngược nhau. Hơn nữa, mối phần tử của L có thể được bao hàm cách thức
này và trong thực tế có thể được bào hàm bằng cách thêm ký hiệu mở rộng tại vị trí
bắt đầu. Khai báo biến A và B, để biễu diễn các xâu chuỗi với ngoài 1 và ngoài 0,
một cách tách biệt và biễu diễn hai ngôn ngữ L
0
và L
1
:
L
0
= {x ∈ {0,1}* | n
0
(x) = n
1

(x) + 1} = {x ∈ {0,1}* | d(x) = 1}
L
1
= {x ∈ {0,1}* | n
0
(x) = n
1
(x) + 1} = {x ∈ {0,1}* | d(x) = -1}
trong đó: d là hàm trong ví dụ 6.7 được định nghĩa d(x) = n
0
(x) – n
1
(x). Thật dễ dàng
để tính toán kết quả cần bắt đầu với S:
S → 0B | 1A | A
KHMTK12 - Nhóm 7 11
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
Cũng dễ dàng để tìm thấy kết quả cho mỗi biến A và B. Nếu một xâu chuỗi trong L
0
bắt đầu với 0, hoặc nếu một xâu chuỗi trong L
1
bắt đầu với 1, thì đó là một phần tử
của L. Do vậy, kết quả thích hợp là:
A → 0S B → 1S
Nếu một xâu chuỗi trong L
0
bắt đầu với 1, hoặc nếu một xâu chuỗi trong L
1
bắt đầu
với 0

Trong trường hợp đầu, nếu x = 1y và x ∈ L
0
thì y có nhiều 0 hơn 1. Và y có thể được
viết như sự kết hợp hai xâu chuỗi, mỗi xâu ngoài 0, và cho kết quả hoàn chỉnh
A- bằng cách thêm A → 1AA, và xử lý B tương tự.
Sử dụng cùng kỹ thuật trong ví dụ 6.7 ở đây. Nếu d(x) = 1 và x = 1y, A là tiền tố của
y với d(A) = 0, và chính y là tiền tố của y với d(y) = 2. Vì vậy, có một vài tiền tố
trung gian w của y với d(w) = 1, và y = wz trong đó w,z ∈ L
0
.
Thảo luận này ít nhất hợp lý cho CFG với các kết quả
S → 0B | 1A | A
A → 0S | 1AA
B → 1S | 0BB
phát sinh ngôn ngữ L. Để bắt đầu biến là A hoặc B, chỉ có thể là một CFG phát sinh
L
0
hoặc L
1
. Không khó để đưa ra sự kiểm chứng; xem bài tập 6.50.
Định lý sau cung cấp ba cách đơn giản của việc chứa một CFG mới từ các
ngôn ngữ được cho là phi ngữ cảnh
Chứng minh:
Xây dựng chứng minh: Bắt đầu với CFGs
G
1
= (V
1
, ∑
1

, S
1
, P
1
) và G
2
= (V
2
, ∑
2
, S
2
, P
2
)
phát sinh L
1
và L
2
, một cách riêng biệt, và cách xây dựng một CFG mới cho ba trương
hợp cụ thể.
Văn phạm G
u
= (V
u
, ∑
u
, S
u
, P

u
) phát sinh L
1
∪ L
2
. Đầu tiên, nếu cần thiết thay
đổi tên các phần tử của V
2
sao cho V
1
∩ V
2
= ∅, và có
V
u
= V
1


V
2
∪ {S
u
}
Trong đó S
u
là ký hiệu mới không có trong V
1
hoặc V
2

. Sau đó:
P
u
= P
1


P
2
∪ {S
u
→ S
1
| S
2
}
Nếu x có trong L
1
hoặc trong L
2,
thì S
u

*
x trong văn phạm G
u
, bởi có thể bắt đầu dẫn
xuất với S
u
→ S

1
hoặc S
u
→ S
2
và tiếp tục với dẫn xuất của x trong G
1
hoặc G
2
. Do đó.
KHMTK12 - Nhóm 7 12
Định lý 6.1:
Nếu L
1
và L
2
là ngôn ngữ phi ngữ cảnh thì ngôn ngữ L
1
∪ L
2
, L
1
L
2
, và L
1
*
cũng
là CFL.
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8

L = L
1


L
2
⊆ L(G
u
)
Mặt khác, nếu x là dẫn xuất từ S
u
trong G
n,
bước đầu tiên trong bất cứ dẫn xuất phải là
S
u
⇒ S
1
hoặc S
u
⇒ S
2
Trong trường hợp đầu, tất cả các kết quả xảy ra thường phải là kết quả trong G
1
, bởi
không có biến trong V
2
được xét, và x ∈ L
1
; trong trường hợp 2, x ∈ L

2
. Do đó,
L(G
u
) ⊆ L
1


L
2
Văn phạm G
c
= (V
c
, ∑
c
, S
c
, P
c
) phát sinh L
1
L
2.
Chúng ta đánh nhãn lại các biến nếu
cần thiết sao cho V
1
∩ V
2
= ∅, và định nghĩa

V
c
= V
1


V
2
∪ {S
c
}
Lần này, ta có
P
c
= P
1


P
2
∪ {S
c
→ S
1
S
2
}
Nếu x ∈ L
1
L

2,
thì x = x
1
x
2
, trong đó x
i
∈ L
i
ứng với i. Khi dẫn xuất x trong G
c
như
sau:
S
c
⇒ S
1
S
2

*
x
1
S
u

*
x
1
x

2
= x
Bước thứ 2 là dẫn xuất của x
1
trong G
1
và bước thứ 3 là dẫn xuất của x
2
trong
G
2
. Ngược lại, nếu x có thể được dẫn xuất từ S
c
, thì ở bước 1, trong dẫn xuất phải là
S
c
⇒ S
1
S
2,
x phải được dẫn xuất từ S
1
S
2
. Do đó, x = x
1
x
2
, trong đó ứng với mỗi i, x
i


thể được dẫn xuất từ S
i
trong G
c.
Khi V
1
∩ V
2
= ∅, được dẫn xuất từ S
i
trong G
c

nghĩa là được dẫn xuất từ S
i
trong G
i
, và x ∈ L
1
L
2
.
Văn phạm G
*
= (V, ∑, S, P) phát sinh L
1
*
. Cho
V= V

1


{S}
trong đó S ∉ V
1
. Ngôn ngữ L
1
*
chứa các xâu chuỗi có dạng x = x
1
x
2
…x
k
, trong đó mỗi
x
i
∈ L
1
. Khi mỗi x
i
có thể được dẫn xuất từ S
1
, thì dẫn xuất x từ S đủ khả năng dẫn
xuất một xâu chuỗi của k S
1

s. Có thể thực hiện như đưa ra kết quả
S → S

1
S | A
trong P. Do đó,
P = P
1


{S → S
1
S | A}
Chứng tỏ L
1
*
⊆ L(G
*
) rõ ràng. Nếu x ∈ L(G
*
), thì x = A hoặc x có thể được dẫn xuất
từ một vài xâu chuỗi của dạng S
1
*
trong G
*
. Trong trường hợp 2, khi duy nhất kết quả
trong G
*
bắt đầu với S
1
thuộc trong G
1

, bao gồm cả
x ∈ L(G
1
)
k
⊆ L(G
1
)
*
Chú ý: Thật sự cần thiết cho 2 phần đầu của chứng minh đảm bảo V
1
∩ V
2
= ∅. Cho
CFG có các kết quả:
S
1
→ XA X → c A → a

KHMTK12 - Nhóm 7 13
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
S
1
→ XB X → d B → b
riêng biệt. Nếu chúng ta cung cấp cấu trúc cho phần đầu của chứng minh không đặt
nhãn lại cho biến, kết quả văn phạm cho phép dẫn xuất
S ⇒ S
1



XA



dA ⇒

da
thậm chí da không được dẫn xuất từ cả 2 văn phạm nguyên mẫu.
Hệ quả 6.1 : Mỗi ngôn ngữ có qui tắc là một CFL.
Chứng minh :
Theo định nghĩa 3.1, các ngôn ngữ có qui tắc trên ∑ là các ngôn ngữ được
chứa từ ∅, {A}, và {a}(a ∈∑), sử dụng các phép tính kết hợp, ghép nối và Kleene
*
. Mỗi
ngôn ngữ chính ∅, {A}, và {a} là một ngôn ngữ phi ngữ cảnh. (Trong trường hợp đầu,
chúng ta có thể sử dụng văn phạm bình thường không cần kết quả, và trong hai trường hợp
khác, một kết quả là đủ).
Vì vậy hệ quả theo định lý 6.1, sử dụng giả thuyết cấu trúc của nguyên tắc.
Ví dụ 6. 9 : Một CFG tương đương một biểu thức qui tắc
Cho L là ngôn ngữ tương đương với biểu thức qui tắc
(011 + 1)
*
(01)
*
Chúng ta có thể nắm bắt một vài công thức hiển nhiên trong thuật toán được chứng
minh bởi định lý 6.1. Dẫn xuất
A → 011 | 1
phát sinh ngôn ngữ {011,1}. Theo phần ba của định lý, chúng ta có thể dùng các dẫn
xuất
B → AB | A

A → 011 | 1
với B như ký hiệu bắt đầu để phát sinh {011, 1}*. Tương tự
C → DC | A
D → 01
Dẫn xuất {01}
*
từ ký hiệu bắt đầu C. Cuối cùng, chúng ta phát sinh ghép nối 2 ngôn
ngữ bằng cách thêm dẫn xuất S → BC. Văn phạm cuối có ký hiệu bắt đầu S, biến phụ
trợ A, B, C và D, và các dẫn xuất:
S → BC
B → AB | A
A → 011 | 1
C → DC | A
D → 01
KHMTK12 - Nhóm 7 14
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
Bắt đầu với bất cứ biểu thức qui tắc, chúng ta có thể bao hàm tương đương CFG sử
dụng kỹ thuật minh họa trong ví dụ này. Trong phần kế tiếp, bất cứ ngôn ngữ qui tắc
L cũng có thể được mô tả bởi một CFG, mà tất cả các dẫn xuất có dạng rất đơn giản,
và như một CFG có thể được bao hàm dễ dàng từ 1 FA chấp nhận L.
Ví dụ 6.10: Một CFG cho {x | n
0
(x) ≠ n
1
(x)}
Cho ngôn ngữ L = {x ∈ {0,1}
*
| n
0
(x) ≠ n

1
(x)}
Cả hai CFG đều không tìm thấy trong ví dụ 6.7 và 6.8 cho bổ ngữ của L một cách
đặc biệt. Như trong chương 8, không có kỹ thuật chung cho việc tìm kiếm một văn
phạm phát sinh bổ ngữ của CFL đã cho, trong một vài trường hợp không phải tất cả
đều là ngôn ngữ phi ngữ cảnh. Tuy nhiên, có thể nhấn mạnh L như việc kết hợp các
ngôn ngữ L
0
và L
1
, trong đó
L
0
= {x ∈ {0,1}
*
| n
0
(x) > n
1
(x)}
L
1
= {x ∈ {0,1}
*
| n
1
(x) > n
0
(x)}
và có thể kết hợp tìm kiếm một CFG G

0
phát sinh L
0
. Rõ ràng 0 ∈ L
0
, và cho bất cứ x
∈ L
0
sẽ luôn luôn giới thiệu một phần tử x0 và 0x trong L
0
. Điều này gợi ý dẫn xuất
S → 0 | S0 | 0S
Cũng cần thêm 1’s vào các xâu chuỗi. Và không thể ngoại trừ thêm 1 vào một phần
tử của L
0
, luôn luôn đưa ra một phần tử L
0
; tuy nhiên, nếu có 2 xâu chuỗi trong L
0
,
ghép nối chúng thành chuỗi có ít nhất 2 chuỗi nhiều 0’s hơn 1’s và sau đó thêm 1 đơn
sẽ vẫn là một phần tử của L
0
. Chúng ta có thể thêm ở bên trái, bên phải hoặc ở giữa
hai chuỗi. Kết quả tương ứng
S → 1SS | SS1 | S1S
Không khó để nhìn thấy bất cứ xâu chuỗi nào được dẫn xuất từ kết quả trên
S → 0| S0 | 0S | 1SS | SS1 | S1S
là một phần tử của L
0

(xem bài tập 6.43). Trong đảo ngược trực tiếp, chúng ta có thể
làm tốt hơn: nếu G
0
là văn phạm với kết quả
S → 0| 0S | 1SS | SS1 | S1S
mỗi chuỗi trong L
0
có thể được dẫn xuất trong G
0
.
Chứng minh đưa ra độ dài của xâu chuỗi. Xét trường hợp khó nhất, những
trường hợp còn lại giải quyết trong bài tập. Như ví dụ trước, cho d(x) = n
0
(x) – n
1
(x).
Bước cơ bản, cho một xâu chuỗi trong L
0
của chiều dài 1, là rõ ràng. Mục tiêu k ≥ 1
và bất cứ x sao cho |x| ≤ k và d(x) > 0 có thể được dẫn xuất trong G
0
; và xét một xâu
chuỗi x sao cho |x| = k+1 và d(x) > 0.
Xét trường hợp x = 0y0 cho vài xâu chuỗi y. Nếu x chỉ chứa 0’s, nó có được
dẫn xuất từ S sử dụng kết quả S → 0 | 0S; vì vậy x chứa ít nhất một xâu 1. Kết quả
biễu diễn x có dạng
x = w1z cho vài w và z với d(w) > 0 và d(z) >0.
KHMTK12 - Nhóm 7 15
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
Giả thuyết ban đầu, cả hai w và z có thể được dẫn xuất từ S, sao cho có thể dẫn xuất

x với dẫn xuất ban đầu:
S → S1S
Biễu diễn x có định dạng trên, x chứa n xâu chuỗi 1, với n ≥ 1. Cho mỗi i với 1 ≤ i ≤
n, cho w
1
là tiền tố của x nhưng không bao hàm chuỗi 1 thứ i, và z
i
là hậu tố của x
cho phép chuỗi 1. Trường hợp khác, với mỗi i,
x = w
i
1z
i
trong đó 1 là xâu thứ I trong x. Nếu d(w
n
) > 0, thì w = w
n
và z = z
n
. Xâu chuỗi z
n
là 0
j
với j > 0 bởi x kết thúc với 0, và cho kết quả cần. Ngoài ra, d(w
n
) ≤ 0. Trong trường
hợp này, chọn i đầu tiên với d(w
n
) ≤ 0, khi đó i = m. Khi x bắt đầu với 0, d(w
1

) phải
>0, và m ≥ 2. Tại điểm này, d(w
m-1
) > 0 và d(w
m
) ≤ 0. Bởi w
m
duy chỉ có nhiều 1 hơn
w
m-1
, d(w
m-1
) không có nhiều hơn 1. Do đó, d(w
m-1
) = 1. Khi x = w
m-1
1 z
m-1
, và d(x) >
0, nó cho phép d(z
m-1
) > 0. Điều này có nghĩa kết quả sẽ là w = w
m-1
và z = z
m-1.
Chứng minh hoàn thành.
Cho hai trường hợp khác, một là x bắt đầu với 1 và hai là x kết thúc với 1, xem bài
tập 6.44.
Lúc này, nó đủ khả năng bao hàm văn phạm phi ngữ cảnh G phát sinh L. Sử dụng S
như ký hiệu bắt đầu của văn phạm vừa dẫn xuất phát sinh L

0
và B như ký hiệu bắt
đầu cho văn phạm tương ứng phát sinh L
1
. Văn phạm G có các dẫn xuất:
S → A | B
A → 0 | 0A | 1AA | AA1 | A1A
B → 1 | 1B | 0BB | BB0 | B0B
Ví dụ 6.11: Ứng dụng khác của Định lý 6.1
Cho L = {0
i
1
j
0
k
| j > i + k}. Giả định xem L như ghép nối của các ngôn ngữ phi
ngữ cảnh, mặc dầu hiển nhiên như vậy – viết L như 1 ghép nối L
1
L
2
L
3
, trong đó 3
ngôn ngữ này chứa các xâu chuỗi của 0, các xâu chuỗi của 1 riêng biệt – được cho
là không có khả năng. L chứa cả hai xâu 0
1
1
3
0
1

và 0
1
1
4
0
2
, nhưng nếu cho phép L
1
chứa 0
1,
L
2
chứa 1
3
, và L
3
chứa 0
2
, thì L
1
L
2
L
3
cũng sẽ chứa 0
1
1
3
0
2

, và xâu chuỗi này
không là phần tử của L.
Nhận xét:
0
i
1
i+k
0
k
= 0
i
1
i
1
k
0
k
Chỉ khác nhau giữa xâu chuỗi này với xâu chuỗi x trong L là: x có ít nhất một xâu
1 mở rộng ở giữa:
x = 0
i
1
i
1
m
1
k
0
k
(với mọi m > 0)

Định dạng đúng cho L là L = L
1
L
2
L
3
, trong đó
L
1
= {0
i
1
i
| i ≥ 0}
L
2
= {1
m
| m > 0}
KHMTK12 - Nhóm 7 16
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
L
3
= {1
k
0
k
| k ≥ 0}
Phần 2 của Định lý 6.1, cung cấp 2 lần, giảm độ phức tạp tìm kiếm CFG cho 3
ngôn ngữ này.

L
1
ngôn ngữ cơ bản trong ví dụ 6.2, L
3
cùng với các ký hiệu 0 và 1 được
nghịch đảo, và L
2
có thể được phát sinh bởi các dẫn xuất
B → 1B | 1
(Dẫn xuất thứ 2 là B → 1, không phải B → A, chỉ với các xâu chuỗi không rỗng.)
CFG cuối cùng G = (V, ∑, S, P) kết hợp chặt chẽ các phần này biễu diễn như
sau:
V = {S, A, B, C} ∑ = {0,1}
P = { S → ABC
A → 0A1 | A
B → 1B | 1
C → 1C0 | A }
Cho ví dụ, dẫn xuất của 01
4
0
2
= (01)(1)(1
2
0
2
) là:
S ⇒ ABC ⇒ 0A1BC ⇒ 0A1BC ⇒ 011C
⇒ 0111C0 ⇒ 01111C00 ⇒ 01111A00 = 0111100
KHMTK12 - Nhóm 7 17
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8

PHẦN 2 – BÀI TẬP
Câu 8:
Viết chương trình RAM chuẩn và RAM thô sơ kiểm tra điều kiện các số a, b, c
cho trước một cách ngẫu nhiên lần lượt là các cạnh và đường chéo của một hình chữ
nhật.
1. Mô phỏng bằng Pascal
;============================================================
; CHUONG TRINH MINH HOA TRONG NGON NGU PASCAL
;============================================================
BEGIN
Read(R1);
Read(R2);
Read(R3);
If (R1 >0) Then
If (R2 > 0) Then
If (R3 > 0) Then
If (R1*R1 + R2*R2 – R3*R3 = 0) Then
Write (1) {thoa dieu kien là 2 canh va duong cheo hcn}
Else Goto NO {khong thoa dieu kien}
Else Goto NO {R3 <= 0)
Else Goto NO {R2 <= 0}
NO: Else Write(0); {khong phai la 2 canh va duong cheo hcn}
END
2. Chương trình RAM chuẩn
;===========================================================
; CHUONG TRINH RAM CHUAN
;===========================================================
Label Command Description
read 1 đọc a vào R1
read 2 đọc b vào R2

read 3 đọc c vào R3
load 1 ACC  <R1> ; ACC=a
jgtz B nếu <ACC> >= 0 nhảy đến B ; a>=0
jmp NO ngược lại thì nhảy đến NO
B: load 2 ACC  <R2> ; ACC=b
jgtz C nếu <ACC> >= 0 nhảy đến C ; b>=0
jmp NO ngược lại thì nhảy đến NO
C: load 3 ACC  <R3> ; ACC=c
KHMTK12 - Nhóm 7 18
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
jgtz T nếu <ACC> >= 0 nhảy đến T ; c>=0
jmp NO
T: load 1 ACC  <R1> ; ACC=a
mul 1 ACC  <ACC> * <R1> ; ACC=a*a
store 1 R1  <ACC> ; R1=a*a
load 2 ACC  <R2> ; ACC=b
mul 2 ACC  <ACC> * <R2> ; ACC=b*b
store 2 R2  <ACC> ; R2=a*a
load 3 ACC  <R3> ; ACC=c
mul 3 ACC  <ACC> * <R3> ; ACC=c*c
sub 1 ACC  <ACC> - <R1> ;ACC=c*c-a*a
sub 2 ACC  <ACC> -<R2> ;ACC=c*c-a*a-b*b
jzero OK nếu <ACC>=0 thì nhảy đến OK
NO: write A:0 ACC  ; là tam giác thường
jump KT nhảy tới KT
OK: write A:1 ACC  1 ; là tam giác vuông
KT: halt dừng chương trình
3. Chương trình RAM thô sơ
;===========================================================
; CHUONG TRINH RAM THÔ SƠ

;===========================================================
Chú thích lệnh:
I <n>: tăng thêm 1 nội dung của thanh ghi n
D <n>:giảm thêm 1 nội dung của thanh ghi n
Z <n>: đặt thanh ghi n về 0
S<n,m>: hoán đổi nội dung của thanh ghi n và m
J <n> (i, j): nếu nội dung của thanh ghi n là 0, nhảy đến lệnh nhãn i, nếu
không nhảy đến nhãn j
HALT : dừng máy
Ý tưởng:
Đầu vào R1=a, R2=b, R3=c (a,b,c nguyên dương)
Đầu ra : R1=1 nếu là 3 cạnh của tam giác vuông, ngược lại R1=0
R4, R5, R6 lần lượt dùng để chứa kết quả a*a, b*b, c*c
R7, R8 làm biến đếm trong vòng lặp
Label Command Description
1: Z <4> R4:=0 ( R4 la ket qua a*a)
2: Z <7> R7:=0 (R7 đếm số lần lặp để tính a*a)
KHMTK12 - Nhóm 7 19
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
3: Z <8> R8 :=0 (R8 đếm số lần lặp để tính a*a)
4: J <1> (9,5) nếu R1=0 thì nhảy đến nhãn 9, nếu không thì nhảy đến nhãn 5
5: D <1> giảm R1 đi 1
6: I <4> tăng R4 lên 1
7: I <8> tăng R8 lên 1
8: J <8> (4,4) nếu R8=0 , nhảy đến nhãn 4, ngược lại nhãy đến nhãn 4
9: S <1,4> sau khi hoán đổi R1=a, R4=0; R7=0,R8=a
10: J <1> (15,11) nếu R1=0 thì nhảy đến nhãn 15, ngược lại nháy đến nhãn 11
11: D <1> giảm R1 đi 1
12: I <4> tăng R4 lên 1
13: I <7> tăng R7 lên 1

14: J <7> (10,10) nếu R7=0 thì nháy đến 10, ngược lại nhảy đến 10
15: S <1,7> sau khi hoán đổi thì R1=a, R7=0
16: D <8> giảm R8 đi 1 ;R8=a - số lầnđã lặp
17: J <8> (18,10) nếu R8=0 thì nhảy đến 18, ngược lại thì nhảy đến 10
18: Z <5> đã tính a*a, tiếp tục tính b*b, R5 chứa kết quả, R7, R8 làm biến đếm
19: Z <7> R7 :=0
20: Z <8> R8 :=0
21: J <2> (26,22)nếu R2=0 thì nhảy đến 26, ngược lại nhảy đến 22
22: D <2> giảm R2 đi 1
23: I <5> tăng R5 lên 1
24: I <8> tăng R8 lên 1
25: J <8> (21,21) nếu R8 =0 thì nhảy đến nhãn 21 còn ko thì nhảy đến 21
26: S <2,5> sau khi hoán đổi R2=b,R5=0, R7=R8=b
27: J <2> (32,28) nếu R2 =0 thì nhảy đến 32, ngược lại nhảy đến 28
28: D <2> giảm R2 đi 1
29: I <5> tăng R5 lên 1
30: I <7> tăng R7 lên 1
31: J <7> (27,27) nếu R7=0 thì nhảy đến 27, ngược lại nhảy đến 27
32: S <2,7> sau khi đổi thì R2=b, R7=0
33: D <8> R8 =b – số lần đã lặp
34: J <8> (35,27) nếu R8=0 thì nhảy đến 35, ngược lại là 27
35: Z <6> đã tính b*b, giờ tính c*c, R6 chứa kết quả, R7, R8 làm biến đếm
36: Z <7> R7:=0
37: Z <8> R8:=0
38: J <3> (43,39)nếu R3=0 thì nhảy đến 43, ngược lại nhảy đến 39
39: D <3> giảm R3 đi 1
40: I <6> tăng R6 lên 1
41: I <8> tăng R8 lên 1
42: J <8> (38,38)nếu R8=0 thì nhảy đến nhãn 38, ngược lại nhảy đến nhãn 38
43: S <3,6> sau khi hoán đổi R3=c,R6=0, R7=R8=c

44: J <3> (49,45) nếu R3=0 thì nhảy đến nhãn 49, ngược lại nhảy đến nhãn 45
45: D <3> giảm R3 đi 1
46: I <6> tăng R6 lên 1
47: I <7> tăng R7 lên 1
48: J <7> (44,44) nếu R7=0 thì nhảy đến nhãn 44, ngược lại nhảy đến nhãn 44
49: S <3,7> sau khi hoán đổi R3=c, R7=0
50: D <8 R8 = c – số lần đã lặp
KHMTK12 - Nhóm 7 20
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
51: J <8> (52,44) nếu R8=0 thì nhảy đến nhãn 52, ngược lại nhảy đến nhãn 44, đã
………………………tính được c*c, gio tinh R6-R4
52: J <4> (56,53) nếu R4=0 thì nhảy đến nhãn 56, ngược lại nhảy đến nhãn 53
53: D <4> giảm R4
54: D <6> giảm R6
55: J <6> (52,52) nếu R6=0 thì nhảy đến 52, ngược lại nhảy đến 52
56: J <5> (60,57) giờ tính R6-R4-R5
57: D <5> giảm R5 đi 1
58: D <6> giảm R6 đi 1
59: J <6> (56,56)nếu R6=0 thì nhảy đên 56, ngược lại nhảy đên 56
60: Z <1> R1 chứa kết quả kiểm tra
61: J <6> (62,63) kiểm tra R6=0 thì là ok
62: I <1> là cạnh hình chữ nhật (R1=1)
63: HALT kết thúc
4. Kết quả test chương trình RAM chuẩn
Dòng R1 R2 R3 ACC Nhảy tới
Chú
thích
Input R1=2 R2=3 R3=5
1 2
2 3

3 5
4 2
5 B
B 3
C
C 4 T
T 2
4 ACC*R1
4 R1=ACC
3
9 ACC*R2
9 R2=ACC
5
25 ACC*R3
21 ACC-R1
12 ACC-R2
NO
NO 0 ACC=0
KT
KT dừng CT
5. Kết quả test chương trình RAM thô sơ
Dòng R1 R2 R3 R4 R5 R6 R7 R8
Nhảy
tới
input 3 4 5
KHMTK12 - Nhóm 7 21
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
Dòng R1 R2 R3 R4 R5 R6 R7 R8
Nhảy
tới

1 0
2 0
3 0
4 5
5 2
6 1
7 1
8 4
4 5
5 1
6 2
7 2
8 4
4 5
5 0
6 3
7 3
9 4
4 9
9 3 0
10 11
11 2
12 1
13 1
14 10
10 11
11 1
12 2
13 2
14 10

10 11
11 0
12 3
13 3
14 10
10 15
15 3 0
16 2
17 10
10 11
11 2
12 4
13 1
14 10
10 11
11 1
12 5
KHMTK12 - Nhóm 7 22
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
Dòng R1 R2 R3 R4 R5 R6 R7 R8
Nhảy
tới
13 2
14 10
10 11
11 0
12 6
13 3
14 10
10 15

15 3 0
16 1
17 10
10 11
11 2
12 7
13 1
14 10
10 11
11 1
12 8
13 2
14 10
10 11
11 0
12 9
13 3
14 10
11 16
15 3 0
17 0 tinh duoc 3*3
18 0 19
19 0 20
20 0
21 22
22 3 23
23 1 24
24 1 25
25 21
21 22

22 2 23
23 2 24
24 2 25
25 21
21 22
22 1 23
23 3 24
24 3 25
25 21
KHMTK12 - Nhóm 7 23
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
Dòng R1 R2 R3 R4 R5 R6 R7 R8
Nhảy
tới
21 22
22 0 23
23 4 24
24 4 25
25 21
21 4 0 26
27 28
28 3 29
29 1 30
30 1 31
31 27
27 28
28 2 29
29 2 30
30 2 31
31 27

27 28
28 1 29
29 3 30
30 3 31
31 27
27 28
28 0 29
29 4 30
30 4 31
31 32
32 4 0 33
33 3 34
34 27
27 28
28 3 29
29 5 30
30 1 31
31 27
27 28
28 2 29
29 6 30
30 2 31
31 27
27 28
28 1 29
29 7 30
30 3 31
31 27
27 28
28 0 29

29 8 30
KHMTK12 - Nhóm 7 24
Báo cáo tiểu luận môn Lý thuyết tính toán Lý thuyết: câu 2 + Bài tập: câu 8
Dòng R1 R2 R3 R4 R5 R6 R7 R8
Nhảy
tới
30 4 31
27 32
32 4 0 33
33 2 34
34 27
27 28
28 3 29
29 9 30
30 1 31
31 27
27 28
28 2 29
29 10 30
30 2 31
31 27
27 28
28 1 29
29 11 30
30 3 31
31 27
27 28
28 0 29
29 12 30
30 4 31

27 32
32 4 0 33
33 1 34
34 27
27 28
28 3 29
29 13 30
30 1 31
31 27
27 28
28 2 29
29 14 30
30 2 31
31 27
27 28
28 1 29
29 15 30
30 3 31
31 27
27 28
28 0 29
29 16 30
30 4 31
KHMTK12 - Nhóm 7 25

×