Як я можу перевірити, що DFA еквівалентний NFA?


10

Я вивчаю, як конвертувати NFA в DFA і хочу переконатися, що я роблю це правильно. Очевидно, що повернутися в інший бік - це не річ. Хтось знає про алгоритм, щоб перевірити, що DFA еквівалентний NFA?


Одне кандидатурне тлумачення: чи існує "перевірка результатів" (у розумінні Васермана та Блума ) для проблеми перетворення НФА в ДФА? Іншими словами, чи існує алгоритм, який асимптотично швидший, ніж сам перетворення, який, даючи передбачувану (вхідну, вихідну) пару для алгоритму перетворення, перевіряє, чи правильний вихід?
DW

Відповіді:


7

Це проблемне питання. Є спосіб перевірити еквівалентність автоматів, який я зараз поясню, але, боюся, це вам не допоможе, як ви побачите наприкінці.

Нагадаємо, що два множини і B дорівнюють iff A B і B A (це визначення заданої рівності). Таким чином, вам достатньо переконатися, що L ( D ) L ( N ) і L ( N ) L ( D ) , де D і N - ваш DFA і NFA відповідно.АБАББАL(D)L(N)L(N)L(D)DN

Але як ви перевіряєте вміст мов, можете запитати. Ну а тепер зауважте, що iff A ¯ B = (де ¯ B - доповнення B ).АБАБ¯=Б¯Б

Розглянемо спочатку перевірку, чи . Для цього вам потрібно доповнити D (дуже просто - поміняйте місцями, що приймають відхиляючі стани), потім побудуйте автомат перетину (наприклад, із конструкцією виробу) на N , і перевірте наявність порожнечі, знайшовши шлях до приймаючого стану.L(N)L(D)DN

Однак зворотний напрямок покаже, чому це вам не допомагає. Для того , щоб перевірити , є чи , ви повинні доповнювати N . Але для того, щоб доповнити NFA, спочатку вам потрібно перетворити його в DFA, не даючи всій ідеї безглуздо.L(D)L(N)N

По суті, проблема з вашим питанням набагато глибша: ви хочете переконатися, що ви (невизначена обчислювальна модель) правильно виконали визначений алгоритм. Тож це насправді не проблема інформатики.

Я скажу так: слідуючи запропонованим мною конструкціям, не важко зробити висновок, що iff є слово довжиною не більше 2 2 n ( n - кількість станів N ), приймається одним, а не іншим. Тож ви можете спробувати всі слова до такої довжини.L(D)L(N)22ннN


Дякую за добре продуману відповідь. Я дізнався щось нове сьогодні. Здається, моя найкраща ставка - просто порівняти мою роботу проти JFLAP.
IAmOnStackExchange

2
Якщо ваш NFA великий (наприклад, з більш ніж 7-8 штатами), ваш найкращий варіант - це, ймовірно, просто уважно перевірити себе. Зазвичай після видалення недоступних станів ви отримуєте невеликий DFA, і перевірити вручну не надто складно.
Шоул

1
Ви не можете визначити та мінімізувати обидві машини та перевірити, чи ці дві машини ізоморфні?
saadtaame

5

Один із способів продовжити - перетворити NFA в DFA, а потім перевірити еквівалентність двох DFA, для яких існує лінійний алгоритм [1].

У наступному документі розглядається більш загальний випадок еквівалентності двох NFA (що, звичайно, стосується і вашого випадку).

Філіппо Бончі, Дамієн Пус, перевірка еквівалентності NFA з бісумуляцією до принципу мов програмування (POPL), січень 2013, Рома, Італія. ACM, pp.457-468, 2013.

Анотація . Ми запроваджуємо бісуміляцію до конгруентності як техніку доведення мовної еквівалентності недетермінованих кінцевих автоматів. Використовуючи цю методику, ми розробили оптимізацію класичного алгоритму Хопкрофтом та Карпом [1]. Ми порівнюємо наш підхід із нещодавно запровадженими антицепочечними алгоритмами, аналізуючи та пов'язуючи два основні методи коіндуктивного доказування. Ми наводимо конкретні приклади, коли ми експоненціально вдосконалюємось проти антихаїнів; Крім того, експериментальні результати показують незначні поліпшення.

[1] Дж. Е. Хопкрофт і Р. М. Карп. Лінійний алгоритм тестування еквівалентності кінцевих автоматів. TR 114, Cornell Univ., Грудень 1971 року.

Дивіться також веб-додаток до цього документу , який містить сценарії доказів Coq про результати, посилання на реалізацію та інтерактивний аплет.


Один із способів продовжити - перетворити NFA в DFA , мета плаката - перевірити результат цього алгоритму. Застосовувати двічі - це справді один із способів, але не застрахований від нерозуміння алгоритму. Ось, мабуть, тому і попросили метод перевірки.
AProgrammer

2
@aprogrammer Основна частина моєї відповіді - це посилання на алгоритм, для якого доступний скрипт доказування Coq, що, безумовно, є найбезпечнішим методом перевірки, про який я можу придумати.
Ж.-Є.

1
Я не впевнений, що хтось не впевнений у своєму розумінні такого простого алгоритму, як NFA для DFA, що зробить із сценарієм підтвердження Coq. Це схоже на використання алгебри для вирішення математичної задачі третьокласника.
AProgrammer

0

це питання скоріше стосується тестування прикладного програмного забезпечення та перевірки правильності на практиці, а не теоретичного питання.

  • D1D2¯D2D1¯D¯

  • ви можете покластися на попередньо перевірене програмне забезпечення, яке було протестовано для підтвердження ваших результатів. наприклад, бібліотека AT&T FSM

  • інша ідея: рандомізоване тестування. вибирайте випадкові рядки у межах вашої мови. визначте, приймаються чи неприйняті рядки DFA / NFA. якщо обидва не рівні, з великою часткою ймовірності ви знайдете рядки, які не відповідають.

  • інша ідея: ви можете написати код, щоб пройти всі гілки DFA та NFA на певну глибину і шукати невідповідності. це рівнозначно перерахуванню всіх потенційних прийнятих рядків заданих довжин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.