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

giới thiệu về lý thuyết máy tính

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 (155.03 KB, 14 trang )

Chươ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 )
1


1.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 ∪ S2 = { x : x∈ S1 hay x∈ S2 }
S1 ∩ S2 = { x : x∈ S1 và x∈ S2 }
S1 - S2 = { x : x∈ S1 và x∉ S2 }
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 ∩ Ø = Ø
= U
= S
Đònh lý de Morgan :
2

(đâ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, S2 không có phần tử chung , nghóa là S1 ∩ S2 = ∅ , thì ta nói hai
tập S1, S2 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 = S
1
x S
2
= { (x,y) : x∈ S
1
, y ∈ S
2
}
Ví dụ 1.2
Cho S1= {2, 4} và S2 = {2, 3, 5, 6} . Thì :
S
1
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 S
1
x S
2
.
Tích Đề_các của nhiều hơn hai tập được viết như sau :
S
1
x S
2

x x S
n
=  (x
1
,x
2
, ,x
n
) : x
i
∈ S
i

Hàm và quan hệ
3
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 : S
1
> S
2
chỉ ra miền xác đònh của f là tập con của S
1
và miền giá trò của f là tập con của
S
2
. Nếu miền xác đònh của f là toàn bộ S
1
, ta nói f là hàm toàn ánh trên S
1
; 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ử
{(x
1
,y
1
), (x
2
,y
2
), . .}
Trong đó x
i
thuộc miền xác đònh của hàm, và y

i
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 x
i
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 = {v
1
,v
2
,… v
n
} là các nút
(đỉnh) và tập E = {e
1
,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 {V
1
,V
2
,V
3
} và những cạnh
{(V
1
,V
3
),(V
3
,V
1
),(V
3
,V

2
),(V
3
,V
3
)} được mô tả ở hình 1.1:

4

V
1



V
2



V

3





Hình 1.1
Một dãy những cạnh (v
i

, v
j
), (v
j
, v
k
), . . ., (v
m
, v
n
) được gọi là một đường đi từ v
i
đến
v
n
. 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ừ v
i
đế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ở v
i
. 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ì (v
1
, v
3
), (v
3

, v
2
) là đường dẫn đơn từ v
1
đến v
2
, một dãy
những cạnh (v
1
, v
3
),( v
3
, v
3
),( v
3
, v
1
) 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ừ v
i
đến v
j
thì v

i
gọi là
nút cha và v
j
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
Ba 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
5


Nút lá

Nút gốc


Mức
0

Chiều cao = 3

Mức 3

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 = a
1
a
2
a
n
v = b
1
b
2
b
m
thì wv = a
1
a
2
a

n
b
1
b
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
a
1
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à λ
|λ| = 0
λw = wλ = w
|uv| = |u| + |v|
Nế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.
6
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 = {a
n
b
n
: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ữ L
1
và L
2
là một tập tất cả các chuỗi ký
hiệu là L
1
L
2

L
1
L
2
= {xy: x ∈ L
1
, y ∈ L
2
}
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 }
thì L
2
= { a
n
b
n
a
m
b
m
: n ≥ 0, m ≥ 0 }
7
Lưu ý rằng n và m là không có liên hệ với nhau, chuỗi aabbaaabbb là
chuỗi trong L
2
.
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
và khi đó ta có những câu như: "a boy runs" và "the dog walks" là có "dạng
8
đú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.
w
1
=> w
2
=> w
3
=> => w
n
chúng ta có thể nói w1 dẫn xuất ra wn và viết ngắn gọn như sau:
w
1
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ừ w
1
. Để cho biết có ít nhất một luật sinh được áp dụng ta viết:
w
1

+
=>
w
n
9
Đò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
*
=>
w}
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 => w
1
=> w
2
=> =>w
n
=> w
được gọi là một dẫn xuất câu của w . Chuỗi S : w
1

,w
2
, ,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:
S > A b
10
Ngoài ra, cần những luật sinh khác để có thể dẫn ra một ngôn ngữ như ví
dụ trên, để có văn phạm

G = ({S,A}, {a,b}, S, P)
và các luật sinh :
S -> Ab
A -> aAb
A -> λ
Thông thường thì không dễ tìm một văn phạm cho một ngôn ngữ hình thức. Để chỉ ra
một ngôn ngữ L được sinh ra bởi một văn phạm G. Chúng ta cần chỉ ra:
a) mỗi w ∈ L được dẫn ra từ S bằng các luật sinh của văn phạm G
b) mỗi w như ở (a) phải thuộc L
Ví dụ 1.7
Cho ∑ = {a,b} và coi n
a
(w), n
b
(w) lần lượt biểu thò số ký hiệu a và b
trong w tương ứng. Ta có văn phạm G với luật sinh
S -> SS
S -> λ
S -> aSb
S -> bSa

