Làm cách nào để xác minh rằng DFA tương đương với NFA?


10

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?


Một cách giải thích của ứng viên: có "trình kiểm tra kết quả" (theo nghĩa của Wasserman và Blum ) cho vấn đề chuyển đổi NFA thành DFA không? Nói cách khác, có một thuật toán nào nhanh hơn so với việc thực hiện chuyển đổi, đưa ra một cặp được cho là (đầu vào, đầu ra) cho thuật toán chuyển đổi, kiểm tra xem đầu ra có đúng không?
DW

Câu trả lời:


7

Đâ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 NMộtBMộtBBMộtL(D)L(N)L(N)L(D)DN

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 BMộtBMộtB¯= =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 NL(N)L(D)DN

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.NL(D)L(N)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 NL(D)L(N)22nnN


Cảm ơn bạn đã trả lời chu đáo. Tôi đã học được một cái gì đó mới ngày hôm nay. Có vẻ như đặt cược tốt nhất của tôi là chỉ so sánh công việc của tôi với JFLAP.
IAmOnStackExchange

2
Trừ khi NFA của bạn lớn (ví dụ với hơn 7-8 tiểu bang), tùy chọn tốt nhất của bạn có lẽ là chỉ cần kiểm tra cẩn thận. Thông thường, sau khi xóa các trạng thái không thể truy cập, bạn nhận được một DFA nhỏ và kiểm tra thủ công không quá khó.
Shaull

1
Bạn không thể xác định và thu nhỏ cả hai máy và kiểm tra xem hai máy đó có phải là đẳng cấu không?
saadtaame

5

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.


Một cách để tiến hành là chuyển đổi NFA thành DFA , mục tiêu của người đăng là xác minh kết quả của thuật toán đó. Áp dụng hai lần thực sự là một cách nhưng không tránh khỏi sự hiểu lầm về thuật toán. Đó có lẽ là lý do tại sao một phương pháp kiểm tra đã được hỏi.
AProgrammer 9/12/2015

2
@aprogrammer Phần chính trong câu trả lời của tôi là một tham chiếu đến thuật toán có sẵn tập lệnh chứng minh Coq, đây chắc chắn là phương pháp kiểm tra an toàn nhất mà tôi có thể nghĩ ra.
J.-E.

1
Tôi không chắc ai đó không chắc về sự hiểu biết của anh ta về một thuật toán đơn giản như NFA đến DFA sẽ làm gì với tập lệnh chứng minh Coq. Điều này trông giống như sử dụng đại số để giải bài toán của học sinh lớp ba.
AProgrammer

0

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.

  • D1D2¯D2D1¯D¯

  • 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.

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.