Chương này gồm hai phần, đều là những khái niệm mà phần lớn, chúng ta đã biết, nhưng để dễ dàng hiểu những chương sau, đặc biệt là những ký hiệu được sử dụng trong các chương sau, vì thế
Trang 1Chương 1
GIỚI THIỆU VỀ LÝ THUYẾT MÁY TÍNH
Khoa học máy tính là một môn học mang tính thực tiễn Những người làm việc trong lĩnh vực này cần nghiên cứu, hiểu biết về những lý thuyết nền tảng của máy tính Những lý thuyết này giúp ích cho những sinh viên chuyên ngành CNTT khi họ cần thực hiện những ứng dụng trong thế giới thực Câu hỏi tại sao cần học lý thuyết ?
Câu trả lời một cách tổng quát là lý thuyết cung cấp khái niệm và nguyên tắc giúp cho ta nắm được yêu cầu và bản chất của môn học Lĩnh vực máy tính gồm nhiều chủ đề và có một phạm vi khá rộng, từ thiết kế máy đến lập trình và ngày càng được mở rộng Tuy thế, tất cả vẫn đặt trên một nguyên tắc chung Để học được những nguyên tắc chung này, chúng ta xây dựng một mô hình trừu tượng của máy tính Những mô hình này thể hiện những tính năng quan trọng cho cả phần cứng và phần mềm, và những vấn đề phức tạp khi làm việc với máy tính mà chúng ta có thể bắt gặp
Lý thuyết trong giáo trình này, chỉ là những khái niệm đơn giản và căn bản Để tìm hiểu sâu hơn, chúng ta cần đọc thêm những tài liệu và những giáo trình cao hơn
Sau nữa, lý thuyết cung cấp cho chúng ta những khái niệm giúp ta đi đến những ứng dụng như thiết kế kỹ thuật số, ngôn ngữ lập trình, trình biên dịch và nhận dạng ngôn ngữ Môn học lý thuyết này cũng mang đến cho chúng ta nhiều thích thú, khám phá, thách thức và có những bài toán làm ta thao thức với nó
Chương này gồm hai phần, đều là những khái niệm mà phần lớn, chúng ta đã biết, nhưng để dễ dàng hiểu những chương sau, đặc biệt là những ký hiệu được sử dụng trong các chương sau, vì thế nên đọc qua chương này :
Phần 1.1 : Những kiến thức toán mở đầu và kí hiệu
- Tập hợp
- Hàm và quan hệ
- Cấu trúc đồ thị và cây
Phần 1.2 : Ba khái niệm cơ bản
- Ngôn ngữ
- Văn phạm
- Automat ( máy tự động )
Trang 21.1 KIẾN THỨC TOÁN MỞ ĐẦU VÀ KÍ HIỆU
Tập hợp
Một tập hợp là một tập gồm nhiều phần tử, có cùng một tính chất Để chỉ ra x là một phần tử của tập hợp S, ta viết x S Nếu x không thuộc S ta viết x S
Một tập hợp có thể được xác định bằng cách liệt kê các phần tử trong hai ngoặc;
ví dụ, tập hợp số nguyên 0,1, 2 được viết:
S = { 0 , 1 , 2 }
Một cách viết khác là lược bỏ bớt những phần tử khi người ta hiểu ngầm được
nó Theo cách đó , { a,b,…,z } thay thế cho tất cả các chữ cái thường của bảng
mẫu tự tiếng Anh, trong khi đó { 2 ,4 ,6 , } biểu hiện cho các số nguyên dương chẵn Khi khó có thể liệt kê được những phần tử của tập, người ta nói lên tính chất của tập :
ví dụ : S = { i: i > 0 , i là chẵn } (1.1)
ta đọc như sau : “ S là tập các số nguyên i , sao cho i > 0 và i chẵn “
Các phép toán thường dùng trên tập hợp là : phép hợp () , phép giao () và phép trừ (-), định nghĩa như sau :
S1 S 2 = { x : x S1 hay x S 2 }
S1 S 2 = { x : x S1 và x S 2 }
S 1 - S 2 = { x : x S1 và x S 2 }
Một phép toán cơ bản khác là phép lấy phần bù (phần bù)ø Phần bù của một tập S,
kí hiệu là _S , bao gồm tất cả các phần tử có thể có nhưng không nằm trong S Để
giải thích chúng ta cần biết tập hoàn vũ (universal set) U là tập các phần tử có thể
khi đó :
_S = { x : x U , x S }
Tập hợp mà không chứa phần tử nào , được gọi là tập rỗng được kí hiệu
Theo định nghĩa tập hợp, ta có :
S Ø = S – Ø = S
S Ø = Ø
= S
Định lý de Morgan :
Trang 3(đây là một định lý cần thiết trong một số trường hợp ).
Tập S1 gọi là tập con của S nếu mỗi phần tử của S1 cũng là phần tử của S Ta
viết như sau :
S1 S
Nếu S1 S mà S chứa một phần tử không có trong S1 ta nói S1 là tập con riêng
của S, ta viết S1 S
Nếu như S1, S 2 không có phần tử chung , nghĩa là S1 S 2 = , thì ta nói hai
tập S1, S 2 rời nhau
Một tập gọi là hữu hạn nếu nó chứa số hữu hạn phần tử, ngược lại thì tập hợp không hữu hạn Kích thước của tập hữu hạn là số lượng các phần tử trong tập,
được kí hiệu : | S |.
Một tập hợp có nhiều tập con Tập tất cả các tập con của tập S gọi là tập lũy thừa của S, được kí hiệu : 2 S
Ví dụ 1.1
Nếu S là tập { a, b, c } thì tập lũy thừa của nó là
2 S = { , {a}, {b}, {c}, {a, b} , {a, c}, {b, c}, {a, b, c} }
Ở đây | S | = 3 và | 2 S | = 8 Đây là ví dụ của một kết quả tổng quát;
nếu S hữu hạn thì :
| 2 S | = 2 | S |
Trong nhiều ví dụ, các phần tử của một tập là chuỗi các phần tử của những tập khác Những tập như vậy gọi là tích Đề-các của các tập khác Tích Đề-các của hai tập, là một tập gồm những những cặp thứ tự, ta viết
S = S1 x S2 = { (x,y) : x S1, y S2 }
Ví dụ 1.2
Cho S1= {2, 4} và S 2 = {2, 3, 5, 6} Thì :
S1 x S 2 = { (2, 2), (2, 3), (2, 5), (2, 6), (4, 2), (4, 3), (4, 5), (4, 6)}
Chú ý rằng thứ tự các phần tử trong mỗi cặp là quan trọng
Ví dụ : cặp (2, 4) không có trong S1 x S2
Tích Đề_các của nhiều hơn hai tập được viết như sau :
S1 x S2 x x Sn = (x1,x2, ,xn) : xi Si
Trang 4Hàm và quan hệ
Một hàm là một qui luật gán cho những phần tử của một tập với một phần tử
duy nhất của một tập khác Nếu f biểu thị một hàm, thì tập đầu gọi là miền xác định của f, và tập thứ hai là tập giá trị của nó Ta viết
f : S1 > S2
chỉ ra miền xác định của f là tập con của S1 và miền giá trị của f là tập con của
S2 Nếu miền xác định của f là toàn bộ S1 , ta nói f là hàm toàn ánh trên S1; ngược
lại f là hàm bộ phận.
Một hàm có thể được biểu diễn bởi những cặp hai phần tử
{(x1,y1), (x2,y2), }
Trong đó xi thuộc miền xác định của hàm, và yi thuộc miền giá trị của hàm Biểu
diễn này xác định một hàm, mỗi xi có thể xuất hiện nhiều nhất một lần trong phần tử
đầu của một cặp Nếu nó không thoả mãn như thế thì tập được gọi là quan hệ Quan hệ thì phổ biến hơn hàm: trong một hàm mỗi phần tử của miền xác định có một liên kết với một phần tử trong miền giá trị; trong quan hệ có thể liên kết nhiều phần tử trong miền giá trị
Đồ thị và cây
Một đồ thị là một cấu trúc gồm hai tập hữu hạn, tập V = {v1,v 2 ,… v n} là các nút
(đỉnh) và tập E = {e1,e 2 ,……,e n } là các cạnh Mỗi cạnh nối hai nút trong V
ví dụ : e i = (v j , v k )
Ta nói cạnh e i là một cạnh đi từ v j và đến v k Một cấu trúc như trên là một đồ thị có hướng Đồ thị có thể gán nhãn, một nhãn có thể là tên hoặc thông tin khác liên quan đến đồ thị, cả nút và cạnh đều có thể được gán nhãn
Đồ thị có thể biểu diễn trực quan bằng sơ đồ mà mỗi nút được kí hiệu bởi một vòng tròn và mỗi cạnh là một đường thẳng với mũi tên trên cạnh chỉ hướng đi từ nút này
đến nút kia Đồ thị với các nút {V1,V 2 ,V 3} và những cạnh
{(V1,V 3 ),(V 3 ,V1),(V 3 ,V 2 ),(V 3 ,V 3 )} được mô tả ở hình 1.1:
Trang 5
Hình 1.1
Một dãy những cạnh (vi , vj), (vj, vk ), , (vm, vn) được gọi là một đường đi từ vi đến
vn Chiều dài của một đường đi là tổng số chiều dài của những cạnh có trong đường đi đó
Một đường đi mà không có cạnh lặp lại được gọi là một đường dẫn Một đường dẫn gọi là
đường dẫn đơn nếu không có đỉnh nào được lặp lại Một đường đi từ vi đến chính nó mà
không có cạnh nào được lặp lại gọi là chu trình cơ sở vi Trong một chu trình, nếu không
có một đỉnh nào ngoại trừ chu trình cơ sở, được lặp lại, thì chu trình đó gọi là chu trình
đơn Ví dụ như trong hình 1.1 thì (v1, v3), (v3, v2) là đường dẫn đơn từ v1 đến v2 , một dãy
những cạnh (v1, v3),( v3, v3),( v3, v1) tạo thành một chu trình nhưng không là một chu trình đơn Nếu những cạnh của đồ thị được gán nhãn, ta có nhãn của đường đi Nhãn của đường
đi là những nhãn của những cạnh trong đường đi đó
Cây là một kiểu đặc biệt của đồ thị Một cây là một đồ thị có hướng không có chu kỳ nào, và có một nút riêng biệt gọi là nút gốc, vì vậy có chính xác một đường dẫn đến các nút khác Định nghĩa này ngầm hiểu nút gốc không có cạnh đến, và có một số nút không
có cạnh ra, những nút này gọi là lá của cây Nếu có một cạnh đi từ vi đến vj thì vi gọi là
nút cha và vj là nút con Mức của mỗi nút là số cạnh trên đường dẫn từ nút gốc đến nút đó Chiều cao của cây là số mức lớn nhất của nút bất kì Những thuật ngữ này được minh họa trong hình 1.2 Khi ta đặt một thứ tự cho các nút, ở mỗi mức, ta nói cây có thứ tự
Hình 1.2
1.2 BA KHÁI NIỆM CƠ BẢN
Nút lá
Nút gốc
Mức 0
Chiều cao = 3
Mức 3
Trang 6Ba khái niện cơ bản là điểm chính yếu của giáo trình này Đó là: ngôn ngữ (language), văn phạm (grammar) và automat (automata) Trong phần này, chúng ta sẽ tìm hiểu về những khái niệm này và mối liên quan giữa chúng Trước hết, chúng
ta tìm hiểu về ngữ nghĩa của từng khái niệm
Ngôn ngữ
Chúng ta đã biết có rất nhiều ngôn ngữ tự nhiên như tiếng Anh, tiếng Pháp, Nhưng thật khó mà định nghĩa được chính xác ‘ngôn ngữ’ là gì Một số từ điển định nghĩa nó là một hệ thống thích hợp nhằm để diễn tả những ý kiến, sự kiện, khái niệm chắc chắn, bao gồm một tập hợp các ký hiệu và các qui luật để vận dụng chúng
a) Chuỗi: Coi một tập không rỗng, gồm những ký hiệu mẫu tự (alphabet) Từ các
kí hiệu riêng biệt, chúng ta xây dựng nên các chuỗi, các chuỗi này là một dãy các kí hiệu hữu hạn được trích ra từ tập
Ví dụ : = {a,b} thì abab và aaabbba là các chuỗi trên
Ta thường dùng các kí hiệu chữ thường a,b,c, biểu thị các phần tử của và các kí tự u, v, w, … là tên của các chuỗi.
Ví dụ: w = abaaa là một chuỗi có tên w và có giá trị là abaaa
b) Sự kết nối: Sự kết nối giữa hai chuỗi w và v là một chuỗi có dạng wv
Ví dụ: w = a1a 2 a n
v = b1b 2 b m
thì wv = a1a 2 a n b1b 2 b m
c) Đảo ngược: Đảo ngược của một chuỗi là một chuỗi có các kí tự theo thứ tự ngược
lại Nếu w là một chuỗi như ở ví dụ trên thì ta có phép đảo của w là w R
w R = a n …a 2 a1
d) Nếu w = vu thì v được gọi là tiền tố (tiếp đầu ngữ), u gọi là hậu tố (tiếp vị ngữ)
của w.
e) Chiều dài của chuỗi w được kí hiệu là |w|, nó chính là số các kí tự trong chuỗi
f) Chuỗi rỗng là chuỗi không có chứa phần tử nào cả, được kí hiệu là
w = w = w
|uv| = |u| + |v|
Trang 7Nếu w là một chuỗi thì w n là một chuỗi kết nối w với n lần.
Trường hợp đặc biệt w 0 = , với mọi w
Coi tập , ta có tập * là tập kết nối không ký hiệu nào hay nhiều ký hiệu trong , tập + là tập có ít nhất một lần kết nối ký hiệu trong Tập * luôn luôn
chứa
+ = * - {}
nên nhớ số phần tử của thì luôn hữu hạn, *, + thì ngược lại
Một ngôn ngữ được định nghĩa là tập con của * Với chuỗi w bất kì trong ngôn ngữ L được gọi là một từ (word) hoặc một câu (sentence) của ngôn ngữ L Từ đây ta
qui định là không phân biệt giữa từ hay câu, và có thể dùng thay thế lẫn nhau
Ví dụ 1.3
Cho = {a,b} thì
* = {, a, b, aa, ab, ba, bb, aaa, aab, …}
Tập {a, aa, aab} là một ngôn ngữ trên Bởi vì nó chứa một số hữu hạn các
từ Ta gọi nó là ngôn ngữ hữu hạn
coi tập : L = {an bn :n 0}
là một ngôn ngữ trên Các chuỗi aabb, aaaabbbb là các từ trên ngôn ngữ L, nhưng chuỗi abb thì không Ngôn ngữ này là không giới hạn.Vì các ngôn ngữ
là các tập hợp nên phép hội, phép giao, phép khác là có thể thực hiện được
Bù của ngôn ngữ L là _L
_L = * - L
Phép kết nối giữa hai ngôn ngữ L1 và L2 là một tập tất cả các chuỗi ký
hiệu là L1L2
L1L 2 = {xy: x L1, y L2}
Chúng ta định nghĩa L n là L kết hợp với chính nó n lần
Trường hợp đặc biệt
L 0 = { }
Với mỗi ngôn ngữ L
Ví dụ 1.4
Nếu L = {a n b n : n 0 }
Trang 8thì L 2 = { a n b n a m b m : n 0, m 0 }
Lưu ý rằng n và m là không có liên hệ với nhau, chuỗi aabbaaabbb là
chuỗi trong L2
Cuối cùng chúng ta định nghĩa L* gọi là bao đóng_sao (star closure) của L
L* = L 0 L 1 L 2
và L+ gọi là bao đóng dương (positive closure) của L
L+ = L 1 L 2 …
Văn phạm
Để nghiên cứu ngôn ngữ một cách chính xác, chúng ta cần có một cơ chế để mô tả nó Có nhiều cơ chế để định nghĩa ngôn ngữ, nhưng có một cơ chế được áp dụng một cách phổ biến và mạnh mẽ đó là cơ chế dùng văn phạm Vậy văn phạm là
gì ?
Trước hết chúng ta hãy xem qua về một đoạn văn phạm tiếng Anh : một văn phạm của ngôn ngữ tiếng Anh, nó cho chúng ta biết một câu cụ thể có đúng hay không Một quy luật phổ biến của tiếng Anh đó là trong một câu, nó bao gồm có
một mệnh đề danh từ <noun phrase> và theo sau nó là một vị ngữ <predicate> ta
có thể viết như sau :
<sentence> <noun_phrase> <predicate> (*)
với sự giải thích một cách rõ ràng thì dĩ nhiên là luật (*) chưa đủ để chúng ta có thể giải quyết những câu trong thực tế Vì vậy chúng ta phải đưa ra những định nghĩa
cho những cấu trúc <noun_phrase> và <predicate>:
<noun_phrase> <article> <noun>
<predicate> <verb>
Nếu chúng ta kết hợp với những từ trong thực tế như :
<article> "a" và "the"
<noun> "boy" và "dog"
<verb> "runs" và "walks”
ta có văn phạm sau
<sentence> <noun_phrase> <predicate>
<noun_phrase> <article><noun>
<predicate> <verb>
<article> a | the
<noun> boy | dog
<verb> runs | walks
Trang 9và khi đó ta có những câu như: "a boy runs" và "the dog walks" là có "dạng
đúng" có nghĩa là được sinh ra từ văn phạm trên
Định nghĩa 1.1
-Một văn phạm G được định nghĩa là một bộ bốn : G = (V, T, S, P),
Trong đó:
V : là tập hữu hạn các đối tượng gọi là các biến.
T : là tập hữu hạn các đối tượng gọi là tập các kí hiệu kết thúc.
S V : là một kí hiệu đặc biệt gọi là biến khởi đầu.
P : là tập hữu hạn các luật sinh.
Nếu không nói gì khác thì V và T là không rỗng và rời nhau
Những luật sinh là điểm chủ yếu của văn phạm, nó chỉ rõ văn phạm chuyển đổi một chuỗi này sang một chuỗi khác như thế nào, và thông qua cách này, các luật sinh định nghĩa một ngôn ngữ liên kết với văn phạm Các luật sinh có dạng
x y
trong đó x là một phần tử của (V T)+ và y là phần tử của (V T)*.
giả sử ta có một chuỗi: w = uxv
chúng ta nói rằng luật sinh x -> y có thể áp dụng với chuỗi này và chúng ta có thể dùng nó để thay thế x bằng y, ta nhận được một chuỗi mới.
z = uyv
và có thể viết : w => z
Chúng ta nói rằng w dẫn xuất ra z hay ngược lại z được dẫn xuất từ w Những
chuỗi được sinh ra qua một dẫn xuất, bằng cách áp dụng những luật sinh của một cú pháp nào đó Một luật sinh nó có thể áp dụng được ở bất cứ nơi đâu, mà nó có thể, và nó còn có thể áp dụng một cách liên tiếp như mô tả dưới đây
w1 => w2 => w 3 => => w n
chúng ta có thể nói w1 dẫn xuất ra w n và viết ngắn gọn như sau:
w1 w n
kí hiệu * cho biết dẫn xuất đến w n thì qua một số bước (số bước có thể = 0) bắt
đầu từ w1 Để cho biết có ít nhất một luật sinh được áp dụng ta viết:
Trang 10w1
w n
Định nghĩa 1.2
-Cho G = ( V, T, P, S ) là một văn phạm thì tập :
L(G) = { w T* : S *
Là ngôn ngữ được sinh ra bởi G.
Nếu w L(G), thì phải tồn tại dãy dẫn xuất
S => w1 => w2 => =>w n => w
được gọi là một dẫn xuất câu của w Chuỗi S : w1,w2, ,w n ở trên mà chứa các biến cũng như các kí hiệu kết thúc được gọi là các dạng câu của sự dẫn xuất
Ví dụ 1.5
Xét văn phạm : G = ( {s}, {a,b}, S, P)
Có luật sinh P : S -> aSb
S -> .
thì : S => aSb => aaSbb => aabb
Ta có thể viết : S aabb
Chuỗi aabb là một câu được sinh ra bởi văn phạm G, còn aaSbb là một
dạng câu
Một văn phạm G hoàn toàn xác định L(G), nhưng không thể dễ dàng mô tả ngôn ngữ một cách tường minh từ văn phạm, nên khó phỏng đoán ngôn ngữ ứng với văn phạm này là:
L(G) = { a n b n :n 0 }
Ví dụ 1.6
Tìm văn phạm mà nó sinh ra ngôn ngữ
L = { a n b n+1 : n 0 }
Chúng ta có thể áp dụng ý tưởng của ví dụ 1.5 cho ví dụ này, và tất cả
những điều chúng ta cần làm là sinh ra thêm một kí tự b với luật sinh: