Luận văn: Hệ phương trình elliptic tuyến tính cấp hai, HOT, 9đ
Lttt
1. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
BỘ GIÁO DỤC & ĐÀO TẠO
ĐẠI HỌC ĐÀ NẴNG
---------------------------
TIỂU LUẬN MÔN HỌC
Đề tài:
TẬP HỢP, DÃY GHÉP VÀ TẬP TẤT CẢ CỦA NGÔN
NGỮ PHI NGỮ CẢNH và CHƯƠNG TRÌNH RAM
CHUẨN, RAM THÔ SƠ TÌM NGHIỆM HỆ PHƯƠNG
TRÌNH TUYẾN TÍNH BẬC NHẤT
Giáo viên hướng dẫn: PGS.TS. Phan Huy Khánh
Nhóm Học viên: Huỳnh Xuân Tuy
Lê Trọng Hiền
Lê Tự Quốc
Lớp: Khoa học máy tính - K11
Đà Nẵng, tháng 03 năm 2010
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 2/20
2. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
PHẦN 1: LÝ THUYẾT
Đề số 5: Chapter 6. Context-Free Grammar. Section 6.3. Unions, concatenation,
and *’s of CFLs. Section 6.4. Derivation trees and Ambiguity [1] p171-179.
6.3 TẬP HỢP, DÃY GHÉP VÀ TẬP TẤT CẢ CỦA NGÔN NGỮ PHI NGỮ
CẢNH (CFL)
Trong Ví dụ 6.4 chúng ta đã tìm ra cách thức sản sinh văn phạm phi ngữ
cảnh L bằng cách biểu diễn như là một tập hợp của hai ngôn ngữ khác nhau và
tìm cách sản sinh một văn phạm phi ngữ cảnh cho mỗi ngôn ngữ. Kỹ thuật này
với một cách khác có thể biểu diễn dãy ghép và Kleenc *’s của ngôn ngữ phi
ngữ cảnh (CFL) là những tiền đề cơ bản cho định lý theo sau.
Định lý 6.1. Nếu L1 và L2 là hai ngôn ngữ phi ngữ cảnh, thì ngôn ngữ L1 È L2,
L1L2 và L1
* cũng là một ngôn ngữ phi ngữ cảnh.
Chứng minh định lý. Chứng minh bằng suy luận: Nếu chúng ta bắt đầu với
CFGs
G1 = (V1, å, S1, P1) và G2 = (V2, å, S2, P2)
sản sinh L1 và L2 tách biệt, chúng ta thấy rằng có 03 trường hợp để xây dựng nên
một CFG mới.
Một văm phạm Gu = (Vu, å, Su, Pu) được sản sinh từ L1 È L2. Điều thiết
yếu đầu tiên, chúng ta đổi tên những thành phần của V2 nếuvì thế V1 Ç V2 = Æ,
rồi thì chúng ta định nghĩa
Vu = V1 È V2 È { Su }
ở đây Su là một ký hiệu mới mà nó không có trong V1 hay V2. Và ta đặt
Pu = P1 È P2 È { Su ® S1 | S2}
Bằng cách này, nếu x Î L1 = L(G1), thì Su Þ* x trong văn phạm Gu bởi vì ta có
thể bắt đầu với một dẫn xuất Su ® S1 và tiếp tục với sự nhận x từ G1, và tương tự
cho x Î L2. Vì vậy
L1 È L2 Í L(Gu)
Một cách khác, nếu x nhận được Su trong Gu, thì bước đầu tiên trong bất kỳ một
dẫn xuất nào cũng là
Su Þ S1 hay Su Þ S2
Trong trường hợp đầu tiên, tất cả những sản sinh đến sau điều được sử dụng bởi
sản sinh trong G1 bởi vì không có tham biến bao gồm trong V2, và theo cách đó
thì x Î L1; trong trường hợp thứ 2, x Î L2. Vì vậy
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 3/20
3. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
L(Gu) Í L1 È L2
Một văn phạm Gc = (Vc, å, Sc, Pc) được sản sinh từ L1 L2. Như đã chứng
minh ở trên, chúng ta cũng dễ dàng chỉ ra rằng V1 Ç V2 = Æ, và định nghĩa
Vc = V1 È V2 È { Sc }
Và bây giờ chúng ta đặt
Pc = P1 È P2 È { Sc ® S1 S2}
Nếu x Î L1 L2, thì x = x1 x2, ở đây xi Î Li với mỗi i. Chúng ta sẽ nhận được x
trong Gc như sau:
Sc Þ S1S2 Þ * x1S2 Þ * x1x2 = x
ở đây, bước thứ 2 của dẫn xuất x1 trong G1 và bước thứ 3 của dẫn xuất x2 trong
G2. Ngược lại, nếu x có thể là một dẫn xuất từ Sc, thì từ bước đầu tiên trong dẫn
xuất phải là Sc Þ S1 S2, x phải là dẫn xuất từ S1 S2. Vì vậy, x = x1x2, ở đây, với
mỗi i, xi có thể là dẫn xuất từ Si vào Gc. Tuy nhiên, V1 Ç V2 = Æ, được dẫn xuất
từ Si vào Gc cũng chính là dẫn xuất từ Si vào Gi, và vì thế x Î L1 L2.
Một văn phạm G* = (V, å, S, P) được sản sinh từ L1*. Đặt
V = V1 È { S }
ở đây S Ï V1. Ngôn ngữ L1* chứa những chuỗi từ x = x1 x2 ... xk, với mọi x2 Î L1.
Bởi vì mỗi xi có thể được dẫn xuất từ S1, x dẫn xuất từ S mà nó không thể dẫn
xuất từ một câu của k S1’s. Chúng ta có thể thực hiện điều này bằng cách bao
gồm những sản sinh
S = S1 S | D
trong P. Vì vậy, đặt
P = P1 È { S ® S1 S | D}
Cần chứng minh rằng L1* Í L(G*) là đúng đắng. Ngược lại, x Î L(G*), là xóa đi
những các x = D hay x có thể dẫn xuất từ một vài ký tự của mẫu S1
k trong G*.
Trong trường hợp thứ 2, chỉ từ những sản sinh trong G* bắt đầu với S1 là trong
G1, chúng ta kết luận rằng
x Î L1(G1)k Í L(G1)*
Phía trước, chúng ta có một ứng dụng của định lý, chú ý rằng nó thật sự
cần thiết trong hai phần đầu của cách chứng minh mà chắc chắn rằng V1 Ç V2 =
Æ. Suy nghỉ về một văn phạm phi ngữ cảnh có những sản sinh
S1 ® XA X ® c A ® a
và
S2 ® XB X ® d B ® b
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 4/20
4. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
tách biệt. Nếu chúng ta ứng dụng cách đặt câu trong phần đầu của cách chứng
minh mà không gán lại cho các biến, thì kết quả của văn phạm là một dẫn xuất
như sau
S Þ S1 Þ XA Þ dA Þ da
Tuy nhiên, da không phải là dẫn xuất từ bất kỳ một phần nào trong hai văn
phạm gốc (nguyên thủy).
Hệ quả 6.1. Mọi ngôn ngữ tự nhiên là một ngôn ngữ phi ngữ cảnh.
Chứng minh hệ quả. Theo định nghĩa 3.1, một tập hợp các ngôn ngữ tự nhiên
là một tập con nhỏ nhất mà nó bao gồm tất cả các ngôn ngữ Æ, {D}, và {a} (với
mọi a Î å) và là một phép toán đóng của tập hợp, dãy ghép, và Kleene*. Mỗi
một ngôn ngữ nguyên thủy Æ, {D}, và {a} là một ngôn ngữ phi ngữ cảnh (trong
trường hợp đầu tiên chúng ta có thể sủ dụng một văn phạm thông thường mà
không ó khả năng sản sinh, và trong trường hợp thứ hai là có khả năng sản sinh).
Hệ quả từ Định lý 6.1, được sử dụng để giới thiệu một cấu trúc nguyên thủy.
Ví dụ 6.8. Gọi L là một ngôn ngữ tương ứng với biểu thức thông thường như
sau:
(011 + 1) * (01) *
Theo cách chứng minh Định lý 6.1. đã đưa ra một phương pháp tìm kiếm một
văn phạm phi ngữ cảnh được sản sinh từ L, bắt đầu với một văn phạm cho ngôn
ngữ {0} và {1}; tuy nhiên, chúng ta sẽ đơn giản hóa quy trình bằng cách công
nhận một vài cách tiếp cận hiển nhiên.
A ® 011 | 1
sản sinh ngôn ngữ {011, 1}. Theo phần 3 của định lý, chúng ta có thể sử dụng
những sản sinh
B ® AB | D
A ® 011 | 1
để sản sinh một ngôn ngữ {011, 1}*, sử dụng ký hiệu bắt đầu B. Tương tự,
chúng ta sử dụng
C ® DC | D
D ® 01
đến dẫn xuất {01}* từ ký hiệu bắt đầu C. Cuối cùng, chúng ta sản sinh một dãy
ghép của hai ngôn ngữ bằng cách thêm vào sản sinh S ® BC. Văn phạm sau
cùng sẽ bắt đầu với ký hiệu S, những biến phụ A, B, C và D, và những sản sinh
S ® BC
B ® AB | D
A ® 011 | 1
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 5/20
5. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
C ® DC | D
D ® 01
Ví dụ 6.9. Gọi L = {0i1j0k | j > i + k}. Nếu ngôn ngữ này là phi ngữ cảnh như
kết quả của Định lý 6.1, mặc dù nó trông như một dãy ghép rắc rối. Tuy nhiên,
điều đầu tiên phải xem như một phép gần đúng – L được viết như một dãy ghép
L1L2L3, ở đây ba ngôn ngữ chứa đựng chuỗi 0’s, chuỗi 1’s và chuỗi 0’s theo thứ
tự định sẵn – là dẫn đến sai. Ngôn ngữ L chứa đựng cả 011301 và 011402, tuy
nhiên, nếu chúng ta cho phép L1 chứa đựng 01, L2 chứa đựng 13, và L3 chứa đựng
02, thì L1L2L3 cũng chứa đựng 011302, và chuỗi này không phải là một phần tử
của L.
Nếu chúng ta xem một cách khác để tiếp cận nhanh L như là một dãy
ghép, chúng ta phải chỉ ra rằng
0i1i+k0k = 0i1i 1k0k
Chỉ có một sự khác nhau giữa hai vế của biểu thức là với một chuỗi x trong L
mà x tối thiểu phải ³ 1 khi ở giữa chuỗi:
x = 0i1i 1m 1k0k (với m > 0)
Một công thức đúng cho ngôn ngữ L là L = L1L2L3, ở đây
L1 = {0i1i | i ³ 0}
L2 = {1m | m ³ 0}
L3 = {1k0k | k ³ 0}
Phần thứ 2 của Định lý 6.1, ứng dụng thứ 2, quy về bài toán tomg CFG cho 03
ngôn ngữ.
Một định nghĩa đệ quy cho L1 như sau:
D Î L1 với bất kỳ x Î L1, 0x1 Î L1 ngược lại không thuộc trong L1
và một CFG tương đương với một sản sinh
A ® 0A1 | D
L3 gần như đồng nhất và có thể sinh ra từ sản sinh
C ® 1C0 | D
Cuối cùng, L2 có thể sinh ra từ sản sinh
B ® 1B | 1
(sản sinh thứ 2 là B ® 1, không có B ® A, bởi vì chúng ta chỉ muốn một cây
khác rỗng).
Tóm lại, văn phạm phi ngữ cảnh G = (V, å, S, P) được kết hợp chặt chẽ
từ các mẫu được mô tả như sau:
V = {S, A, B, C} å = {0, 1}
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 6/20
6. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
P = { S ® ABC
A ® 0A1 | D
B ® 1B | 1
C ® 1C0 | D }
Một dẫn xuất của 01402 = (01)(1)(1202), như một ví dụ sau
S Þ ABC Þ 0A1BC Þ 0D1BC Þ 011C
Þ 0111C0 Þ 01111C00 Þ 01111D00 = 0111100
6.4. CÂY DẪN XUẤT VÀ SỰ NHẬP NHẰNG
Trong ngôn ngữ tự nhiên, ví dụ như Tiếng Anh, trước hết để hiểu được
một câu thì phải hiểu được cấu trúc văn phạm, hiểu được nguồn gốc ngữ nghĩa
của từ trong những quy luật văn phạm của ngôn ngữ. Đưa vào một văn phạm phi
ngữ cảnh CFG (ví dụ: một đặc tả cú pháp của một ngôn ngữ lập trình) và ngữ
nghĩa của câu từ một văn phạm, nó thường được dùng để biết nguồn gốc ngữ
nghĩa, bởi vì nó làm sáng tỏ cho một câu đúng. Một cách tự nhiên để biểu diễn
cấu trúc nguồn gốc là dùng cây dẫn xuất hay cây phân tích cú pháp. Tại nút gốc
của cây là giá trị bắt đầu của dẫn xuất. Trong tường hợp tổng quát, mỗi nút trong
của cây tương ứng với một tham biến A trong văn phạm, và nút con tương ứng
chỉ đến một ký tự a sẽ xuất hiện bên cạnh phải của một sản xinh A ® a được sử
dụng trong dẫn xuất. Trong trường hợp một sản xinh từ A ® A, thì nút có tên A
được gọi là lá A.
Trong ví dụ 6.5. chúng ta đã xem xét một CFG với sản xinh như sau:
S ® S + S | S – S | S * S | S / S | (S) | a
Thì dẫn xuất:
S Þ S – S Þ S * S – S Þ a * S – S Þ a * a – S Þ a * a – a
được biểu diễn bằng cây dẫn xuất như Hình. 6–1a. Dẫn xuất
S Þ S – S Þ S – S / S Þ … Þ a – a / a
S
Được biểu diễn như cây dẫn xuất trong Hình. 6-1b.
S - S
S * S
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 7/20
a a
a
S
S - S
S / S
a a
a
(a) (b)
HÌNH 6–1.
Những cây dẫn xuất
của hai biểu thức đại số.
7. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
Những biểu thức đại số thường được biểu diễn như một cây biểu thức -
cây nhị phân mà những nút kết thúc tương ứng với những tham biến hay hằng số
và những nút không kết thúc thì tương ứng với một biểu thức (Hình. 6-2). Một
cây biểu thức mang những thông tin giống như một cây dẫn xuất khi nó tuân thủ
văn phạm được mô tả trước; Tuy nhiên, chỉ có ký tự kết thúc mới được vẽ.
-
* a
a a
HÌNH 6 – 2:
Cây biểu thức tương đương với Hình.6-1a.
Trong trường hợp một dẫn xuất đầy đủ của một câu trong một CFL, nút
gốc của cây dẫn xuất tương ứng với ký hiệu bắt đầu của văn phạm, và những nút
lá, hay nút cuối, tương ứng với ký hiệu kết thúc này hay . Đôi khi nó cũng có
ích khi coi như một dẫn xuất của một câu từ một vài biến đổi được và được xem
như một dẫn xuất “không hoàn thành” mà sẽ kết thcs trước tất cả các biển đổi có
thể loại bỏ (khử) từ một câu. Theo cách đó, chúng ta có thể cho phép các cây
dân xuất có thể biến đổi tại các nút lá.
Một bước trong dẫn xuất là thay thế một giá trị bằng một câu trên cạnh
phải của sản sinh. Một dẫn xuất là đưa vào một dãy tuần tự của những bước, và
trong một tuần tự là thứ tự của những bước có ý nghĩa. Dẫn xuất
S Þ S + S Þ a + S Þ a + a
và
S Þ S + S Þ S + a Þ a + a
vì vậy khác nhau. Tuy nhiên, sự khác nhau giữa chúng chỉ trong phương pháp
biểu diễn thông thường: Tại một điểm của câu hiện tại là S + S, thì S được sử
dụng trong bước tiếp theo là bên trái nhất của S trong dẫn xuất đầu tiên, và bên
phải nhất trong thứ hai. Một cách chính xác là những dẫn xuất không khác nhau
mấy và có thể nói rằng các cây dẫn xuất là giống nhau. Một cây dẫn xuất được
đặc tả đầy đủ với những sản sinh trong dẫn xuất và ở đây cạnh bên phải nhất của
mội sản sinh phải phù hợp với câu đón nhận. Nó không đặc tả theo thứ tự thời
gian trong những tham biến được sử dụng, và thứ tự này không đóng vai trò
trong việc sử dụng dẫn xuất để giải thích cấu trúc của câu. Hai dẫn xuất tương
đương, mà hai cây dẫn xuất giống nhau thì chúng hoàn toàn giống nhau.
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 8/20
8. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
Một cách khác để so sánh hai dẫn xuất là bình thường hóa mỗi dẫn xuất,
bằng cách quy định luật như nhau khi tham biến được thay đổi đầu tiên bất kể
khi nào được chọn, và so sánh những phiên bản bình thường. Một dẫn xuất bên
trái nhất là một tham biến bên trái nhất trong câu hiện tại là luôn luôn được sử
dụng trong một bước tiếp theo. Nếu hai dẫn xuất được so sánh mà cả hai bên
phải nhất và là vẫn khác nhau, có thể nói rằng chúng giống nhau, hay khác nhau
đáng kể.
Trong thực tế, hai tiêu chuẩn về “cơ bản giống nhau” là tương đương. Về
mặt này, những dẫn xuất bên trái nhất tương đương khác nhau với cây dẫn xuất
là hoàn toàn khác nhau. Về mặt kia, không khó để thấy rằng cây dẫn xuất tương
đương với hai dẫn xuất bên trái nhất cũng khác nhau. Từ đó, bước đầu tiên với
dẫn xuất khác nhau. Giả sử rằng bước này là
xAb Þ xa1b
trong một dẫn xuất và
xAb Þ xa+b
trong cách khác. Ở đây, x là một câu kết thúc, từ một dẫn xuất bên trái nhất; A là
một tham biến, và a1 ¹ a2. Cả hai cây dẫn xuất phải có nhãn nút lá là A, và phần
chia tương ứng của hai cây bên trái của nút này phải gống nhau bởi vì dẫn xuất
bên trái nhất phải giống nhau ở điểm này. Vì thế cho nên hai nút có hai tập con
khác nhau, cây không thể giống nhau.
Chúng ta kết luận rằng một câu kết thúc mà có nhiều hơn một cây dẫn
xuất nếu và chỉ nếu nó có nhiều hơn một dẫn xuất bên trái nhất. Chú ý rằng
trong lý luận này “bên trái nhất” cũng dễ dàng đúng với “bên phải nhất”; một
điều quan trọng là không phải theo một thứ tự nào, chỉ nói rằng một vài định
nghĩa bắt buộc phải có thứ tự, để mà có hai phiên bản bình thường có thể so
sánh theo ngữ nghĩa.
Chúng ta phải luôn luôn ghi nhớ rằng, một câu có thể có hai hay nhiều
dẫn xuất khác nhau trong cùng CFG.
Định nghĩa 6.3. Một văn phạm phi nhữ cảnh G được gọi là nhập nhằng nếu có
ít nhất một câu trong L(G) có hai hay nhiều hơn cây dẫn xuất khác nhau (hoặc,
tương đương hai hay nhiều dẫn xuất bên trái nhất khác nhau).
Không khó để thấy rằng định nghĩa nhập nhằng ở trên có quan hệ gần gũi
với sự nhập nhằng mà chúng ta gặp hằng ngày trong văn đọc và văn nói. Một
người viết một báo cáo với tiêu đề “Disabled Fly to See Carter”, tiêu đề này xuất
hiện trong suốt nhiệm kỳ thứ 39 của chính phủ Mỹ, hầu như chắc chắn nhận ra
một dẫn xuất như sau:
S ® ácollective nounñ áverbñ…
Tuy nhiên, một dẫn xuất khác
S ® áadjectiveñ áverbñ…
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 9/20
9. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
Là một gợi ý rất hấp dẫn – hay ít nhất có thể đón được – câu chuyện. Hiểu được
một câu hay ý nghĩa tiêu đề của một bài báo, một cách nghĩ khác, phải chọn lựa
một văn phạm đúng để dẫn xuất cho nó.
Ví dụ 6.10. Chúng ta quay lại ví dụ biểu thức số học CFG đã được xem xét
trong Ví dụ 6.1, với sự sản sinh
S ® S + S | S – S | S * S | S / S | (S) | a
Trong ví dụ đó, chúng đa chỉ ra hai dẫn xuất khác nhau hoàn toàn của câu
a + (a * a) / a - a
và, thực tế là, có hai cây dẫn xuất cho cả hai bên trái nhất, vì vậy đã được chứng
minh là một văn phạm nhập nhằng. Điều này cũng có thể được chứng minh bằng
cách chỉ sử dụng sản sinh S ® S + S và S ® a; câu a + a + a có những sản sinh
bên trái nhất là
S Þ S + S Þ a + S Þ a + S + S Þ a + a + S Þ a + a + a
và
S Þ S + S Þ S + S + S Þ a + S + S Þ a + a + S Þ a + a + a
Cây dẫn xuất tương ứng trong Hình. 6-3a và 6-3b.
S
S + S
S + S
a a
a
(a)
S
S + S
S + S
a a
a
(b)
HÌNH 6–3:
Hai cây dẫn xuất của biểu thức a + a + a.
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 10/20
10. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
Sự khác nhau trong cách biểu diễn câu a + a + a được giải thích dựa trên
cở sở hai dẫn xuất như trong Ví dụ 6.5, bởi vì phép toán được viết như là tổng
của hai phép toán con trong hai trường hợp; tuy nhiên, tính chất cơ bản là như
nhau. Phép toán được mô tả là a + (a + a) trong trường hợp này, và (a + a) + a
trong trường hợp khác. Để nói rằng sức mạnh của các dấu ngoặc đơn là loại bỏ
tính nhập nhằng cũng như làm cho biểu thức được sáng tỏ. Chúng ta sẽ tìm hiểu
tính chất của dấu ngoặc đơn một cách cẩn thận trong đoạn tiếp theo, khi đó
chúng ta sẽ thảo luận một CFG không nhập nhằng tương tự như điều này.
Thật dễ dàng để thấy điều này khi nghiên cứu Ví dụ 6.10 cho bất kỳ một
CFG nào chứa đựng một sản sinh tất cả từ A ® AaA thì nhập nhằng. Tuy nhiên,
có nhiều cách tinh tế để chỉ ra tính nhập nhằng, và mô tả CFG nhập nhằng như
là bất kỳ một cách thông thường nào là khó khăn hoặc không thể (xem Phần.
12.6).
Ví dụ 6.11. Một ví dụ chuẩn mực về tính nhập nhằng trong ngôn ngữ lập trình là
hiện tượng “rẽ nhánh”. Được phát biểu trong sản sinh
ástatementñ ® if (áexpressionñ) ástatementñ |
if (áexpressionñ) ástatementñ else ástatementñ |
áotherstatmentñ
mô tả phát biểu if trong Ví dụ 6.6 như là một quan hệ trong cấu trúc if – else, cả
hai phần của ngôn ngữ C. Được phát biểu như sau:
if (expr1) if (expr2) f( ); else g( );
Điều này có thể nhận được trong hai cách từ quy tắc của văn phạm. Cách
thứ nhất, biểu đồ của phát biểu if được minh họa trong Hình. 6-4a, mệnh đề else
với if đâu tiên. Cách thứ hai, biểu đồ của phát biểu if trong Hình. 6-4b. Một
chương trình dịch của ngôn ngữ C sẽ thông dịch theo phát biểu thứ hai, nhưng
không trả về kết quả như quy tắc cú pháp đưa vào. Đây là một thông tin được
cộng thêm bắt buộc phải có sẵn trong chương trình dịch.
ástatementñ
f ( áexpressionñ
) ástatementñ else ástatementñ
expr1
) ástatementñ
if ( áexpressionñ g ();
expr2
f ();
(a)
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 11/20
11. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
ástatementñ
f ( áexpressionñ
) ástatementñ
expr1
else ástatementñ
Như Ví dụ 6.10, dấu ngoặc đơn hay một dấu tương đương với nó có thể
được sử dụng để loại bỏ tính nhập nhằng trong một phát biểu.
if (expr1) {if (expr2) f( )}; else g( );
cho biên dịch thứ nhất, ngược lại
if (expr1) {if (expr2) f( ); else g( );}
cho biên dịch thứ 2. Trong một vài ngôn ngữ khác, những “dấu ngoặc đơn”
được thay thế bằng BEGIN …END.
Điều này có thể thực hiện được, tuy nhiên, tìm một quy tắc văn phạm
tương đương để kết hợp thông dịch đúng cú pháp. Một phát biểu cho công thức
ástatementñ ® if (ást1ñ | ást2ñ
ást1ñ ® if (áexpressionñ) then ást1ñ else ást2ñ|áotherstatmentñ
ást2ñ ® if (áexpressionñ) then ástatementñ |
if (áexpressionñ) then ást1ñ else ást2ñ
Sản sinh này giống như một câu trong những quy tắc nguyên thủy và có
thể chỉ ra sự không nhập nhằng. Mặc dầu chúng ta sẽ không chứng minh cho
phát biểu trong hai việc này, có thể hiểu được bằng trực quan cho vế thứ 2.
Tham biến ást1ñ được biểu diễn bằng một phát biểu trong mọi if tương ứng với
một else, ngược lại, bất ký một phát biểu nào dẫn xuất từ ást2ñ phải chứa đựng ít
nhất một tương ứng với if. Chỉ có giá trị tương ứng trước else trong công thức
này là ást1ñ; bởi vì else không thể có tương ứng với bất kỳ một if nào trong dẫn
xuất từ ást1ñ, nó phải tương ứng với if được chỉ ra trong công thức với else.
Một điều thật thú vị khi so sách hai tập những công thức này với một văn
phạm chính thức tương ứng trong ngôn ngữ lập trình Modula-2:
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 12/20
g ();
if ( áexpressionñ
expr2
) ástatementñ
f ();
HÌNH 6-4: (b)
Hai diễn dịch của một “dangling elsse”
12. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
ástatementñ ® IF áexpressionñ THEN ástatementsequenceñ END |
IF áexpressionñ THEN ástatementsequenceñ
ELSE ástatementsequenceñ END |
áotherstatmentñ
Rõ ràng ở đây có sự tương đồng với quy tắc của ngôn ngữ C ở tập đầu
tiên ở trên. Tuy nhiên, từ khóa END sau mội dãy tuần tự của một hay nhiều phát
biểu chỉ ra một quy tác văn phạm dễ hiểu nhằm ngăn ngừa tính nhập nhằng
“dangling else”. Trong phát biểu (cú pháp) của ngôn ngữ Modula-2 tương ứng
thì gần gũi với cây trong Hình. 6-4a là:
IF A1 THEN IF A2 THEN S1 END ELSE S2 END
và Hình. 6-4b tương ứng với
IF A1 THEN IF A2 THEN S1 ELSE S2 END END
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 13/20
13. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
PHẦN 2: BÀI TẬP
Đề số 5: Viết chương trình RAM chuẩn và RAM thô sơ tìm nghiệm hệ phương
trình tuyến tính:
î í ì
a1x b1y c1
+ =
a2x + b2y =
c2
;Bai toan dau vao la he phuong trinh bac nhat
; a1x + b1y = c1
; a2x + b2y = c2
;Tinh
; D=a1*b2 - a2*b1
; Dx=c1*b2 - c2*b1
; Dy=a1*c2 - a2*c1
;Bien luan
; D<>0 : He co mot nghiem x=Dx/D, y=Dy/D
; D=0 : Neu Dx<>0 va Dy<>0 He vo nghiem
; Nguoc lai He vo so nhiem
I. MÁY RAM CHUẨN
;Nhap dau vao
READ 1 ;R1 <- a1 //Doc a1 vao R1
READ 2 ;R2 <- b1 //Doc b1 vao R2
READ 3 ;R3 <- c1 //Doc c1 vao R3
READ 4 ;R4 <- a2 //Doc a2 vao R4
READ 5 ;R5 <- b2 //Doc b2 vao R5
READ 6 ;R6 <- c2 //Doc c2 vao R6
;Tinh D,Dx,Dy
LOAD 1 ;ACC <- R1
MULT 5 ;ACC <- <ACC>*R1 //a1*b2
STORE 7 ;R7 <- <ACC>
LOAD 4 ;ACC <- R4
MULT 2 ;ACC <- <ACC>*R2 //a2*b1
STORE 8 ;R8 <- <ACC>
LOAD 7 ;ACC <- R7
SUB 8 ;ACC <- <ACC>-R8 //D=(a1*b2 - a2*b1)
STORE 7 ;R7 <- <ACC> //D
LOAD 3 ;ACC <- R3
MULT 5 ;ACC <- <ACC>*R5 //c1*b2
STORE 8 ;R8 <- <ACC>
LOAD 6 ;ACC <- R6
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 14/20
14. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
MULT 2 ;ACC <- <ACC>*R2 //c2*b1
STORE 9 ;R9 <- <ACC>
LOAD 8 ;ACC <- R8
SUB 9 ;ACC <- <ACC>-R9 //Dx=(c1*b2 - c2*b1)
STORE 8 ;R8 <- <ACC> //Dx
LOAD 1 ;ACC <- R1
MULT 6 ;ACC <- <ACC>*R6 //a1*c2
STORE 9 ;R9 <- <ACC>
LOAD 4 ;ACC <- R4
MULT 3 ;ACC <- <ACC>*R3 //a2*c1
STORE 10 ;R10 <- <ACC>
LOAD 9 ;ACC <- R9
SUB 10 ;ACC <- <ACC>-R10 //Dy=(a1*c2 - a2*c1
STORE 9 ;R9 <- <ACC> //Dy
;Bien luan
;IF_1
LOAD 7 ;ACC <- R7 //D
JZERO ELSE_1 ; //Nhay neu <ACC>=0
LOAD 8 ;ACC <- R8 //Dx
DIV 7 ;ACC <- <ACC>/R7 //Dx/D
STORE 1 ;R1 <- <ACC>
WRITE 1 ;In ra man hinh //x=Dx/D
LOAD 9 ;ACC <- R9 //Dy
DIV 7 ;ACC <- <ACC>/R7 //Dy/D
STORE 1 ;R1 <- <ACC>
WRITE 1 ;In ra man hinh //y=Dy/D
JUMPENDIF_1
ELSE_1:
LOAD 8 ;ACC <- R8 //Dx
JZERO ELSE_2 ; //Nhay neu <ACC>=0
LOAD 9 ;ACC <- R9 //Dy
JZERO ELSE_2 ; //Nhay neu <ACC>=0
LOAD A:0 ;<ACC> <- 0
STORE 1 ;R1 <- <ACC>
WRITE 1 ;In 0 ra man hinh //He vo nghiem
JUMPENDIF_1
ELSE_2:
LOAD A:-1 ;<ACC> <- -1
STORE 1 ;R1 <- <ACC>
WRITE 1 ;In -1 ra man hinh //He vo so nghiem
ENDIF_1
II. MÁY RAM THÔ SƠ
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 15/20
15. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
;Nhap dau vao
READ 1 ;R1 <- a1 //Doc a1 vao R1
READ 2 ;R2 <- b1 //Doc b1 vao R2
READ 3 ;R3 <- c1 //Doc c1 vao R3
READ 4 ;R4 <- a2 //Doc a2 vao R4
READ 5 ;R5 <- b2 //Doc b2 vao R5
READ 6 ;R6 <- c2 //Doc c2 vao R6
;Tinh D, Dx, Dy
;Tinh a1*b2
;IF1
J <1>(L17,L11) //Nhay den L17 neu a1=0, nguoc lai nhay den L11
L11: J <5>(L17,L12) //nhay neu L17 neu b2=0, nguoc lai nhay den L12
L12: LOAD 1 ;<ACC> <- R1 //a1
STORE 7 ;R7 <- <ACC>
//Dung R7 Luu tich a1*b2, gan R7=a1
LOAD 5 ;<ACC> <- R5 //b2
STORE 10 ;R10 <- <ACC> //Dung R10 lam trung gian
L13: D <10> ;R10 <- R10-1 //Giam R10 di 1, For 1
J <10> (L16,L14);/
/Nhay den L16 neu R9=0, nhay den L14 neu R9<>0
L14: LOAD 1 ;<ACC> <- R1 //a1
STORE 11 ;R11 <- <ACC> //Dung R11 lam trung gian
L15: I <7> ;R7 <- R7+1 //
D <11> ;R11 <- R11-1
J <11> (L13,L15)
//Nhay den L13 neu R11=0, nhay den L15 neu R11<>0
L16: LOAD A:0 ;<ACC> <-0
J <0>(L18,L18) //Nhay den L18 voi moi gia tri R0
L17: LOAD A:0 ;<ACC> <-0
STORE 7 ;R7 <- <ACC> //Tich R7=a1*b2=0
L18: //R7=a1*b2
;Tinh a2*b1
;IF1
J <4>(L27,L21)
//Nhay den L27 neu a1=0, nguoc lai nhay den L21
L21: J <2>(L27,L22) //nhay neu L27 neu b2=0, nguoc lai nhay den L22
L22: LOAD 4 ;<ACC> <- R4 //a2
STORE 12 ;R12 <- <ACC>
//Dung R12 Luu tich a2*b1, gan R12=a2
LOAD 2 ;<ACC> <- R2 //b1
STORE 10 ;R10 <- <ACC> //Dung R10 lam trung gian
L23: D <10> ;R10 <- R10-1 //Giam R10 di 1, For 1
J <10> (L26,L24) ;
//Nhay den L26 neu R10=0, nhay den L24 neu R10<>0
L24: LOAD 4 ;<ACC> <- R1 //a2
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 16/20
16. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
STORE 11 ;R11 <- <ACC> //Dung R11 lam trung gian
L25: I <12> ;R12 <- R12+1 //
D <11> ;R11 <- R11-1
J <11> (L23,L25)
//Nhay den L23 neu R11=0, nhay den L25 neu R11<>0
L26: LOAD A:0 ;<ACC> <-0
J <0>(L28,L28) //Nhay den L28 voi moi gia tri R0
L27: LOAD A:0 ;<ACC> <-0
STORE 12 ;R12 <- <ACC> //Tich R12=a2*b1=0
L28: //R12=a2*b1
;Tinh a1*b2-a2*b1
J <12> (L_S11,L_S12) ; //a2*b1
L_S12: D <12>
D <7>
J <12> (L_S11,L_S12)
L_S11: //R7=a1*b2-a2*b1
;Tinh c1*b2
;IF1
J <3>(L37,L31) //Nhay den L37 neu c1=0, nguoc
lai nhay den L31
L31: J <5>(L37,L32) //nhay neu L37 neu b2=0, nguoc lai
nhay den L32
L32: LOAD 3 ;<ACC> <- R3 //c1
STORE 8 ;R8 <- <ACC> //Dung R8 Luu tich
c1*b2, gan R8=c1
LOAD 5 ;<ACC> <- R5 //b2
STORE 10 ;R10 <- <ACC> //Dung R10 lam trung
gian
L33: D <10> ;R10 <- R10-1 //Giam R10 di 1, For 1
J <10> (L36,L34) ; //Nhay den L36 neu R10=0, nhay
den L34 neu R10<>0
L34: LOAD 3 ;<ACC> <- R3 //a1
STORE 11 ;R11 <- <ACC> //Dung R11 lam trung
gian
L35: I <8> ;R8 <- R8+1 //
D <11> ;R11 <- R11-1
J <11> (L33,L35) //Nhay den L33 neu R11=0,
nhay den L35 neu R11<>0
L36: LOAD A:0 ;<ACC> <-0
J <0>(L38,L38) //Nhay den L_3EIF1 voi moi gia tri
R0
L37: LOAD A:0 ;<ACC> <-0
STORE 8 ;R8 <- <ACC> //Tich R8=c1*b2=0
L38: //R8=c1*b2
;Tinh c2*b1
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 17/20
17. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
;IF1
J <6>(L47,L41) //Nhay den L47 neu a1=0, nguoc
lai nhay den L41
L41: J <2>(L47,L42) //nhay neu L47 neu b2=0, nguoc lai
nhay den L42
L42: LOAD 6 ;<ACC> <- R6 //c2
STORE 12 ;R12 <- <ACC> //Dung R12 Luu tich
c2*b1, gan R12=c2
LOAD 2 ;<ACC> <- R2 //b1
STORE 10 ;R10 <- <ACC> //Dung R10 lam trung
gian
L43: D <10> ;R10 <- R10-1 //Giam R10 di 1, For 1
J <10> (L46,L44); //Nhay den L46 neu R9=0, nhay
den L44 neu R9<>0
L44: LOAD 6 ;<ACC> <- R6 //c2
STORE 11 ;R11 <- <ACC> //Dung R11 lam trung
gian
L45: I <12> ;R12 <- R12+1 //
D <11> ;R11 <- R11-1
J <11> (L43,L45) //Nhay den L43 neu R11=0,
nhay den L45 neu R11<>0
L46: LOAD A:0 ;<ACC> <-0
J <0>(L48,L48) //Nhay den L48 voi moi gia tri R0
L47: LOAD A:0 ;<ACC> <-0
STORE 12 ;R12 <- <ACC> //Tich R12=c2*b1=0
L48: //R12=c2*b1
;Tinh c1*b2-c2*b1
J <12> (L_S21,L_S22); //c2*b1
L_S22: D <12>
D <8>
J <12> (L_S21,L_S22)
L_S21: //R8=c1*b2-c2*b1
;Tinh a1*c2
;IF1
J <1>(L57,L51) //Nhay den L57 neu c1=0, nguoc lai nhay den L51
L51: J <6>(L57,L52) //Nhay neu L57 neu b2=0, nguoc lai nhay den L52
L52: LOAD 1 ;<ACC> <- R3 //a1
STORE 9 ;R9 <- <ACC> //Dung R9 Luu tich a1*c2,
gan R9=a1
LOAD 6 ;<ACC> <- R6 //c2
STORE 10 ;R10 <- <ACC> //Dung R10 lam trung gian
L53: D <10> ;R10 <- R10-1 //Giam R10 di 1, For 1
J <10> (L56,L54);
//Nhay den L56 neu R10=0, nhay den L54 neu R10<>0
L54: LOAD 1 ;<ACC> <- R1 //a1
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 18/20
18. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
STORE 11 ;R11 <- <ACC> //Dung R11 lam trung gian
L55: I <9> ;R9 <- R9+1
D <11> ;R11 <- R11-1
J <11> (L53,L55)
//Nhay den L53 neu R11=0, nhay den L55 neu R11<>0
L56: LOAD A:0 ;<ACC> <-0
J <0>(L58,L58) //Nhay den L58 voi moi gia tri R0
L57: LOAD A:0 ;<ACC> <-0
STORE 9 ;R9 <- <ACC> //Tich R9=a1*c2=0
L58: //R9=a1*c2
;Tinh a2*c1
;IF1
J <4>(L67,L61)
//Nhay den L671 neu a1=0, nguoc lai nhay den L61
L61: J <3>(L67,L62)
//Nhay neu L67 neu b2=0, nguoc lai nhay den L62
L62: LOAD 4 ;<ACC> <- R6 //a2
STORE 12 ;R12 <- <ACC>
//Dung R12 Luu tich c2*b1, gan R12=c2
LOAD 3 ;<ACC> <- R3 //c1
STORE 10 ;R10 <- <ACC>
//Dung R10 lam trung gian
L63: D <10> ;R10 <- R10-1 //Giam R10 di 1, For 1
J <10> (L66,L64);
//Nhay den L66 neu R9=0, nhay den L64 neu R9<>0
L64: LOAD 4 ;<ACC> <- R4 //a2
STORE 11 ;R11 <- <ACC> //Dung R11 lam trung gian
L65: I <12> ;R12 <- R12+1
D <11> ;R11 <- R11-1
J <11> (L63,L65)
//Nhay den L63 neu R11=0, nhay den L65 neu R11<>0
L66: LOAD A:0 ;<ACC> <-0
J <0>(L68,L68) //Nhay den L68 voi moi gia tri R0
L67: LOAD A:0 ;<ACC> <-0
STORE 12 ;R12 <- <ACC> //Tich R12=a2*c1=0
L68: //R12=a2*c1
;Tinh a1*c2-a2*c1
J <12> (L_S31,L_S32) ; //c2*b1
L_S32: D <12>
D <9>
J <12> (L_S31,L_S32)
L_S31: //R9=a1*c2-a2*c1
;Bien luan
;IF_1
J <7>(ELSE_1,L1) ; //D=0 Nhay ve ELSE_1
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 19/20
19. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
L1: LOAD A:1 ;ACC <- 1 //He co mot nghiem x=Dx/D,
y=Dy/D
STORE 1 ;R1 <- <ACC>
LOAD A:0 ;<ACC> <- 0
J <0>(ENDIF_1,ENDIF_1) //Nhay ve ENDIF_1 voi moi R0
ELSE_1:
J <8>(ELSE_2,L2) ; //Dx=0 Nhay ve ELSE_2
L2:
J <9>(ELSE_2,L3) ; //Dy=0 Nhay ve ELSE_2
LOAD A:0 ;<ACC> <- 0 //He vo nghiem
STORE 1 ;R1 <- <ACC>
LOAD A:0 ;<ACC> <- 0
J <0>(ENDIF_1,ENDIF_1) //Nhay ve ENDIF_1 voi moi R0
ELSE_2:
LOAD A:-1 ;<ACC> <- -1 //He vo so nghiem
STORE 1 ;R1 <- <ACC>
ENDIF_1:
WRITE 1 ;In ra man hinh
//1:He co mot nghiem, 0:he vo nghiem, -1:he vo so nghiem
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 20/20
20. Tiểu luận môn học: Lý thuyết Tính toán Đề tài: Lý thuyết: 05, Bài tập: 05
TÀI LIỆU THAM KHẢO
[1]. J.C. Martin, Introduction to Languages and the Theory of
Computation, The MacGraw-Hill Companies, Inc., 1997.
[2]. Phan Huy Khánh, Giáo trình Lý thuyết tính toán, ĐH Đà Nẵng 1999.
[3]. Phan Huy Khánh, Lý thuyết ngôn ngữ hình thức và ôtômat, ĐH Đà
Nẵng 1997.
[4]. Một số thông tin tham khảo trên internet.
Nhóm 1 – Khoa học Máy tính K11 (2009 – 2011) Trang 21/20