Я вивчаю, як конвертувати NFA в DFA і хочу переконатися, що я роблю це правильно. Очевидно, що повернутися в інший бік - це не річ. Хтось знає про алгоритм, щоб перевірити, що DFA еквівалентний NFA?
Я вивчаю, як конвертувати NFA в DFA і хочу переконатися, що я роблю це правильно. Очевидно, що повернутися в інший бік - це не річ. Хтось знає про алгоритм, щоб перевірити, що DFA еквівалентний NFA?
Відповіді:
Це проблемне питання. Є спосіб перевірити еквівалентність автоматів, який я зараз поясню, але, боюся, це вам не допоможе, як ви побачите наприкінці.
Нагадаємо, що два множини і B дорівнюють iff A ⊆ B і B ⊆ A (це визначення заданої рівності). Таким чином, вам достатньо переконатися, що L ( D ) ⊆ L ( N ) і L ( N ) ⊆ L ( D ) , де D і N - ваш DFA і NFA відповідно.
Але як ви перевіряєте вміст мов, можете запитати. Ну а тепер зауважте, що iff A ∩ ¯ B = ∅ (де ¯ B - доповнення B ).
Розглянемо спочатку перевірку, чи . Для цього вам потрібно доповнити D (дуже просто - поміняйте місцями, що приймають відхиляючі стани), потім побудуйте автомат перетину (наприклад, із конструкцією виробу) на N , і перевірте наявність порожнечі, знайшовши шлях до приймаючого стану.
Однак зворотний напрямок покаже, чому це вам не допомагає. Для того , щоб перевірити , є чи , ви повинні доповнювати N . Але для того, щоб доповнити NFA, спочатку вам потрібно перетворити його в DFA, не даючи всій ідеї безглуздо.
По суті, проблема з вашим питанням набагато глибша: ви хочете переконатися, що ви (невизначена обчислювальна модель) правильно виконали визначений алгоритм. Тож це насправді не проблема інформатики.
Я скажу так: слідуючи запропонованим мною конструкціям, не важко зробити висновок, що iff є слово довжиною не більше 2 2 n ( n - кількість станів N ), приймається одним, а не іншим. Тож ви можете спробувати всі слова до такої довжини.
Один із способів продовжити - перетворити NFA в DFA, а потім перевірити еквівалентність двох DFA, для яких існує лінійний алгоритм [1].
У наступному документі розглядається більш загальний випадок еквівалентності двох NFA (що, звичайно, стосується і вашого випадку).
Філіппо Бончі, Дамієн Пус, перевірка еквівалентності NFA з бісумуляцією до принципу мов програмування (POPL), січень 2013, Рома, Італія. ACM, pp.457-468, 2013.
Анотація . Ми запроваджуємо бісуміляцію до конгруентності як техніку доведення мовної еквівалентності недетермінованих кінцевих автоматів. Використовуючи цю методику, ми розробили оптимізацію класичного алгоритму Хопкрофтом та Карпом [1]. Ми порівнюємо наш підхід із нещодавно запровадженими антицепочечними алгоритмами, аналізуючи та пов'язуючи два основні методи коіндуктивного доказування. Ми наводимо конкретні приклади, коли ми експоненціально вдосконалюємось проти антихаїнів; Крім того, експериментальні результати показують незначні поліпшення.
[1] Дж. Е. Хопкрофт і Р. М. Карп. Лінійний алгоритм тестування еквівалентності кінцевих автоматів. TR 114, Cornell Univ., Грудень 1971 року.
Дивіться також веб-додаток до цього документу , який містить сценарії доказів Coq про результати, посилання на реалізацію та інтерактивний аплет.
це питання скоріше стосується тестування прикладного програмного забезпечення та перевірки правильності на практиці, а не теоретичного питання.
ви можете покластися на попередньо перевірене програмне забезпечення, яке було протестовано для підтвердження ваших результатів. наприклад, бібліотека AT&T FSM
інша ідея: рандомізоване тестування. вибирайте випадкові рядки у межах вашої мови. визначте, приймаються чи неприйняті рядки DFA / NFA. якщо обидва не рівні, з великою часткою ймовірності ви знайдете рядки, які не відповідають.
інша ідея: ви можете написати код, щоб пройти всі гілки DFA та NFA на певну глибину і шукати невідповідності. це рівнозначно перерахуванню всіх потенційних прийнятих рядків заданих довжин.