Tải bản đầy đủ (.pdf) (34 trang)

Bài giảng toán giải tích chương 3 automata hữu hạn và biểu thức chính quy

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 (364.69 KB, 34 trang )

Chương 3:

Automata hữu hạn &
Biểu thức chính quy

Nội dung:





Khái niệm DFA & NFA
Sự tương đương giữa DFA & NFA
Biểu thức chính quy
Các tính chất của tập chính quy

1


Định nghĩa ôtômát (automata)
Định nghĩa: là máy trừu tượng có cơ cấu và hoạt động
đơn giản nhưng có khả năng đoán nhận ngôn ngữ


Con người phải lập trình sẵn cho máy một ‘lộ trình’ để thực hiện

INPUT

Bộ điều khiển

OUTPUT


BỘ NHỚ

2


Phân loại automata
Automata đơn định (Deterministic Automata):


Mỗi bước di chuyển chỉ được xác định duy nhất bởi cấu hình hiện
tại (hàm chuyển của automata là đơn trị)

Automata không đơn định (Non-deterministic Automata):


Tại mỗi bước di chuyển, nó có vài khả năng để lựa chọn (hàm
chuyển của automata là đa trị)

3


Phân loại FA
DFA
Deterministic
Finite Automata

FA
(Finite Automata)

NFA

Nondeterministic
Finite Automata

Biểu thức
chính quy
4


Automata hữu hạn đơn định (DFA)
Ví dụ:

c

Input

1
Start

0 1 1 0 0 1 0 1

1 q1

q0
0

0

a

Bộ điều khiển

b

0

Trạng thái bắt đầu

0

1
q2

1
d

M=(Q, Σ, δ, q0, F)

Trạng thái kết thúc

q3

x

Phép chuyển trên nhãn x

Q : tập hữu hạn các trạng thái (p, q…)
Σ : bộ chữ cái nhập (a, b … ; w, x, y …)
δ : hàm chuyển, ánh xạ: Q x Σ → Q
q0  Q : trạng thái bắt đầu.
F  Q : tập các trạng thái kết thúc.
5



Mở rộng hàm chuyển trạng thái
1. δ(q, ) = q
2. δ(q, wa) = δ( δ(q,w), a) với  w, a
Ngôn ngữ được chấp nhận:
L(M) = { x | δ( q0, x )  F }

Ví dụ: chuỗi nhập w=110101







Ngôn ngữ
chính quy

δ(q0, 1) = q1
δ(q0, 11) = δ(q1, 1) = q0
δ(q0, 110) = δ(q1, 10) = δ(q0, 0) = q2
δ(q0, 1101) = δ(q1, 101) = δ(q0, 01) = δ(q2, 1) = q3
δ(q0, 11010) = … = δ(q3, 0) = q1
δ(q0, 110101) = … = δ(q1, 1) = q0  F
6


Giải thuật hình thức
• Mục đích: kiểm tra một chuỗi nhập x có thuộc ngôn ngữ

L(M) được chấp nhận bởi automata M.
• Input: chuỗi nhập x$
• Output: câu trả lời ‘YES’ hoặc ‘NO’
• Giải thuật:
q := q0 ;
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");
7


Automata hữu hạn không đơn định (NFA)
• Ví dụ: cho automata M (hình vẽ) và xét chuỗi nhập 01001
1
0
Start

q0

1
0
0

0

q3


q4

1
q1
1

q0

0

q0
0

0
1

q0
1

q3
q2

1

0

q0
0


q1

0

q0

1

0

q3

q0
1

q3

q1

0

q4

1

Nhận xét:
• Ứng với một trạng thái và một ký tự nhập, có thể có
không, một hoặc nhiều phép chuyển trạng thái.
• DFA là một trường hợp đặc biệt của NFA


q4

8


Định nghĩa NFA

M=(Q, Σ, δ, q0, F)

Q : tập hữu hạn các trạng thái.
Σ : bộ chữ cái nhập.
δ : hàm chuyển ánh xạ Q x Σ → 2Q
q0  Q : trạng thái bắt đầu.
F  Q : tập các trạng thái kết thúc.

