Làm cách nào để chuyển đổi NFA với các chu kỳ chồng chéo thành biểu thức chính quy?


11

Nếu tôi hiểu chính xác, NFA có sức mạnh biểu cảm tương tự như biểu thức thông thường. Thông thường, việc đọc các biểu thức chính quy tương đương từ NFA rất dễ dàng: bạn dịch các chu kỳ sang các ngôi sao, các mối nối như là lựa chọn thay thế, v.v. Nhưng phải làm gì trong trường hợp này:

nhập mô tả hình ảnh ở đây
[ nguồn ]

Các chu trình chồng chéo làm cho khó thấy những gì máy tự động này chấp nhận (về các biểu thức thông thường). Có một mẹo?


2
Sẽ tốt hơn nếu bạn có thể chỉ ra trong sơ đồ trạng thái ban đầu và trạng thái cuối cùng là gì: một mũi tên nhỏ đến trạng thái ban đầu và một vòng tròn kép là trạng thái cuối cùng. Ngoài ra, thật khó để biết bạn đang sai ở đâu nếu bạn không đưa ra bất kỳ dấu hiệu nào về những gì bạn đã cố gắng.
Dave Clarke

Có lẽ tài liệu này có thể giúp bạn: nó giải thích rõ ràng cách chuyển đổi NFA thành RE.
Vor

1
Tại sao nó khó? Bạn đã thử một trong những thuật toán kinh điển chưa? Ansatz tốt nhất bạn có thể làm là gì?
Raphael

3
Tôi đã chỉnh sửa để làm cho câu hỏi (imho) thú vị và tốt cho trang web này. Xem lịch sử sửa đổi để hình thành một ý kiến.
Raphael

1
Tôi đã có sẵn câu trả lời để biến NFA của bạn thành biểu thức chính quy, nhưng tôi đã xóa nó: Câu trả lời của Raphael cung cấp cho bạn phương pháp bạn cần tự làm (nó cũng đưa ra một liên kết đến một ví dụ), vì vậy bạn có thể thực hành nếu bạn muốn Nếu bạn vẫn muốn giải pháp của tôi, tôi sẽ phục hồi câu trả lời của tôi.
Alex ten Brink

Câu trả lời:


5

Thay vì "đọc tắt", bạn nên sử dụng một trong một số phương pháp kinh điển để làm điều này. Cho đến nay, thứ tốt nhất tôi từng thấy là một biểu thức tự động như hệ phương trình của các ngôn ngữ (thông thường) có thể được giải. Nó đặc biệt tốt vì nó dường như mang lại nhiều biểu thức ngắn gọn hơn các phương thức khác.

Tôi đã viết tài liệu này giải thích phương pháp cho sinh viên vào mùa hè năm ngoái. Nó liên quan trực tiếp đến một bài giảng cụ thể; tài liệu tham khảo được đề cập là định nghĩa điển hình của biểu thức chính quy. Một bằng chứng về Bổ đề của Arden (một kết quả cần thiết) được chứa; một cho sự chính xác của phương pháp bị thiếu. Khi tôi học về nó trong bài giảng, tôi không có một tài liệu tham khảo, thật đáng buồn.

Tóm lại: Với mọi trạng thái , hãy tạo phương trìnhqi

Qi=qiaqjaQj{{ε}, qiF, else

Trong đó là tập hợp các trạng thái cuối cùng và có nghĩa là có sự chuyển đổi từ sang được gắn nhãn . Nếu bạn đọc as hoặc (tùy thuộc vào định nghĩa biểu thức chính quy của bạn), bạn sẽ thấy rằng đây là một phương trình của biểu thức chính quy.Fqiaqjqiqja+

Việc giải quyết nó (sử dụng Bổ đề của Arden ) mang lại một biểu thức chính quy cho mọi trạng thái mô tả chính xác những từ có thể được chấp nhận bắt đầu từ ; do đó (nếu là trạng thái ban đầu) là biểu thức mong muốn.QiqiQ0q0

Ứng dụng cho máy tự động đã cho là một bài tập; một ví dụ đầy đủ được bao gồm trong tài liệu liên kết ở trên .

Xem thêm ở đây , nơi tôi đăng một câu trả lời tương tự.


1
Xem câu hỏi tham khảo này cho các phương pháp chung khác.
Raphael

3

Nếu chỉ có một chuỗi các trạng thái không có vòng lặp, bạn có biết phải làm gì không?

Nếu có một vòng lặp đơn giản mà không có sự phân nhánh chồng chéo này, bạn có biết phải làm gì không?

(Nếu câu trả lời là Số không, hãy nghĩ về những trường hợp này trước.)

Bây giờ, ý tưởng là biến đổi máy tự động dần dần để đặt nó ở dạng mà bạn có thể phát hiện ra các mẫu đó: chuỗi, vòng lặp và đường dẫn chuyển hướng cuối cùng (dẫn đến xen kẽ). Ở mỗi bước chuyển đổi, hãy chú ý rằng máy tự động chuyển đổi vẫn nhận ra cùng một ngôn ngữ.

Hãy ghi nhớ rằng đây là một phi automaton -deterministic. Một trong những bạn đã đăng tình cờ là xác định, nhưng nó không phải giữ nguyên như vậy khi bạn chuyển đổi nó.

Vì điểm dính là có thể đạt được từ hai điểm khác nhau, hãy chia nó thành hai. Giữ , xóa quá trình chuyển đổi từ sang và thêm vào đó một trạng thái mới với các chuyển đổi . Bây giờ bạn sẽ có thể phát hiện ra một mô hình.q 1 f q 2 g q 3 q 4 q 2 q 5 q 4 j q 5 g q 3q2q1fq2gq3q4q2q5q4jq5gq3

Nếu bạn vẫn gặp sự cố tại thời điểm này, hãy lưu ý rằng vòng lặp liên quan đến tương ứng với một biểu thức chính quy đơn giản. Khi bạn đến , bạn có thể thực hiện bao nhiêu lần chạy quanh vòng lặp này tùy thích. Theo một nghĩa nào đó (có thể được thực hiện về mặt kỹ thuật), bạn có thể thay thế trạng thái bằng biểu thức chính quy .q 3 q 3 ( h j g ) *q3,q4,q5q3q3(hjg)

Hãy cẩn thận để kiểm tra các tiểu bang là cuối cùng. Nó có thể giúp không lo lắng về điều này lúc đầu và tạo một vòng lặp lớn, sau đó sao chép các phần kết thúc giữa vòng qua vòng lặp.

Đây không nhất thiết là kỹ thuật hiệu quả nhất hoặc là kỹ thuật tạo ra biểu thức chính quy đơn giản nhất, nhưng nó đơn giản.


3

Tách q_1


Và điều này trả lời câu hỏi như thế nào?
Raphael

1
Nếu bạn viết lại máy trạng thái theo cách này, thì việc đọc biểu thức chính quy tương đương là chuyện nhỏ.
Jukka Suomela

1
Có lẽ bạn nên bao gồm điều này trong văn bản trả lời. Điều này luôn luôn làm việc?
Raphael

@Raphael: Nó hoạt động trong trường hợp này. :) Ý tưởng chung đằng sau thủ thuật này là như sau: chúng tôi đã thực hiện các chu trình "lồng đúng cách". Đó là, chúng tôi không có cấu trúc chu kỳ [(])nhưng [()].
Jukka Suomela
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.