sinh ra ngôn ngữ
L = {w : n
a
(w)=n
b
(w) }
Máy tự động (Automata)
Máy tự động là một mô hình trưù tượng cuả máy tính kỹ thuật số . Mọi thiết
bò tự động bao gồm các tính năng đặc biệt. Nó có cơ chế cho đọc ký hiệu nhập
vào (giả sử là thiết bò nhập là chuỗi được cho bơỉ các kí hiệu trong tập tin
nhập). Thiết bò tự động có thể đọc nhưng không thay đổi được nội dung.
Tập tin nhập được chia thành nhiều ô, mỗi ô chứa một ký hiệu. Cơ chế nhập
đọc tập tin từ trái sang phải, mỗi lần đọc một ký hiệu. Cơ chế này có thể nhận
biết được ký tự kết thúc bằng dấu hiệu kết thúc tập tin .
Thiết bò tự động có thể có thiết bò lưu trữ tạm, gồm các ô (không giới hạn số
lượng), mỗi ô có khả năng lưu một ký hiệu đơn từ bảng chữ cái, hay những ký
hiệu khác . Nó có thể đọc và thay đổi nội dung trong các ô lưu trữ.
Cuối cùng, thiết bò tự động có bộ điều khiển (control unit) gồm các trạng thái
bên trong, và có thể thay đôỉ trạng thái theo cách đã được đònh nghóa.
Hình 1.2 miêu tả cấu hình của thiết bò tự động nói chung.
11
Máy tự động giả đònh là hoạt động trên một khung thời gian rời rạc. Tại thời
điểm bất kỳ, bộ điều khiển ở một trạng thái bên trong , và quét ký hiệu trên file
nhập. Trạng thái bên trong của bộ điều khiển ở bước kế tiếp được xác đònh bởi
trạng thái tiếp theo hoặc hàm chuyển dòch.
Hàm chuyển dòch này đưa ra trạng thái kế tiếp, ký hiệu nhập hiện hành và
thông tin được ghi trong bộ lưu trữ tạm thời. Trong quá trình chuyển dòch từ một
khoảng thời gian đến khoảng kế tiếp, Có thông tin được đưa ra hay bộ lưu trữ
tạm bò thay đổi.
Dùng từ “cấu hình” để nói đến ba yếu tố: trạng thái hiện hành của bộ điều

khiển, file nhập, và bộ lưu trữ tạm thời. Sự chuyển dòch của thiết bò tự động từ
cấu hình này đến cấu hình khác gọi là một dòch chuyển (move).
Chúng ta cần phân biệt giữa automat tất đònh và không tất đònh. Thiết bò tự
động hay automat tất đònh xác đònh cấu hình hiện tại duy nhất. Nếu chúng ta biết
được trạng thái bên trong và nội dung của bộ lưu trữ tạm thời, ta có thể đoán
trạng thái tiếp theo của automata một cách chính xác. Điều này không đúng vơí
automaton không tất đònh. Tại mỗi thời điểm, automaton không tất đònh có nhiều
sự di chuyển hơn. Vì thế ta chỉ có thể đoán được một tập các trạng thái xảy ra
tiếp theo. Mối quan hệ giữa automat tất đònh và không tất đònh đóng vai trò
quan trọng trong môn học này.
Automat trả lời với tín hiệu YES hoặc NO được gọi là bộ chấp nhận
(accepter). Cho trước một chuỗi nhập, accepter có thể chấp nhận hay từ chối
chuỗi nhập.


Hình 1.2
Ưng dụng automat trong ngôn ngữ lập trình
12



Input file


Control Unit


Storage



t
Output