Chú ý: khái niệm δ(q, a) là tập hợp tất cả các trạng thái p
sao cho có phép chuyển từ trạng thái q trên nhãn a.
Hàm chuyển trạng thái mở rộng:
• δ(q, ) = {q}
• δ(q, wa) = { p | có một trạng thái r trong δ(q, w) mà pδ(r, a) }
= δ( δ(q,w), a)
• δ(P, w) = qP δ(q, w) với P  Q
9


Ví dụ về NFA
Ví dụ: xét chuỗi nhập w=01001 và NFA đã cho ở trên


M( {q0, q1, q2, q3, q4}, {0, 1}, δ, q0, {q2, q4} )


δ

Input

Trạng thái

0

1

q0

{q0,q3}

{q0,q1}

q1

Ø

{q2}

q2

{q2}

{q2}

q3


{q4}

Ø

q4

{q4}

{q4}

• δ(q0, 0) = {q0,q3}
• δ(q0, 01) = δ( δ(q0, 0), 1)
= δ({q0, q3},1) = δ(q0, 1)
 δ(q3, 1) = {q0, q1}
• δ(q0, 010) = {q0, q3}
• δ(q0, 0100) = {q0, q3, q4}
• δ(q0, 01001) = {q0, q1, q4}

Do q4  F nên w=01001  L(M)
10


Sự tương đương giữa DFA & NFA
Định lý 1: Nếu L là tập được chấp nhận bởi một NFA thì tồn
tại một DFA chấp nhận L.
Giả sử NFA M={Q, Σ, δ, q0, F} chấp nhận L
Ta xây dựng DFA M’={Q’, Σ, δ’, q0’, F’} chấp nhận L






Q’ = 2Q . Một phần tử trong Q’ được ký hiệu là [q0, q1, …, qi] với q0, q1,
…, qi  Q
q0’ = [q0]
F’ là tập hợp các trạng thái của Q’ có chứa ít nhất một trạng thái kết thúc
trong tập F của M
Hàm chuyển δ’([q1, q2,..., qi], a) = [p1, p2,..., pj] nếu và chỉ nếu δ({q1,
q2,..., qi }, a) = {p1, p2,..., pj}
11


Ví dụ về sự tương đương giữa DFA & NFA
Ví dụ: NFA M ({q0, q1}, {0, 1}, δ, q0, {q1}) với hàm chuyển
δ(q0,0) = {q0, q1}, δ(q0,1) = {q1}, δ(q1,0) = , δ(q1,1) = {q0, q1}
Ta sẽ xây dựng DFA tương đương M’ (Q’, {0, 1}, δ’, [q0], F’)




Q’ = {, [q0], [q1], [q0, q1]}
F’ = {[q1], [q0, q1]}
Hàm chuyển δ’
 δ’(, 0) = δ’(, 1) = 
 δ’([q0], 0) = [q0, q1]
 δ’([q0], 1) = [q1]
 δ’([q1], 0) = 
 δ’([q1], 1) = [q0, q1]
 δ’([q0, q1], 0) = [q0, q1]

 δ’([q0, q1], 1) = [q0, q1]
12


NFA với - dịch chuyển (NFA)
Ví dụ: xây dựng NFA chấp nhận chuỗi 0*1*2*
0
Start
q0

1
0, 1

q1

2
1, 2

q2

0, 1, 2

0
Start
q0

1


q1


2


q2

Định nghĩa: NFA M(Q, Σ, δ, q0, F)



δ : hàm chuyển ánh xạ Q x (Σ  {}) → 2Q
Khái niệm δ(q, a) là tập hợp các trạng thái p sao cho có phép chuyển
nhãn a từ q tới p, với a  (Σ  {})

13


Mở rộng hàm chuyển trạng thái cho NFA
Định nghĩa -CLOSURE:

-CLOSURE(q) = { p | có đường đi từ q tới p theo nhãn  }


-CLOSURE(P) = qP -CLOSURE(q)

Hàm chuyển trạng thái mở rộng: mở rộng δ thành δ*



δ* : Q x Σ* → 2Q

δ*(q, w) = { p | có đường đi từ q tới p theo nhãn w, trên đường đi có thể
chứa cạnh nhãn  }

