Không thể chuyển đổi từ NFA sang DFA


11

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 Σ={a,b} 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:

  1. Tạo biểu thức chính quy
  2. Tạo NFA tương ứng của nó
  3. Sử dụng cấu trúc powerset để suy ra DFA
  4. 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à:

NFA
(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ư:

DFA cuối cùng
(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

3
Đây là một ví dụ tuyệt vời cho một câu hỏi cơ bản đã được đặt ra, bởi vì bạn bao gồm toàn bộ quá trình suy nghĩ của bạn.
Raphael

Cảm thấy tuyệt vời để được đánh giá cao, cảm ơn! ^^
Anurag Kalia

Câu trả lời:


5

Bạn ổn đến bước 3 (DFA) nhưng tối thiểu hóa của bạn là không chính xác.

Rõ ràng rằng DFA được tối thiểu hóa là không đúng, bởi vì cả hai yếu tố đầu vào baab(không có trong ngôn ngữ gốc, cũng không được DFA chấp nhận trong bước 3) dẫn đến trạng thái cuối cùng E.

Nhìn vào các bước tối thiểu hóa của bạn, có vẻ như bạn đã thống nhất các trạng thái cuối cùng và không cuối cùng; ví dụ J (chung kết) -> F (không phải cuối cùng) và I (cuối cùng) -> E (không phải cuối cùng). Hợp nhất một trạng thái cuối cùng với trạng thái không cuối cùng sẽ thay đổi ngôn ngữ được tự động chấp nhận, dẫn đến việc chấp nhận các chuỗi không chính xác như đã nêu ở trên.


1
Oh. Vì vậy, đó là những gì đang tạo ra vấn đề ở đây. Bây giờ tôi nhớ, lần cuối cùng tôi sử dụng phương pháp này, không có bất kỳ trạng thái chấp nhận cụ thể nào trong bảng!
Anurag Kalia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.