Giải thuật xây dựng DFA từ NFA Qua khảo sát các dạng mở rộng từ mô hình ôtômát hữu hạn ban đầu, ta thấy DFA thực chất là một trường hợp đặc biệt của NFA, nhưng : - Nó không có sự truyền
Trang 1Giải thuật xây dựng DFA từ NFA
Qua khảo sát các dạng mở rộng từ mô hình ôtômát hữu hạn ban đầu, ta thấy DFA thực chất là một trường hợp đặc biệt của NFA, nhưng :
- Nó không có sự truyền rỗng (truyền trên nhãn e)
- Với mỗi trạng thái q và ký hiệu nhập a, chỉ có duy nhất một đường truyền đến một trạng thái khác
Giả sử mỗi trạng thái của DFA là một tập trạng thái của NFA, DFA dùng trạng thái của mình để lưu giữ tất cả các trạng thái của NFA đạt được sau khi NFA đọc một ký tự nhập Như vậy sau khi đọc các ký tự nhập a1, a2, , an, DFA ở trạng thái là tập con của các trạng thái thuộc NFA, đạt được khi NFA đi từ trạng thái bắt đầu theo một con đường nào đó có tên a1a2 an Số trạng thái của DFA lúc đó phải bằng số phần tử trong tập lũy thừa của số trạng thái NFA Song, trên thực tế trường hợp xấu nhất này ít khi xảy ra Các trạng thái thực sự được dùng trong sơ
đồ chuyển cho một DFA sẽ được xác định theo các phép chuyển trạng thái trên nhãn là mọi ký hiệu từ trạng thái bắt đẩu của DFA, và sau đó lần lượt được bổ sung thêm vào tập trạng thái nếu như nó chưa có trong đó
Giải thuật chi tiết được trình bày như sau :
Input: Một ôtômát hữu hạn không đơn định NFA
Output: Một ôtômát hữu hạn đơn định DFA nhận dạng cùng ngôn ngữ như NFA Phương pháp: Xây dựng bảng hàm chuyển cho DFA mô phỏng đồng thời tất cả
các chuyển dịch của NFA trên chuỗi nhập cho trước
Ta dùng các tác vụ sau để lưu giữ các tập trạng thái của NFA :
(q : là một trạng thái của NFA, T : là tập trạng thái của NFA)
a) e-closure(q) : là tập trạng thái của NFA đạt được từ trạng thái q trên sự truyền rỗng
b) e-closure(T) : là tập trạng thái của NFA đạt được từ tất cả các trạng thái q thuộc tập T trên sự truyền rỗng
c) d(T, a) : là tập trạng thái của NFA đạt được từ tất cả các trạng thái q thuộc tập
T trên sự truyền bằng ký hiệu a
Phân tích:
Trước khi đọc vào một ký tự nhập, DFA có thể ở một trạng thái bất kỳ trong các trạng thái thuộc e-closure(q0) với q0 là trạng thái bắt đầu của NFA Gọi trạng thái này là T Giả sử các trạng thái của T là các trạng thái đạt được từ q0 trên các ký hiệu nhập và giả sử a là ký hiệu nhập kế tiếp Khi đọc a, NFA có thể chuyển đến một trạng thái bất kỳ trong tập trạng thái d(T, a) Khi chúng ta cho phép sự truyền
Trang 2rỗng, NFA có thể ở bất kỳ trạng thái nào trong e-closure(d(T, a)) sau khi đã đọc
a
Giải thuật :
Ta xây dựng các trạng thái và bảng hàm chuyển cho DFA theo cách như sau :
- Mỗi trạng thái của DFA tượng trưng bởi một tập trạng thái của NFA mà NFA
có thể chuyển đến sau khi đọc một chuỗi ký hiệu nhập gồm: tất cả sự truyền rỗng
có thể xảy ra trước hoặc sau các ký hiệu được đọc
- Trạng thái bắt đầu của DFA là e-closure(q0)
- Các trạng thái và hàm chuyển sẽ được thêm vào D bằng giải thuật trên
- Một trạng thái của DFA là trạng thái kết thúc nếu nó là tập các trạng thái của NFA chứa ít nhất một trạng thái kết thúc của NFA
Việc tính toán e-closure(T) có thể xem như quá trình tìm kiếm một đồ thị của các nút từ các nút cho trước và đồ thị bao gồm toàn những cạnh có nhãn e của NFA Giải thuật đơn giản để tìm e-closure(T) là dùng Stack để lưu giữ các trạng thái
mà cạnh của chúng chưa được kiểm tra cho sự truyền rỗng
Thí dụ 3.10 : Tạo DFA từ NFAe sau
Trang 3Hình 3.6 – Thí dụ chuyển NFA có ε-dịch chuyển
Các bước xây dựng tập trạng thái cho DFA :
1 Trạng thái bắt đầu của DFA : ε-closure(0) = {0, 1, 2, 4, 7} = A*
2 ε-closure(δ(A, a)) = ε-closure({3, 8}) = {1, 2, 3, 4, 6, 7, 8} = B*
3 ε-closure(δ(A, b)) = ε-closure({5}) = {1, 2, 4, 5, 6, 7} = C*
4 ε-closure(δ(B, a)) = ε-closure({3, 8}) = B
5 ε-closure(δ(B, b)) = ε-closure({5, 9}) = {1, 2, 4, 5, 6, 7, 9} = D*
6 ε-closure(δ(C, a)) = ε-closure({3, 8}) = B
7 ε-closure(δ(C, b)) = ε-closure({5}) = C
8 ε-closure(δ(D, a)) = ε-closure({3, 8}) = B
9 ε-closure(δ(D, b)) = ε-closure({5, 10}) = {1, 2, 4, 5, 6, 7, 10} = E*
10 ε-closure(δ(E, a)) = ε-closure({3, 8}) = B
11 ε-closure(δ(E, b)) = ε-closure({5}) = C
Từ các tập trạng thái này, ta xác định được A là trạng thái bắt đầu, E là trạng thái kết thúc (vì trong E có chứa trạng thái 10 là trạng thái kết thúc của NFA) và bảng hàm chuyển của DFA như sau :
Từ bảng hàm chuyển như trên, ta xây dựng sơ đồ chuyển trạng thái cho DFA tương đương nhận dạng cùng ngôn ngữ có dạng như sau :
Trang 4Hình 3.7 – DFA tương đương cho thí dụ 3.10
Nhận xét : Mặc dù có sự khác nhau trong định nghĩa, ta thấy dạng không đơn
định NFA được định nghĩa tổng quát hơn dạng đơn định DFA, nhưng rõ ràng khả năng nhận dạng cùng lớp ngôn ngữ của chúng là tương đương nhau Trong thực
tế, các máy tính số hoàn toàn là đơn định, trạng thái của chúng tại mỗi thời điểm
là xác định được duy nhất từ một chuỗi nhập bất kỳ và trạng thái bắt đầu
Một số gợi ý câu trả lời:
Trong một số các bài toán mang tính chọn lựa, có nhiều hướng giải quyết (nhiều cách đi) như trong các chương trình trò chơi (games) thì thông thường hướng giải quyết tốt nhất (cách đi tốt nhất) là không biết trước được, nhưng có thể tìm thấy được bằng cách sử dụng chiến lược tìm kiếm quay lui (back-tracking) Khi có một vài khả năng chọn lựa có thể, ta chọn một khả năng trong chúng và đi theo hướng đó cho đến khi xác định hướng đó là tốt nhất hay chưa Nếu chưa phải là hướng tốt nhất, ta phải quay về điểm quyết định cuối cùng trước đó và thử khảo sát theo một hướng khác Một giải thuật mô phỏng quá trình tìm kiếm quay lui này là một giải thuật không đơn định
Không đơn định đôi khi còn rất hữu hiệu trong việc giúp giải quyết các bài toán
dễ dàng Chẳng hạn, trong một số bài toán thì việc xây dựng một NFA có vẻ tự nhiên và đơn giản hơn việc tìm một DFA cho chúng Tương tự như vậy, không đơn định còn là một cơ chế hiệu quả dùng mô tả văn phạm sinh ra ngôn ngữ một cách súc tích (sự chọn lựa các luật sinh sinh từ cùng một biến)
Trong thực tế, một vài kết quả là dễ dàng được chứng minh đối với NFA hơn là DFA Vì vậy việc cho phép cơ chế không đơn định thường làm đơn giản hóa các
lý luận hình thức mà không ảnh hưởng đến tính tổng quát của kết luận
Trang 5Tối tiểu hoá ôtômát hữu hạn
Trong phần này chúng ta xét vấn đề tìm ôtômát có số trạng thái cực tiểu tương
đương (cùng đoán nhận một ngôn ngữ) với ôtômát cho trước
Trên tập các trạng thái Q chúng ta định nghĩa một số quan hệ tương đương
q 2, nếu cả hai (q1, x) và (q2, x) đều là những trạng thái kết thúc hoặc cả hai đều không kết thúc với mọi x *
Số các xâu (từ) được xây dựng từ bảng ký tự vào thường là khá lớn (có khi
là vô hạn), nhưng trong phần này chúng ta chỉ xét những trường hợp hữu hạn
hiệu q1 k q2, nếu cả hai (q1, x) và (q2, x) đều là những trạng thái kết thúc
hoặc cả hai đều không kết thúc với mọi x * có độ dài nhỏ hơn k
Hiển nhiên, hai trạng thái kết thúc hoặc hai trạng thái không kết thúc đều là 0-tương đương
Các quan hệ trên có một số tính chất như sau
xạ, bắc cầu và đối xứng)
hoạch , k của Q; các phần tử của k là các lớp k-tương đương
Trang 6Tính chất 2.7 Tồn tại n để n = n+1
Mệnh đề sau sẽ là cơ sở để xây dựng ôtômát cực tiểu
Chúng là k-tương đương,
(q1,a) và (q 2, a) cũng là k-tương đương với mọi a
Chứng minh: Chúng ta chứng minh bằng phản chứng Giả sử q1 và q2 không
phải là (k+1)-tương đương Khi đó tồn tại w = aw1 với độ dài k+1 sao cho
(q1, aw1) là trạng thái kết thúc nhưng (q2, aw 1) lại không phải là trạng thái kết thúc Như vậy,
(q1, aw1) = ((q1, a), w1) là trạng thái kết thúc và (q2, aw1) = ((q2, a),
w1) không phải là trạng thái kết thúc Từ đó suy ra (q1,a) và (q2, a) không phải là k-
Dựa vào các tính chất trên chúng ta có thể xây dựng các lớp (k+1)-tương đương khi biết các lớp k-tương đương trên tập các trạng thái và từ đó xây dựng được thuật toán cực tiểu hoá ôtômát (có số trạng thái cực tiểu) tương đương với ôtômát cho trước
Thuật toán 2.2 Xây dựng ôtômát cực tiểu hoá
Input: Cho trước ôtômát M = (Q, , , q0, F) thường là không đơn định
Output: Ôtômát đơn định và cực tiểu M = (Q, , , q0, F)
Trang 7Thiết lập phân hoạch 0 Theo định nghĩa 0-tương đương, 0 = {Q10,
Q20}, trong đó Q10 = F (tập các trạng thái kết thúc), Q20 = Q - Q10
Xây dựng k+1 từ k Xây dựng Qik, i = 1, 2, … là các tập con của k và
là các lớp (k+1)-tương đương q1 và q2 nằm trong Qik nếu chúng là (k+1) – tương đương nghĩa là (q1, a) và (q2, a) là k-tương đương, với mọi a trong bảng chữ vào Điều này xảy ra khi (q1, a) và (q2, a) nằm trong cùng lớp tương đương của k Do vậy, Qik là lớp (k+1)-tương đương Thực hiện như trên cho đến khi các tập con Qik tạo thành một phân hoạch k+1 của Q mịn hơn k
Lặp lại bước 2 để thiết lập k với k = 1, 2, … cho đến khi k = k+1
Xây dựng ôtômát cực tiểu Các trạng thái của ôtômát cực tiểu chính là các lớp tương đương được xác định như trong bước 3, đó là các phần tử của
k Bảng chuyển trạng thái thu được bằng cách thay trạng thái q bằng lớp tương đương tương ứng [q]
Lưu ý:
Dựa vào bảng chuyển trạng thái cho trước ta dễ dàng xây dựng được các lớp
0 = {Q10, Q20}, Q10 = F, Q20 = Q - F;
Giả sử đã xây dựng được k , k = 0, 1, … Với q1, q2 Qik , Qik k,
i = 1, 2, … xét các trạng thái ở các cột tương ứng với dữ liệu vào a , nếu (q1, a) và (q2, a) cùng thuộc một tập con nào đó của k thì là (k+1)-tương đương, nghĩa là q1, q2 cùng nằm trong một phân hoạch của
k+1; ngược lại sẽ không phải là (k+1)-tương đương, nghĩa là q1, q2 nằm trong hai phân hoạch khác nhau của k+1
Lặp lại bước 2 cho đến khi k = k+1
Ví dụ 2.9 Xây dựng ôtômát cực tiểu tương đương với ôtômát có đồ thị
chuyển trạng thái như trong hình H2-9
Trang 8Hình H2-9 Đồ thị chuyển trạng thái của ví dụ 2.9
Từ đồ thị chuyển trạng thái ở hình H2.9 chúng ta có bảng chuyển
trạng thái Bảng B2.7 Bảng các trạng thái của M
Trang 9Theo thuật toán trên ta có Q10 = {q3}, Q20 = { q0, q1, q2, q4, q5, q6,
q7} và
0 = {{q3},{ q0, q1, q2, q4, q5, q6, q7}}
Chúng ta xét tiếp quan hệ 1-tương đương để tính 1 Trước tiên ta có
Q11 = {q3} Dựa vào bảng B2.7 chúng ta dễ kiểm tra được q0 là 1-tương đương với q1, q5, q6 vì (q0, t) và (qi, t), i = 1, 5, 6 và t = a, b là cùng kết thúc hoặc cùng không phải là trạng thái kết thúc Vậy Q21 = { q0,
q1, q5, q6}.
Tương tự ta có thể kiểm tra được q2 -tương đương với q4 và Q31 = {
q2, q4} Hiển nhiên còn lại Q41 = {q7} Từ đó chúng ta có
1 = {{q3}, { q0, q1, q5, q6}, { q2, q4}, {q7}}
✓
Phân hoạch tiếp 1 để xây dựng 2 Q12 = {q3} và vì (q0, t) và (q6, t),
= a, b đều thuộc cùng lớp 1-tương đương (lớp {q0, q1, q5, q6}) nên q0
và q6 là 2-tương đương Vậy Q22 = {q0, q6} Nhưng q0 và q1 (q0 và q5) không phải
là 2-tương đương vì (q0, b) = q0 ((q1, b) = q2, (q0, b) = q0, (q1, b) = q2) và chúng lại không cùng lớp 1-tương đương Kiểm tra ta thấy
q1 là 2-tương
đương với q5, nên Q32 = {q1, q5} Tương tự q2 vẫn là 2-tương đương với q4, vì thế Q42 = { q2, q4} và còn lại Q52 = {q7} Vậy
Trang 102 = {{q3}, { q0, q6}, { q1, q5}, { q2, q4}, {q7}}
Tiếp tục xây dựng 3 Tương tự như trên, chúng ta thấy Q13 = {q3}; Q23
= {q0, q6} vì q0 là 3-tương đương với q6; tương tự Q33 = {q1, q5}; Q43
= {q2, q4} và
Q53 = {q7} Nghĩa là 3 = {{q3}, {q0, q6}, {q1, q5}, {q2, q4}, {q7}}
Vì 2 = 3, nên các lớp tương đương trong 2 sẽ làm cơ sở để xây dựng ôtômát cực tiểu M = (Q, {a, b}, , q0, {q3}) Trong đó Q = 2 = {{q 3 }, {q 0 , q 6 }, {q 1 , q 5 }, {q 2 , q 4 }, {q7}}
Hàm chuyển trạng thái được xác định như trong bảng B2.8
Bảng B2.8 Bảng các trạng thái của ôtômát cực tiểu
{q0,q6} {q1, q5}
{q0,
q6}
{q1, q5} {q0,q6}
{q2,
q4}
{q2, q4} {q3}
{q1,
q5}
{q0,q6 } {q7} {q0, q6} {q3}
Đồ thị chuyển trạng thái của ôtômát cực tiểu thu được sẽ là
Trang 11Hình H2-10 Ôtômát cực tiểu của ôtômát ở hình H2-9