Ta có:






δ*(q, ) = -CLOSURE(q)
δ*(q,a) = -CLOSURE(δ(δ*(q, ),a))
δ*(q, wa) = -CLOSURE( δ( δ*(q, w), a) )
Cách khác: δ*(q, wa) = -CLOSURE(P)
với P = { p | r  δ*(q, w) và p  δ(r, a) }
δ*(R, w) = qR δ*(q, w)

14


Mở rộng hàm chuyển trạng thái cho NFA
0

Ví dụ:










Start
q0

1


q1

2


q2

Xét chuỗi nhập w = 012
δ*(q0, ) = -CLOSURE(q0) = {q0, q1, q2}
δ*(q0, 0) = -CLOSURE(δ(δ*(q0, ), 0))
= -CLOSURE(δ({q0, q1, q2}, 0)) = -CLOSURE(δ(q0, 0) 
δ(q1, 0)  δ(q2, 0) ) = -CLOSURE( {q0}     )
= -CLOSURE({q0}) = {q0, q1, q2}
δ*(q0, 01) = -CLOSURE(δ(δ*(q0, 0), 1))
= -CLOSURE(δ({q0, q1, q2}, 1)) = -CLOSURE({q1})
= {q1,q2}
δ*(q0, 012) = -CLOSURE(δ(δ*(q0, 01), 2))
= -CLOSURE(δ({q1, q2}, 2)) = -CLOSURE({q2}) = {q2}
Do q2  F nên w  L(M)
15



Giải thuật hình thức cho NFA
Mục đích: mô phỏng hoạt động của NFA
Input: chuỗi nhập x$
Output: câu trả lời ‘YES’ (x được chấp nhận) hoặc ‘NO’
Giải thuật:
q := -CLOSURE (q0) ;
c := nextchar ; {c là ký hiệu nhập được đọc tiếp theo}
While c <> $ do
begin
q := -CLOSURE (δ(q, c));
c := nextchar ;
end
If (q in F) then write("YES") else write("NO");

16


Sự tương đương giữa NFA và NFA
Định lý 2: nếu L được chấp nhận bởi một NFA có -dịch
chuyển thì L cũng được chấp nhận bởi một NFA không có
-dịch chuyển.
Giả sử: NFA M(Q, Σ, δ, q0, F) chấp nhận L
Ta xây dựng: NFA M’={Q, Σ, δ’, q0, F’}
Với:



F’ = F  q0 nếu -CLOSURE(q0) chứa một trạng thái thuộc F.
Ngược lại, F’ = F

δ’(q, a) = δ*(q, a)

17


Sự tương đương giữa NFA và NFA
0
Start

Ví dụ:

1


q0

q1

2


q2

Xây dựng NFA tương đương M’={Q, Σ, δ’, q0, F’}







Q = {q0, q1, q2}
Σ = {0, 1, 2}
Trạng thái bắt đầu: q0
F’ = {q0, q2}
Hàm chuyển δ’
0

Start

q0

1
0, 1

q1
0, 1, 2

1, 2

δ’
Trạng thái

Inputs
0

2

q0

q2


q1



q2



1

2

{q0, q1, q2} {q1, q2} {q2}
{q1, q2} {q2}


{q2}

18


