Tôi có một vấn đề đơn giản thực hiện một DFA mà chấp nhận tất cả đầu vào bắt đầu với chữ kép (aa, bb) hoặc kết thúc với chữ kép (aa, bb), được đưa ra là tập hợp bảng chữ cái của ngôn ngữ nhất định.
Tôi đã cố gắng giải quyết nó theo cách vòng vo bằng cách:
- Tạo biểu thức chính quy
- Tạo NFA tương ứng của nó
- Sử dụng cấu trúc powerset để suy ra DFA
- Giảm thiểu số lượng trạng thái trong DFA
Bước 1: Biểu thức chính quy cho vấn đề đã cho là (trong số vô số các vấn đề khác):
((aa|bb)(a|b)*)|((a|b)(a|b)*(aa|bb))
Bước 2: NFA cho biểu thức đã cho là:
(nguồn: livefilestore.com )
Ở dạng bảng, NFA là:
State Input:a Input:b
->1 2,5 3,5
2 4 -
3 - 4
(4) 4 4
5 5,7 5,6
6 - 8
7 8 -
(8) - -
Bước 3: Chuyển đổi thành DFA bằng cách sử dụng cấu trúc powerset:
Symbol, State + Symbol, State (Input:a) + Symbol, State (Input:b)
->A, {1} | B, {2,5} | C, {3,5}
B, {2,5} | D, {4,5,7} | E, {5,6}
C, {3,5} | F, {5,7} | G, {4,5,6}
(D), {4,5,7} | H, {4,5,7,8} | G, {4,5,6}
E, {5,6} | F, {5,7} | I, {5,6,8}
F, {5,7} | J, {5,7,8} | E, {5,6}
(G), {4,5,6} | D, {4,5,7} | K, {4,5,6,8}
(H), {4,5,7,8} | H, {4,5,7,8} | G, {4,5,6}
(I), {5,6,8} | F, {5,7} | I, {5,6,8}
(J), {5,7,8} | J, {5,7,8} | E, {5,6}
(K), {4,5,6,8} + D, {4,5,7} + K, {4,5,6,8}
Bước 4: Tối thiểu hóa DFA:
Tôi đã thay đổi K-> G, J-> F, I-> E trước. Trong lần lặp tiếp theo, H-> D và E-> F. Do đó, bảng cuối cùng là:
State + Input:a + Input:b
->A | B | C
B | D | E
C | E | D
(D) | D | D
(E) | E | E
Và theo sơ đồ, nó trông giống như:
(nguồn: livefilestore.com )
... đó không phải là DFA cần thiết! Tôi đã kiểm tra ba lần kết quả của tôi. Vì vậy, tôi đã đi sai ở đâu?
Ghi chú:
- -> = trạng thái ban đầu
- () = trạng thái cuối cùng