Trong Q, có một trạng thái đầu, thường kí hiệu qo và một tập hợp các trạngthái cuối thừa nhận, thường kí hiệu F F ⊆ Q.Ta nói Automat thừa nhận xâu vào w nếu sau khi xuất phát từ trạng th
Trang 1II.2 Sự tương đương của các DFA Tr 11
a Dự vào bảng đánh dấu sự tương đương các trạng
thái Tr 11
b Dựa vào tính đóng dưới phép giao Tr 12 II.3 Cài đặt Tr
15
a.Cài đặt dựa theo trạng thái tương đương Tr 16
b Dựa vào tính đóng của phép giao 2 DFA Tr 22
Trang 2- Một đầu đọc, mỗi thời điểm đọc (trỏ) đến một ô trên băng vào
- Một bộ điều khiển Q, gồm một số hữu hạn các trạng thái, tại mỗi thời điểm
Trang 3Trong Q, có một trạng thái đầu, thường kí hiệu qo và một tập hợp các trạngthái cuối thừa nhận, thường kí hiệu F (F ⊆ Q).
Ta nói Automat thừa nhận xâu vào w nếu sau khi xuất phát từ trạng thái đầu
qo và đầu đọc chỉ vào kí hiệu bên trái nhất của xâu w, sau một số bước dịchchuyển hữu hạn, Automat đọc song xâu w và rơi vào một trong các trạng thái cuốithuộc F
Tập hợp tất cả các xâu đoán nhận bởi Automat hợp thành ngôn ngữ đượcnhận bởi Automat đó
q0∈ Q là trạng thái bắt đầu
F ⊆ Q là tập các trạng thái kết thúc
I.3 DFA xử lý xâu như thế nào
Giả sử w = a0a1 an là xâu vào DFA sẽ bắt đầu với trạng thái q0, nó sẽ thựchiện dịch chuyển δ(q0, a1) giả sử cho q1 DFA bây giờ ở trạng thái q1 và kí hiệu tiếptheo sẽ đọc a2, nó thưc hiện dịch chuyển δ(q1, a2) giả sử cho q2 Nó cứ tiếp tục nhưthế, cho đến khi đọc an thì sẽ chuyển sang trạng thái qn nào đó, nếu qn thuộc tập F
Trang 4DFA chưa đọc xâu 01, nhưng ngay trước đó ít nhất một kí tự 0, như thế nó cóthể tiếp tục đọc kí tự 0 cho đến khi gặp một kí tự 1 thì có thể chuyển sang thừanhận xâu vào.
Với nhận xét trên chúng ta dễ dàng thấy mỗi trường hợp trên sẽ ứng với mộttrạng thái ghi nhớ của DFA Trường hợp (1) sẽ tương ứng với trạng thái thừa nhận,
kí hiệu trạng thái q2, ở trạng thái này, DFA có thể tiếp tục đọc bất kì kí hiệu nào.Như thế δ(q2, 0) = δ(q2, 1) = q2
Trường hơp (2) sẽ tương ứng với trạng thái đầu q0, khi ở trạng thái này DFA
có thể tiếp tục đọc kí tự cho đến khi gặp kí tự 0 thì chuyển sang trạng thái khác.Như thế δ(q0, 1) = q0, δ(q0, 0) = q1
Trường hợp (3) sẽ tương ứng với trạng thái q1, khi đã đọc trước đó ít nhất một
kí tự 0, nhưng chưa bao giờ đọc xâu 01.Ở trạng thái q1 thì DFA có thể tiếp tục đọc
kí tự 0 cho đến khi gặp kí tự 1, thì chuyển sang trạng thái thừa nhận q2 Như thếδ(q1, 0) = δ(q1, 1) =q2
Vậy cuối cùng chúng ta có DFA như sau:
M=({q0, q1, q2}, {0, 1}, δ, q0, {q2})
Với δ được định nghĩa như trên
Giải thuật mô phỏng hoạt động của một DFA
Mục đích: kiểm tra một chuỗi nhập x có thuộc ngôn ngữ L(M) đoán nhậnbởi automata M
Trang 5Input: chuỗi nhập x$
Output: câu trả lời ‘YES’ hoặc ‘NO’
Giải thuật:
I.4 Các cách biểu diễn đơn giản của DFA
Cách mô tả DFA bằng bộ năm như trên là tương đối khó hiểu và ít trực quan
Có hai cách mô tả đơn giản hơn một DFA là: biểu đồ dịch chuyển và bảng dịchchuyển
a Biểu đồ dịch chuyển
Mỗi trạng thái trong Q là một nút
Với mỗi trạng thái q ∈ Q và mỗi kí hiệu a ∈ Σ, có δ(q, a) = p ∈ Q Như thế,biểu đồ dịch chuyển có một cung đi từ nút p đến q mang nhãn a, nếu có nhiều kíhiệu tạo ta dịch chuyển từ q đến p thì chỉ cần biểu diễn một cung mang nhãn làdanh sách các kí hiệu đó
Có một mũi tên đi vào nút q0 để kí hiệu trạng thái đầu
Các trạng thái kết thúc F là các nút được biểu diễn bởi hai vòng tròn
Các trạng thái không thuộc F là các nút được biểu diễn bởi chỉ một vòng tròn
q := q 0 ;
c := nextchar ; {c là ký hiệu nhập được đọc tiếp theo}
While c <> $ do begin
q := δ(q, c);
c := nextchar ; end
If (q in F) then write("YES") else write("NO");
Trang 6DFA biểu diễn ngôn ngữ trong Ví dụ
b Bảng dịch chuyển
Bảng dịch chuyển cho một DFA là một quy ước biểu diễn dạng bảng của hàm,
mà ở đây là dịch chuyển với hai tham số: các trạng thái và các kí hiệu vào Trạngthái đầu được đánh dấu bởi dấu , các trạng thái cuối sẽ được đánh các dấu ( * )
Bảng dịch chuyển của DFA xây dựng trong Ví dụ
I.5 Hàm dịch chuyển mở rộng
Một cách không hình thức chúng ta có thể nhận thấy rằng, một DFA địnhnghĩa ngôn ngữ gồm các xâu là kết quả của quá trình dịch chuyển từ trạng thái đầuđến một trong các trạng thái thừa nhận Để xác định ngôn ngữ được thừa nhận bởimột DFA, chúng ta sẽ định nghĩa hàm dịch chuyển mở rộng Hàm dịch chuyển mởrộng, kí hiệu là δ* , sẽ nhận tham số là trạng thái q và xâu w và trả về trạng thái p.Nghĩa là DFA đang ở trạng thái q, sau khi xử lý xâu w thì DFA đạt đến trạng thái
Trang 7Ví dụ: Xây dựng DFA thừa nhận ngôn ngữ
L = {w / w chỉ chứa các kí hiệu 0, 1 và luôn kết thúc bởi kí hiệu 1}
DFA phải phân biệt hai khả năng:
Khi nó đọc kí hiệu 1, thì ngay sau đó có thể kết thúc
Khi nó đọc kí hiệu 0 thì ngay sau đó không được kết thúc, mà phải đọc tiếpcác kí hiệu khác cho đến khi gặp kí hiệu 1 Như thế, DFA sẽ có ít nhất hai trạngthái tương ứng với hai khả năng trên
Ta xây dựng DFA như sau:
M = ({q0, q1}, {0, 1}, δ, q0, {q1})
Trong đó, hàm δ như sau:
DFA cho Ví dụHay chúng ta có thể biểu diễn hàm δ bởi bảng dịch chuyển như sau:
Trang 8Như vậy, xâu vào w = 101101 được thừa nhận bởi DFA
Chúng ta có thể biểu diễn quá trình đoán nhận đơn giản hơn như sau:
q0- 101101 q1- 01101 q0-1101 q1-101 q1-01 q0-1 q1∈ F
I.6 Ngôn ngữ được thừa nhận bởi DFA
Định nghĩa: Cho DFA M = (Q, Σ, δ, q0, F), ngôn ngữ được thừa nhận bởi M,được kí hiệu là L(M), được định nghĩa như sau:
L(M) = { w ∈ Σ* / δ*(q0, w) = qf, qf∈ F}
Nghĩa là, ngôn ngữ L(M) gồm các xâu w sao cho M xuất phát từ trạng tháiđầu q0, sau khi đọc hết xâu w thì đạt đến một trong các trạng thái qf thuộc F
Trang 9Định nghĩa: Cho DFA M, một ngôn ngữ L = L(M) được gọi là ngôn ngữchính quy (regular language) Hay nói cách khác, ngôn ngữ được thừa nhận bởimột Automat hữu hạn đơn định là ngôn ngữ chính quy.
Ví dụ: Xây dựng Automat thừa nhận ngôn ngữ L gồm các xâu trên bảng chữΣ= {a, b} được bắt đầu bởi xâu aa
Ví dụ: Chứng minh rằng ngôn ngữ L = {abanbm / n, m > 0} là ngôn ngữ chínhquy
Để chứng minh một ngôn ngữ là chính quy, ta chỉ ra rằng tồn tại DFA thừanhận ngôn ngữ đó Thật vậy L được thừa nhận bởi DFA sau:
Trang 10CHƯƠNG II
SỰ TƯƠNG ĐƯƠNG CỦA CÁC AUTOMAT DFA
II.1 Sự tương đương của các trạng thái.
Mục đích của chúng ta là xác định xem hai trạng thái khác nhau p và q có thểthay thế bởi một trạng thái duy nhất mà có chức năng như p và q
Chúng ta nói rằng, hai trạng thái p và q là tương đương nếu: với mọi xâu w,
δ*(p, w) cho kết quả là trạng thái kết thúc và δ*(q, w) cho kết quả cũng là trạngthái kết thúc hoặc δ*(p, w) cho kết quả là trạng thái không kết thúc và δ*(q, w) chokết quả cũng là trạng thái không kết thúc
Lưu ý, chúng ta không yêu cầu δ*(p, w) và δ*(q, w) cho cùng trạng thái mà chỉcho kết quả cùng trạng thái kết thúc hoặc không kết thúc
Ngược lại, hai trạng thái không tương đương được gọi là phân biệt Nghĩa làtrạng thái p phân biệt với trạng thái q, nếu tồn tại ít nhất một xâu w sao cho mộttrong hai dịch chuyển δ*(p, w) và δ*(q, w) cho trạng thái kết thúc và dịch chuyểncòn lại cho trạng thái không kết thúc
Để xác định sự tương đương của các trạng thái, chúng ta sử dụng thuật toánxây dựng bảng đánh dấu như sau:
Nếu p là trạng thái không kết thúc và q là trạng thái kết thúc thì {p, q} là cặptrạng thái phân biệt
Cho p và q là các trạng thái sao cho với kí hiệu vào a, r = δ (p, a) và
s= δ (q, a) là cặp trạng thái phân biệt Khi đó {p, q} cũng là cặp trạng tháiphân biệt Thật vậy, bởi vì {r, s} là cặp trạng thái phân biệt, nên tồn tại xâu w phânbiệt r và s, nghĩa là chỉ có một trong hai dịch chuyển δ*(r, w) và δ*(s, w) cho kếtquả là trang thái kết thúc, còn một dịch chuyển cho kết quả là trạng thái không kết
Trang 11thúc Khi đó, δ*(p, aw) và δ*(q, aw) cho cùng kết quả với δ*(r, w) và δ*(s, w), nghĩa
là {p, q} cũng là cặp trạng thái phân biệt bởi xâu aw
Ví dụ: Xây dựng bảng đánh dấu của DFA trong hình vẽ
Trong bảng đánh dấu các trạng thái phân biệt, các cặp trạng thái phân biệtđược đánh dấu X, các cặp trạng thái tương đương được để trống, các ô bôi đenkhông được sử dụng Ban đầu, không có cặp nào bị đánh dấu Chúng ta thực hiệnviệc đánh dấu theo thuật toán đã trình bày ở trên
Trước hết, các cặp trạng thái gồm có một trạng kết thúc và một trạng tháikhông kết thúc được đánh dấu Thực hiện bước 2 của thuật toán, chúng ta khôngtìm thấy thêm cặp trạng thái phân biệt nào nữa
Bảng đánh dấu các cặp trạng thái phân biệt cho Ví dụ
Trang 12II.2 Sự tương đương của các DFA.
Ví dụ: Xét hai DFA, hai DFA này cùng đoán nhận ngôn ngữ gồm các xâu trênbảng chữ {0, 1} kết thúc bởi kí hiệu 0
a Dựa vào bảng đánh dấu sự tương đương các trạng thái
Chúng ta dễ dàng xác định được sự tương đương của hai DFA Thật vậy, giả
sử có hai DFA M1 và M2 Xét DFA mới là hợp của hai DFA M1 và M2 Khi đó,DFA này có hai trạng thái đầu Tuy nhiên, nếu DFA M1 và M2 là tương đương thìcặp trạng thái đầu phải là cặp trạng thái tương đương Ngược lại, nếu cặp trạng tháiđầu là cặp trạng thái phân biêt thì M1 và M2 là không tương đương
Áp dụng thuật toán
Chúng ta coi hai DFA như là một DFA với các trạng thái là A, B, C, D và E.Bây giờ xây dựng bảng đánh dấu các trạng thái phân biệt của DFA này
Trang 13A B C D
A và C là cặp trạng thái tương đương, vậy hai DFA là tương đương Tức làcùng thừa nhận một ngôn ngữ
b Dựa vào tính đóng dưới phép giao.
Định lý: Nếu L1 và L2 là các ngôn ngữ chính quy thì L1 ∩ L2 cũng là ngôn ngữchính quy
Chứng minh: Chúng ta xây dựng trực tiếp DFA thừa nhận ngôn ngữ L1∩ L2
từ các DFA thừa nhận L1 và L2
Giả sử M1= (Q1, Σ1, δ1, q01, F1) và M2 = (Q2, Σ2, δ2, q02, F2) là các DFA thừanhận tương ứng L1 và L2 Chúng ta sẽ xây dựng DFA M bắt chước thực hiện đồngthời M1 và M2 Mỗi trạng thái của M sẽ là một cặp trạng thái: một trạng thái của M1
và một trạng thái của M2 Bảng chữ của M sẽ là hợp của các bảng chữ của M1 và
M2 Một dịch chuyển trong M được xây dựng tương ứng một dịch chuyển đồngthời trên M1 và M2 khi đọc cùng một kí hiệu M sẽ đoán nhận xâu vào khi đồngthời cả hai DFA M1 và M2 cùng đoán nhận xâu vào Như vậy, M được xây dựngnhư sau:
M=(Q1× Q2, Σ1∪ Σ2, δ, (q01, q02), F1× F2)
Trong đó, δ((p, q), a) = (δ1(p, a), δ2(q, a)), với p ∈ Q1, q∈ Q2, a ∈ Σ1∪ Σ2
Dễ dàng nhận thấy rằng L(M) = L(M1) ∩ L(M2)
Thật vậy, δ*((q01, q02), w) = (δ1 * (q01, w), δ2 * (q02, w)), như thế M chỉ chấpnhận w khi δ1 * (q01, w) ∈ F1 và δ2 * (q02, w) ∈ F2, nghĩa là M chỉ chấp nhận w khi
M1 chấp nhận w và M2 chấp nhận w Vậy chấp nhận L(M1) ∪ L(M2)
Ví dụ: Cho L1 là ngôn ngữ chính quy có chứa ít nhất một kí hiệu 0 được thừanhận bởi DFA M (a) và L là ngôn ngữ chính quy có ít nhất một kí hiệu 1 được
Trang 14DFA giao của hai DFAChúng ta dễ dàng nhận thấy rằng, DFA thừa nhận ngôn ngữ gồm it nhất một
Trang 15DFA biểu diễn L1
DFA biểu diễn L2
DFA biểu diễn L2
Trang 16DFA biểu diễn L1∩L2= L(M)
Ta thấy L(M) là một Automat rỗng vì không tồn tại đương đi nào từ (A, C)đến (A, E)
Trang 17+ Ma trận có 3 cột, số hàng là số các trạng thái: cột 1 là trạng thái Q, cột 2 thểhiện hàm δ (Q, 0), cột 3 thể hiện hàm δ(Q, 1).
+ Các trạng thái không kết thúc được mã hóa là số 1, trạng thái kết thúc được
Trang 19void nhapmt2(int d2[][20], int n2)
// so sanh 2 dong cua 2 ma tran
int ss2dong(int d1[][20], int d2[][20], int i, int j)
Trang 20// so sanh hai trang thai dau
int ss2ttd (int d1[][20], int d2[][20])
// tim vi tri trang thai cuoi cua DFA 1
int timttc1(int d1[][20], int n1)
// tim vi tri trang thai cuoi cua DFA 2
int timttc2(int d2[][20], int n2)
{
int vt2=-1;
for(int i=0;i<n2;i++)
Trang 21// so sanh 2 trang thai cuoi
int ss2ttc(int d1[][20], int d2[][20], int n1, int n2)
// so sanh xem dong co ton tai 1 dong o ma tran d1 bang voi
// mot dong o ma tran d2 hay ko
int ss2dongbk(int d1[][20], int d2[][20], int n1, int n2)
}
Trang 23void main()
{
clrscr();
cout<<"nhap du lieu cho DFA 1";
cout<<"\n nhap so trang thai cua DFA 1: ";
cin>>n1;
cout<<"\n trang thai ket thuc =0, trang thai ko ket thuc =1";
nhapmt1(d1, n1);
cout<<"\n nhap du lieu cho DFA 2";
cout<<"\n nhap so trang thai cua DFA 2:";
Trang 24b Dựa vào tính đóng của phép giao 2 DFA
Trang 28void main()
{ clrscr();
cout<<"nhap du lieu cho DFA 1";
cout<<"\n nhap so trang thai cua DFA 1: ";
cin>>n1;
cout<<"\n trang thai ket thuc =0, trang thai ko ket thuc =1";
nhapmt1(d1, n1);
cout<<"\n nhap du lieu cho DFA 2";
cout<<"\n nhap so trang thai cua DFA 2:";
Trang 29TÀI LIỆU THAM KHẢO
Nguyễn Văn Xuất-HVKTQS.