Xây dựng DFA từ NFA()
Ví dụ: xây dựng DFA tương đương với NFA sau:
M = (Q={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, Σ={a, b}, δ, 0, F={10})

a
2
Start





0

3



1


6


4

b

a
7

b
8

b
9

10



5



Ta xây dựng DFA M’= (Q’, Σ, δ’, q0’, F’) tương đương M




Trạng thái bắt đầu: q0’ ↔ -CLOSURE(q0)
F’ = { p | trong ký hiệu của p có chứa ít nhất một trạng thái của F }
Xây dựng hàm chuyển δ’
19


Giải thuật xây dựng hàm chuyển δ’
Giải thuật:
T := -CLOSURE (q0) ; T chưa được đánh dấu ;
Thêm T vào tập các trạng thái Q’ của DFA ;
While Có một trạng thái T của DFA chưa được đánh dấu do
Begin
Đánh dấu T; { xét trạng thái T}
For Với mỗi ký hiệu nhập a do
begin
U:= -closure((T, a))
If U không có trong tập trạng thái Q’ của DFA then
begin
Thêm U vào tập các trạng thái Q’ của DFA ;
Trạng thái U chưa được đánh dấu;

[T, a] := U;{[T, a] là phần tử của bảng chuyển DFA}
end;
end;
End;
20


Xây dựng DFA từ NFA()
















-CLOSURE(q0) = {0, 1, 2, 4, 7} → q0’ = [0, 1, 2, 4, 7] = A
-CLOSURE(δ(A, a)) = -CLOSURE({3, 8}) = {1, 2, 3, 4, 6,
7, 8} → B
-CLOSURE(δ(A, b)) = -CLOSURE({5}) = {1, 2, 4, 5, 6, 7}
→C
-CLOSURE(δ(B, a)) = -CLOSURE({3, 8}) → B

-CLOSURE(δ(B, b)) = -CLOSURE({5, 9}) = {1, 2, 4, 5, 6,
7, 9} → D
-CLOSURE(δ(C, a)) = -CLOSURE({3, 8}) → B
-CLOSURE(δ(C, b)) = -CLOSURE({5}) = → C
-CLOSURE(δ(D, a)) = -CLOSURE({3, 8}) → B
-CLOSURE(δ(D, b)) = -CLOSURE({5,10}) = {1, 2, 4, 5,
6, 7, 10} → E
-CLOSURE(δ(E, a)) = -CLOSURE({3, 8}) → B
21
-CLOSURE(δ(E, b)) = -CLOSURE({5}) = → C


Xây dựng DFA từ NFA()
• Bảng hàm chuyển
Trạng thái

Ký hiệu nhập
a

b

A

B

C

B

B


D

C

B

C

D

B

E

E

B

C

b
C
b
Start
A

a

a


B
a

b
b

D
a

b

E

a

• Ký hiệu bắt đầu: q0’ = A (↔ -CLOSURE(q0) )
• Tập trạng thái kết thúc: F’ = {E} (vì trong E có chứa trạng
thái 10  F)
22


Biểu thức chính quy (RE)
Vài ví dụ:
• 00 : là biểu thức chính quy biểu diễn tập {00}
• (0+1)* : tập hợp tất cả các chuỗi số 0 và số 1,
kể cả chuỗi rỗng = {, 0, 1, 00, 01, 10, 11, 010,
011, 0010 ... }
• (0+1)*011 : ký hiệu cho tất cả các chuỗi 0, 1
tận cùng bởi 011 = {011, 0011, 1011, 00011,

11011, ... }
23


Biểu thức chính quy (RE)
• (0+1)*00(0+1)* : tập hợp tất cả các chuỗi 0,1 có
ít nhất hai số 0 liên tiếp = {00, 000, 100, 0000,
0001, 1000, 1001, 011001, ... }
• (0+ )(1+10)* : tất cả các chuỗi không có hai số 0
liên tiếp = {, 0, 01, 010, 1, 10, 01010, 0111, ... }
• 0*1*2* : {, 0, 1, 2, 01, 02, 12, 012, 0012, 0112,
... }
• 00*11*22* : tất cả các chuỗi trong tập 0*1*2* với
ít nhất một ký hiệu 0, 1 và 2 ↔ viết gọn thành
0 + 1 + 2+
24


Biểu thức chính quy (RE)
Định nghĩa: cho Σ là một bộ chữ cái. BTCQ trên Σ là các tập
hợp mà chúng mô tả được định nghĩa đệ quy như sau:





 là BTCQ ký hiệu cho tập rỗng
 là BTCQ ký hiệu cho tập {}
a  Σ, a là BTCQ ký hiệu cho tập {a}
Nếu r và s là các BTCQ ký hiệu cho các tập hợp R và S thì (r + s), (rs)

và ( r*) là các BTCQ ký hiệu cho các tập hợp R  S, RS và R* tương ứng

Thứ tự ưu tiên:
Phép bao đóng > Phép nối kết > Phép hợp
Ví dụ:


Biểu thức ((0(1*)) + 1) có thể viết là 01*+1
25


×