Любой конечный набор строк составляет обычный язык. Это просто написать NFA, принимающий такой язык. Исходя из этого, вы можете сгенерировать DFA, используя конструкцию подмножества, и минимизировать его, используя тот факт, что DFA требуется только одно состояние для каждого класса эквивалентности отношения неразличимости. Таким образом, это полностью алгоритмический процесс ... получение регулярных выражений и / или грамматики тогда аналогично просто.
При этом, если вы хотите сгенерировать грамматику, которая генерирует строки и, возможно, другие ... ваша проблема кажется некорректной. Для любого конечного набора строк бесконечное число грамматик генерирует их и другие строки ... бесконечность числа, исходя из того факта, что вы можете генерировать любые другие строки, до тех пор, пока вы нажмете целевой набор данных. По сути, ваш вопрос: «учитывая начало последовательности a1, a2, ..., an, ..., скажите, каковы следующие n элементов». Это невозможно сделать, если вы просто не хотите получить некоторый ответ ... в этом случае вы всегда можете начать с DFA и предложить способы обобщить это (т. Е. Только принимать больше строк).
Действительно, учитывая, например, обычная грамматика, легко вводить новые строки ... так что, возможно, используйте первый ответ в качестве отправной точки. Обратите внимание, однако, что преобразование из NFA в DFA может быть крайне неэффективным ... асимптотически экспоненциальным.