Mặc dù chúng ta nhấn mạnh đến tính trừu tượng và tính chính xác của ngôn ngữ
hình thức và automat. Nhưng cần phải thấy rằng các khái niệm này có nhiều ứng
dụng phổ biến trong khoa học máy tính và thật sự là một chủ đề chung để kết nối
nhiều lónh vực chuyên môn với nhau. Trong phần này, chúng ta đưa ra những ví dụ
để thấy rằng những gì chúng ta tìm hiểu ở đây không chỉ là tập hợp các khái niệm
trừu tượng, nhưng là điều gì đó mà nó giúp chúng ta hiểu nhiều điều quan trọng được ứng
dụng trong thực tế.
Ngôn ngữ hình thức và văn phạm được dùng một cách rộng rãi trong ngôn ngữ lập
trình. Việc mô tả cú pháp của ngôn ngữ thường thấy trong hầu hết các tài liệu về lập trình,
nếu viết một trình biên dòch, hoặc nếu muốn giải thích về tính chính xác của một chương
trình thì một mô tả cụ thể về chương trình là cần thiết . Ví dụ, chúng ta hãy tạo ra một
ngôn ngữ nhỏ gần như ngôn ngữ Pascal.
Ví dụ 1.8
Trong ngôn ngữ này, giả thiết rằng một đònh danh câu lệnh hợp lệ là một tập
tất cả các chuỗi được bắt đầu là một ký tự và theo sau là một số lượng tùy ý các
ký tự hay ký số. Văn phạm sau mô tả các đònh danh của nó theo giả thiết này.
<id>

<letter><rest>,
<rest>

<letter><rest>|<digit><rest>|λ
<letter>

a|b|…
<digit>


0|1…
<id>, <letter>, <digit>, và <rest> là các biến
a, b, …, 0, 1, … là những ký tự kết thúc
Một dẫn xuất cho đònh danh a0 là
<id> => <letter> <rest>
=> a <rest>
=> a <digit> <rest>
=> a0 <rest>
=> a0
Đònh nghóa ngôn ngữ lập trình thông qua văn phạm thì khá phổ biến và rất hữu
dụng. Nhưng còn có cách khác để đònh nghóa một ngôn ngữ lập trình mà thích hợp
trong nhiều trường hợp. Ví dụ, ta mô tả một ngôn ngữ bằng một bộ chấp nhận
(accepter), xem một chuỗi được chấp nhận là một phần của ngôn ngữ. Để hiểu rõ
ràng hơn về vấn đề này, cần có vài đònh nghóa hình thức về một automat.
Một Automat có thể được biểu diễn bởi một đồ thò với các nút là các trạng thái
nội, các cạnh là các chuyển dòch. Nhãn của các cạnh cho biết điều gì xảy ra (dưới
dạng nhập hay xuất) trong khi chuyển dòch. Ví dụ, hình 1.3 trình bày sự chuyển dòch
13
từ trạng thái 1 sang trạng thái 2 xảy ra khi ký hiệu nhập vào là a. Với hình minh họa
trực quan này, ta có thể mô tả các đònh danh của ngôn ngữ theo cách khác.

Hình 1.3
Ví dụ 1.9
Letter or Digit

Lette r or Digit
Hình 1.4

Hình 1.4 là một automat chấp nhận tất cả các đònh danh hợp lệ. Giả sử rằng

khởi dầu Automat ở trạng thái 1: chúng ta quy ước ký hiệu là một mũi tên (không
xuất phát từ bất kỳ một nút nào) vào trạng thái này. Chuỗi cần kiểm tra sẽ được đọc
từ trái sang phải, mỗi lần một ký hiệu. Nếu ký hiệu đầu tiên là ký tự, automat sẽ
chuyển sang trạng thái 2, sau đó các ký hiệu còn lại của chuỗi thì không quan trọng.
Trạng thái 2 biểu diễn trạng thái “chấp nhận” của accepter. Ngược lại, nếu ký hiệu
đầu tiên được đọc vào là ký số, automat sẽ chuyển sang trạng thái 3 là trạng thái
“không chấp nhận” của accepter và sẽ giữ luôn ở trạng thái đó (đònh danh không
hợp lệ). Ở đây chúng ta giả thiết rằng các ký hiệu nhập vào chỉ là ký tự hoặc ký số.
Trình biên dòch và các máy chuyển dòch một chương trình từ ngôn ngữ này tới
ngôn ngữ khác cũng dùng các ý tưởng trình bày ở các ví dụ trên. Ngôn ngữ lập trình
có thể được đònh nghóa một cách chính xác thông qua văn phạm.
14
a
1 2
1
Letter
Digit
3
2

×