Ngôn ngữ chính quy và biểu thức chính quy

Một phần của tài liệu bài giảng automat (Trang 33)

2.1. Ngôn ngữ chính quy

Ở chương 1 đã định nghĩa về các loại văn phạm và ngôn ngữ sinh bởi văn phạm tương ứng. Việc xác định kiểu ngôn ngữ thông qua văn phạm có những lúc bất tiện, vì vậy người ta đưa ra các tiếp cận khác để xác định loại ngôn ngữ không cần phải xét đến văn phạm sinh ra ngôn ngữ đó. Đối với ngôn ngữ chính quy, chúng ta có thể định nghĩa theo cách khác, xuất phát từ khái niệm tập hợp.

Xét bảng hữu hạn ký hiệu gọi là bảng chữ cái . Ký hiệu * là tập tất cả các xâu, kể cả xâu rỗng tạo bởi các ký hiệu của , còn ký hiệu +

là tập tất cả các xâu khác rỗng tạo bởi các ký hiệu của , hay nói cách khác: *=+  {}. Như vậy, một tập con của * chính là một ngôn ngữ trên , còn * cũng là một ngôn ngữ (lớn nhất) trên . Trên tập hợp tất cả các ngôn ngữ trên  chúng ta xét các phép toán sau:

Phép hợp: ký hiệu . Hợp của 2 ngôn ngữ E1 và E2 là 1 ngôn ngữ gồm tất cả những từ thuộc E1 hoặc thuộc E2.

E1  E2={  E1 hoặc  E2}

Phép nhân: ký hiệu là dấu chấm “.”. Cho 2 ngôn ngữ E1 và E2. Phép nhân E1 với E2 ký hiệu E1.E2 là 1 ngôn ngữ gồm tất cả những từ ghép 1 từ của E1 với 1 từ của E2

E1. E2={  E1 và  E2}

Phép lặp: Cho 2 ngôn ngữ E trên , phép lặp của E ký hiệu là E+, là 1 ngôn ngữ vô hạn nhận được từ phép hợp của các ngôn ngữ là các lũy thừa bậc 1, bậc 2, … của E E+=E  E2 E3 … , ký hiệu Ek=E.E…E (k lần)

Phép lặp mở rộng của E, ký hiệu là E*, chính là E+ hợp với xâu rỗng: E*=E+ {}

Ngôn ngữ sơ cấp trên : Giả sử ={a1, a2, … , an}, các ngôn ngữ  và ngôn ngữ chỉ gồm 1 ký hiệu của , tức là các ngôn ngữ {ai}, i=1, 2, … , n gọi là ngôn ngữ sơ cấp.

- 34 -

Định nghĩa:

a) Các ngôn ngữ sơ cấp trên  là ngôn ngữ chính quy trên 

b) Nếu E và F là 2 ngôn ngữ chính quy trên  thì E  F, E.F, E+ cũng là ngôn ngữ chính quy trên 

c) Không có ngôn ngữ chính quy nào khác trên  ngoài các ngôn ngữ chính quy được định nghĩa tại các mục a) và b) ở trên.

2.2. Biểu thức chính quy

Ngôn ngữ chính quy được định nghĩa qua tập hợp và các phép toán tập hợp nên để diễn đạt các ngôn ngữ chính quy người ta đưa ra biểu thức chính quy.

Định nghĩa:

a)  là biểu thức chính quy biểu diễn ngôn ngữ rỗng.

b) Nếu a   thì a là biểu thức chính quy biểu diễn ngôn ngữ {a}

c) Nếu r, s là 2 biểu thức chính quy trên  biểu diễn 2 ngôn ngữ chính quy tương ứng là R và S. Khi đó:

(r)  (s) là biểu thức chính quy biểu diễn ngôn ngữ R  S (r).(s) là biểu thức chính quy biểu diễn ngôn ngữ R.S

(r)+ , (r)* là biểu thức chính quy biểu diễn ngôn ngữ R+, R*.

Chú ý:

Với phép hợp có thể thay ký hiệu  bởi ký hiệu +

Có thể sử dụng các cặp dấu ngoặc đơn (…) để chỉ phạm vi và thứ tự thực hiện phép toán trong biểu thức chính quy.

Ví dụ:

Biểu thức chính quy (0+1)* 00(0+1)* xác định ngôn ngữ gồm những xâu bit 0, 1 có chứa cặp 00.

Biểu thức chính quy (0+1)+ 00(0+1)+ xác định ngôn ngữ gồm những xâu bit 0, 1 có chứa cặp 00 giữa 2 xâu bit 0,1 khác rỗng.

- 35 -

Mọi ngôn ngữ chính quy trên  đều nhận được từ các ngôn ngữ hữu hạn bằng cách áp dụng một số hữu hạn lần các phép toán hợp, nhân và lặp. Ngôn ngữ chính quy là vô hạn nếu trong biểu thức chính quy của nó có chứa phép lặp.

Một ngôn ngữ trên  là ngôn ngữ chính quy khi và chỉ khi nó được biểu diễn bởi 1 biểu thức chính quy.

Lớp ngôn ngữ chính quy trên  là lớp ngôn ngữ nhỏ nhất chứa các tập hữu hạn và đóng đối với các phép toán hợp, nhân và lặp.

