Tôi đang học cách chuyển đổi NFA thành DFA và tôi muốn chắc chắn rằng mình đang làm đúng. Rõ ràng, quay trở lại theo hướng khác không phải là một điều. Có ai biết một thuật toán để kiểm tra xem DFA có tương đương với NFA không?
Tôi đang học cách chuyển đổi NFA thành DFA và tôi muốn chắc chắn rằng mình đang làm đúng. Rõ ràng, quay trở lại theo hướng khác không phải là một điều. Có ai biết một thuật toán để kiểm tra xem DFA có tương đương với NFA không?
Câu trả lời:
Đây là một câu hỏi có vấn đề. Có một cách để kiểm tra tính tương đương của automata, mà bây giờ tôi sẽ giải thích, nhưng tôi sợ nó sẽ không giúp bạn, như bạn sẽ thấy ở cuối.
Hãy nhớ lại rằng hai tập hợp và bằng iff và (đây là định nghĩa của đẳng thức tập hợp). Như vậy, đủ để bạn xác minh rằng và , trong đó và lần lượt là DFA và NFA của bạn.B A ⊆ B B ⊆ A L ( D ) ⊆ L ( N ) L ( N ) ⊆ L ( D ) D N
Nhưng làm thế nào để bạn kiểm tra ngăn chặn các ngôn ngữ, bạn có thể hỏi. Chà, bây giờ hãy quan sát rằng iff (trong đó là phần bù của ).Một ∩ ¯ B = ∅ ¯ B B
Trước tiên hãy xem xét việc kiểm tra xem . Để làm điều này, bạn cần bổ sung (rất dễ dàng - hoán đổi trạng thái chấp nhận), sau đó xây dựng tự động giao cắt (ví dụ với việc xây dựng sản phẩm) với và kiểm tra sự trống rỗng, bằng cách tìm đường dẫn đến trạng thái chấp nhận.D N
Tuy nhiên, hướng ngược lại sẽ cho thấy lý do tại sao điều này không giúp bạn. Để kiểm tra xem , bạn cần phải bổ sung cho . Nhưng để bổ sung cho NFA, trước tiên bạn cần chuyển đổi nó thành DFA, khiến toàn bộ ý tưởng trở nên vô nghĩa.N
Về cơ bản, vấn đề với câu hỏi của bạn sâu sắc hơn nhiều: bạn muốn xác minh rằng bạn (một mô hình tính toán không xác định) đã thực hiện đúng thuật toán được xác định rõ. Vì vậy, đây không thực sự là một vấn đề khoa học máy tính.
Tôi sẽ nói điều này: theo các công trình mà tôi đề xuất, không khó để kết luận rằng iff có một từ có độ dài nhiều nhất là ( là số lượng trạng thái của ) được chấp nhận bởi một và không phải bởi người khác. Vì vậy, bạn có thể thử tất cả các từ cho đến chiều dài này.2 2 n n N
Một cách để tiến hành là chuyển đổi NFA thành DFA và sau đó kiểm tra sự tương đương của hai DFA, trong đó có thuật toán tuyến tính [1].
Bài viết sau đây xử lý trường hợp tổng quát hơn về sự tương đương của hai NFA (tất nhiên cũng áp dụng cho trường hợp của bạn).
Filippo Bonchi, Damien Muff, Kiểm tra sự tương đương của NFA với sự phân chia theo nguyên tắc ngôn ngữ lập trình (POPL), tháng 1 năm 2013, Roma, Ý. ACM, tr.457-468, 2013.
Tóm tắt . Chúng tôi giới thiệu chia nhỏ cho đến đồng dạng như là một kỹ thuật để chứng minh sự tương đương ngôn ngữ của automata hữu hạn không xác định. Khai thác kỹ thuật này, chúng tôi nghĩ ra một tối ưu hóa thuật toán cổ điển của Hopcroft và Karp [1]. Chúng tôi so sánh cách tiếp cận của chúng tôi với các thuật toán antichain được giới thiệu gần đây, bằng cách phân tích và liên quan đến hai phương pháp chứng minh cưỡng chế cơ bản. Chúng tôi đưa ra các ví dụ cụ thể, nơi chúng tôi cải thiện theo cấp số nhân so với antichains; kết quả thí nghiệm hơn nữa cho thấy những cải tiến không đáng kể.
[1] JE Hopcroft và RM Karp. Một thuật toán tuyến tính để kiểm tra sự tương đương của automata hữu hạn. TR 114, Đại học Cornell, tháng 12 năm 1971.
Xem thêm phụ lục web của bài viết này , trong đó có các kịch bản chứng minh Coq về kết quả, liên kết đến việc triển khai và một applet tương tác.
câu hỏi này là về kiểm thử phần mềm ứng dụng và xác minh tính đúng đắn trong thực tế hơn là một câu hỏi lý thuyết.
bạn có thể dựa vào phần mềm đã được kiểm tra trước đó đã được kiểm tra để xác thực kết quả của bạn. ví dụ thư viện AT & T FSM
ý tưởng khác: thử nghiệm ngẫu nhiên. chọn chuỗi ngẫu nhiên trong ngôn ngữ của bạn. xác định xem các chuỗi được DFA / NFA chấp nhận hay không chấp nhận. nếu hai số này không bằng nhau, với xác suất cao bạn sẽ tìm thấy các chuỗi không khớp.
một ý tưởng khác: bạn có thể viết mã để đi qua tất cả các nhánh của DFA và NFA đến một số độ sâu cụ thể và tìm kiếm sự không phù hợp. điều này tương đương với việc liệt kê tất cả các chuỗi được chấp nhận tiềm năng có độ dài nhất định.