Cụm từ thông dụng chỉ định một máy trạng thái hữu hạn có thể nhận ra một tập hợp chuỗi vô hạn tiềm ẩn. Tập hợp các chuỗi có thể là vô hạn nhưng số lượng các trạng thái phải là hữu hạn, vì vậy bạn có thể kiểm tra từng trạng thái một.
Lấy ví dụ thứ hai của bạn: Trong biểu thức đầu tiên, để chuyển từ trạng thái 0 sang trạng thái 1, chuỗi phải bắt đầu bằng một chữ số. Trong biểu thức thứ hai, để có được từ trạng thái 0 đến trạng thái 1, chuỗi phải bắt đầu bằng một chữ cái. Vì vậy, bạn biết rằng không có chuỗi nào sẽ đưa bạn từ trạng thái 0 đến trạng thái 1 trong cả hai biểu thức. Bạn có câu trả lời.
Lấy ví dụ đầu tiên: Bạn biết rằng nếu chuỗi bắt đầu bằng một chữ số bạn có thể lấy từ trạng thái 0 đến trạng thái 1 với biểu thức chính quy.Vì vậy, bây giờ bạn có thể loại bỏ trạng thái 0 cho mỗi cái, và chỉ trả lời câu hỏi cho mỗi một trong hai trạng thái hữu hạn (hiện tại một trạng thái nhỏ hơn).
Điều này trông rất giống với "sự cố tạm dừng" nổi tiếng, như bạn biết là không thể giải quyết trong trường hợp chung cho máy Turing hoặc tương đương. Nhưng trên thực tế, vấn đề dừng lại là khả năng giải được cho một máy hữu hạn, đơn giản vì có một số hữu hạn các trạng thái.
Tôi tin rằng bạn có thể giải quyết vấn đề này với FSM không xác định. Nếu regex của bạn chỉ có một sự chuyển tiếp từ mỗi trạng thái sang trạng thái tiếp theo, một FSM xác định có thể giải quyết nó. Nhưng một biểu thức chính quy có nghĩa là ví dụ nếu bạn đang ở trong tiểu bang 2, thì nếu caracter là một chữ số bạn đi đến tiểu bang 3, nếu nhân vật là một lá thư bạn đến tiểu bang 4.
Vì vậy, đây là những gì tôi sẽ làm:
Giải quyết nó cho tập con của FSM chỉ có một chuyển tiếp từ trạng thái này sang trạng thái tiếp theo. Ví dụ: regex khớp với cả "Bob" và "bob" và regex thứ hai chỉ khớp với "bob" và "boB".
Xem bạn có thể triển khai giải pháp trong máy trạng thái hữu hạn hay không. Tôi nghĩ điều này có thể xảy ra. Đầu vào cho một trạng thái là một cặp biểu diễn một quá trình chuyển đổi cho một FSM và một quá trình chuyển đổi cho một FSM thứ hai. Ví dụ: Trạng thái 0: Nếu (r1, r2) là (("B" hoặc "b"), "b") thì Trạng thái 1. Trạng thái 1: Nếu (r1, r2) là (("o"), ("o")) sau đó là trạng thái 2. v.v.
Bây giờ cho trường hợp tổng quát hơn, trong trường hợp ví dụ, hai trạng thái trở lại trạng thái hai hoặc trạng thái trước đó; ví dụ, regex 1 chỉ nhận ra "đáp ứng" nhưng regex 2 nhận ra "meeeet" với số lượng không giới hạn của e. Bạn sẽ phải giảm bớt chúng để regex 1 nhận ra "t" và regex 2 nhận ra "t". Tôi nghĩ rằng điều này có thể được giải quyết bằng FSM không xác định.
Đó là trực giác của tôi.
Tôi không nghĩ rằng nó hoàn thành NP, chỉ vì trực giác của tôi cho tôi biết bạn sẽ có thể rút ngắn từng regex theo một trạng thái với mỗi bước.
Nguồn
2010-06-03 15:32:37
Hm ... nhất regex (hoặc regex true) tương đương với automata hữu hạn. Tôi tự hỏi nếu, cho hai automata như vậy trên cùng một bảng chữ cái, người ta có thể cho biết liệu có một số chuỗi trong ngôn ngữ được chấp nhận bởi cả hai. Cá nhân, tôi không nhìn thấy một cách chung mà không có brute-buộc tất cả các chuỗi dài 1, 2, 3, 4, 5 ... nói chung điều này có thể mất "mãi mãi" để kiểm tra. –
Tôi chắc chắn bạn phải bạo lực này. – rfusca
@ rfusca: Brute buộc trên một danh sách vô hạn các đầu vào có thể là không đáng kể. Nếu không có giao lộ, thuật toán bạo lực sẽ không bao giờ chấm dứt. – sepp2k