✖

Chuyển ôtômat thành biểu thức chính quy

Ta sẽ xem cách chuyển một ôtômat hữu hạn bất kì thành biểu thức chính quy.

Mô tả thuật toán

Đầu vào là một NFA A. Trước hết ta chuyển nó thành GNFA. Ở giai đoạn thứ hai, mỗi bước ta loại bỏ một trạng thái, sửa lại hàm chuyển trạng thái cho đúng, rồi lặp lại cho đến khi chỉ còn hai trạng thái – trạng thái bắt đầu và trạng thái kết thúc. Giữa chúng có một cạnh, nhãn của cạnh là một biểu thức chính quy, và đó chính là kết quả của toàn bộ thuật toán. Như vậy, cốt lõi của cả quá trình là loại bỏ một trạng thái rồi sửa ôtômat sao cho được một ôtômat tương đương.

Loại bỏ một trạng thái

Cách loại bỏ một trạng thái có thể minh hoạ bằng một ví dụ đơn giản. Giả sử một phần của ôtômat như sau:

trong đó Ri là các biểu thức chính quy nào đó. Ôtômat sẽ như thế nào nếu loại bỏ trạng thái qr? Có thể hình dung ta đang ở trạng thái qi và hỏi: trên đoạn này, ta có thể sinh ra những xâu nào? Nếu đi thẳng từ trạng thái qi đến trạng thái qj, đó là mọi xâu khớp với biểu thức chính quy R4.

Còn nếu đi đến trạng thái qr, ta có thể sinh ra các xâu dạng R1. Nhưng ở trạng thái qr, ta có thể quay vòng theo biểu thức chính quy R2, nên thực ra ta có thể sinh ra các xâu dạng R1∘(R2∗). Vì từ trạng thái qr còn có thể đi đến trạng thái qj, ta thêm biểu thức chính quy R3. Tóm lại, theo đường này ta có thể nhận được các xâu dạng R1∘(R2∗)∘R3.

Bây giờ ta biết rằng phần này của ôtômat có thể sinh ra các xâu dạng R4 hoặc dạng R1∘(R2∗)∘R3. Tất nhiên có thể viết điều này dưới dạng biểu thức chính quy (R4)|(R1∘(R2∗)∘R3).

Bây giờ có thể dễ dàng loại bỏ trạng thái qr, chỉ giữ lại hai trạng thái qi và qj, và thay cho R4 ta ghi biểu thức chính quy vừa tìm được:

Ta làm như vậy với mọi cạnh từ mỗi trạng thái qi đến một trạng thái qj nào đó, kể cả các khuyên, tức là kể cả trường hợp qi = qj.

Sau khi loại bỏ một trạng thái, ta được một ôtômat tương đương – ôtômat đoán nhận cùng một ngôn ngữ.

Toàn bộ thuật toán

Đầu vào là NFA A = ⟨Q, Σ, δ, q0, F⟩.

  1. Chuyển NFA A thành GNFA Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. Từ đây kí hiệu k là số trạng thái của Z.
  2. Nếu k = 2, thuật toán kết thúc và biểu thức chính quy cần tìm nằm trên cạnh giữa trạng thái bắt đầu và trạng thái kết thúc.
  3. Nếu k>2, chọn một trạng thái bất kì qr khác trạng thái bắt đầu và trạng thái kết thúc, tức là qr ≠ q0′ và qr ≠ qf′. Tiếp theo, tạo GNFA mới Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩ thoả mãn: Q′′=Q′∖{qr} và với mọi qi ∈ Q′′ ∖ {qf′} và mọi qj ∈ Q′′ ∖ {q0′}, đặt δ′′(qi,qj)=(R4)|(R1(R2∗)R3), trong đó R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Sau đó quay lại bước 2.

Ví dụ

Cho ôtômat hữu hạn đầu vào sau:

Trước hết ta chuyển nó thành GNFA (không vẽ các phép chuyển ∅ thừa):

Bây giờ ta áp dụng phần thứ hai của thuật toán và loại bỏ một nút. Bắt đầu với nút q2. Ta loại bỏ nút q2 và thêm phép chuyển từ trạng thái q1 đến trạng thái qf. Phép chuyển này được ghi là b(a|b)∗, vì từ nút q1 ta đến trạng thái q2 với các xâu dạng b, sau đó có thể quay vòng với a|b, ta được (a|b)∗, và cuối cùng chuyển sang qf nhờ phép chuyển epsilon. Ở đây b(a|b)∗ϵ = b(a|b)∗. Ta được ôtômat:

Chỉ còn một trạng thái cần loại bỏ là q1. Ta thêm cạnh từ trạng thái qs đến trạng thái qf. Ghi nhãn cạnh này thế nào? Ta đến trạng thái q1 nhờ phép chuyển epsilon, có thể bỏ qua ngay phần này. Sau đó ta có thể quay vòng với a, nên được biểu thức chính quy a∗. Cuối cùng, qua cạnh còn lại ta đến qf, nên ghép biểu thức này với b(a|b)∗. Như vậy, nhãn của cạnh là biểu thức chính quy a∗ b(a|b)∗.

Ôtômat chỉ còn hai trạng thái, nên thuật toán kết thúc. Trên cạnh là biểu thức chính quy cần tìm.

Tài liệu tham khảo

Mục lục: Biểu thức chính quy, Chuyển biểu thức chính quy thành ôtômat, Ôtômat hữu hạn không đơn định tổng quát, Chuyển ôtômat thành biểu thức chính quy