Проверка "всех" DFA до n состояний и m символов алфавита невозможна.Вы можете протестировать DFA с известными минимальными DFA;чтобы получить пары (DFA, минимальный DFA), вы можете сгенерировать случайные RE, получить NFA-лямбду, используя алгоритм из теоремы Клини, получить DFA с использованием конструкции подмножества, а затем свернуть с помощью известного правильного алгоритма минимизации DFA (я полагаю, выпризнайте, что канонический алгоритм корректен).
РЕДАКТИРОВАТЬ:
Чтобы расширить то, что я сказал, вот как я бы попытался сгенерировать набор тестов неминимальных конечных автоматов:
- Создание регулярного выражения с использованием N операций (конкатенация, объединение, замыкание Клини).
- Используйте алгоритм из теоремы Клини, чтобы получить NFA-лямбду с O (n) -состоянием в ней.
- Используйте конструкцию подмножества / powerset, чтобы получить DFA с O (2 ^ n) состояниями в нем.
- Повторяйте, пока не найдете достаточное количество достаточно сложных автоматов.
Создать регулярные выражения проще.Существует несколько правил:
- a является RE, если a является символом алфавита
- (rs) является RE, если r, s являются RE
- (r + s) является RE, если r, s является RE
- (r *) является RE, если r является RE
- Ничто другое не является RE
Чтобы получить RE с n операциями, рекурсивный подход работает.
GetRE(ops)
1. if ops = 0 then return RandomAlphabetSymbol()
2. select(Rand() % 3)
3. case 0 then
4. ops1 = Rand() % (ops - 1)
5. ops2 = (ops - 1) - ops1
6. return "(" + GetRE(ops1) + "+" + GetRE(ops2) + ")"
7. case 1 then
8. ops1 = Rand() % (ops - 1)
9. ops2 = (ops - 1) - ops1
10. return "(" + GetRE(ops1) + "." + GetRE(ops2) + ")"
11. case 2 then
12. return "(" + GetRE(ops - 1) + "*)"
Вы можете найти нестроковое представление (т. Е. Иерархически связанную структуру, по сути, само дерево разбора), более удобный вариантза применение алгоритма Клини для получения NFA-лямбды.