2.3. Thuật toán Thompson

Thuật toán này xây dựng 1 NFA đoán nhận ngôn ngữ chính quy cho bởi 1 biểu thức chính quy cho trước.

Input: biểu thức chính quy r trên 

Output: NFA đoán nhận ngôn ngữ chính quy biểu diễn bởi r

Trước hết tách biểu thức chính quy r thành các biểu thức chính quy thành phần biểu diễn các ngôn ngữ sơ cấp trên : r1, r2, … , rk.

Sau đó áp dụng các luật 1, luật 2 để xây dựng các NFA: N1, N2, … , Nk tương ứng đoán nhận các ngôn ngữ chính quy biểu diễn bởi các biểu thức chính quy r1, r2, … , rk.

Cuối cùng áp dụng luật 3 để xây dựng NFA đoán nhận ngôn ngữ chính quy biểu diễn bởi biểu thức chính quy r đã cho.

Luật 1: đối với ký hiệu , xây dựng NFA đoán nhận ngôn ngữ {} như sau:

Với i là trạng thái ban đầu, f là trạng thái kết thúc.

Luật 2: đối với ký hiệu a  , xây dựng NFA đoán nhận ngôn ngữ {a} như sau:

Với i là trạng thái ban đầu, f là trạng thái kết thúc.

Luật 3: Giả sử N(s) và N(r) là các NFA đoán nhận các ngôn ngữ chính quy biểu diễn bởi các biểu thức chính quy thành phần s và r tương ứng.

1

i f

1

- 36 -

a) Đối với biểu thức chính quy (s)  (r) ta xây dựng NFA đoán nhận ngôn ngữ biểu diễn bởi biểu thức chính quy (s)  (r) như sau:

Với i là trạng thái ban đầu, f là trạng thái kết thúc của N và N tạo thành bằng cách tổ hợp hai NFA thành phần N(s) và N(r) theo sơ đồ bảng chuyển trên.

b) Đối với biểu thức chính quy (s) .(r) ta xây dựng NFA đoán nhận ngôn ngữ biểu diễn bởi biểu thức chính quy (s) .(r) như sau:

Với i là trạng thái ban đầu, f là trạng thái kết thúc của N và N tạo thành bằng cách tổ hợp hai NFA thành phần N(s) và N(r) theo sơ đồ bảng chuyển trên, bằng cách lấy trạng thái ban đầu của N(s) là trạng thái ban đầu của N, lấy trạng thái kết thúc của N(r) là trạng thái kết thúc của N.

c) Đối với biểu thức chính quy (r)+

ta xây dựng NFA đoán nhận ngôn ngữ biểu diễn bởi biểu thức chính quy (r)+ như sau:

Với i là trạng thái ban đầu, f là trạng thái kết thúc của N.

d) Đối với biểu thức chính quy (r)* ta xây dựng NFA đoán nhận ngôn ngữ biểu diễn bởi biểu thức chính quy (r)* như sau:

i f N(s) N(r)     i N(s) N(r) f i N(r) f   i N(r) f    

- 37 -

Với i là trạng thái ban đầu, f là trạng thái kết thúc của N.

2.4. Tính chất của ngôn ngữ chính quy

Lớp tất cả các ngôn ngữ chính quy trên  là đóng đối với các phép toán hợp, giao, hiệu, lấy phần bù, nhân ghép và lặp.

Tính đóng của lớp tất cả các ngôn ngữ chính quy trên  đối với các phép toán hợp, nhân ghép và lặp được chứng minh dựa trên định nghĩa của biểu thức chính quy.

Với các phép toán khác có thể chứng minh như sau:

Phép hiệu:

Giả sử R1 và R2 là 2 ngôn ngữ chính quy trên .

Gọi R=R1\ R2. Giả sử M1 và M2 là 2 FA đoán nhận R1 và R2, với M1=<, Q1, 1, q1, F1> và M2=<, Q2, 2, q2, F2>.

Ta xây dựng FA M đoán nhận R như sau: M=<, Q, , q0, F>, với Q=Q1 x Q2, q0=(q1, q2), F=F1 x (Q2 \ F2), : Q x   Q được xác định:

((q, q’), a)=(1(q, a), 2(q’, a)), với q  Q1, q’  Q2, a .

Với cách xây dựng M như vậy thì L(M)=R, suy ra R là ngôn ngữ chính quy.

Phép lấy phần bù:

Nếu R là ngôn ngữ chính quy trên  thì phần bù của R ký hiệu là R cũng là ngôn ngữ chính quy. Ta chỉ cần chỉ ra rằng tồn tại FA đoán nhận ngôn ngữ R.

Giả sử M=<, Q, , q0, F> là FA đoán nhận ngôn ngữ chính quy R, khi đó M’=<, Q, , q0, F’> với F’=Q \ F sẽ là FA đoán nhận ngôn ngữ R, hay R cũng là ngôn ngữ chính quy.

Phép giao:

Giả sử R1 và R2 là 2 ngôn ngữ chính quy, ta có thể biểu diễn phép giao của 2 ngôn ngữ qua các phép hợp và phủ định:

R1 R2=R1R2

- 38 -

Một phần của tài liệu bài giảng automat (Trang 33)