Из моего чтения кажется, что большинство грамматик занимается созданием бесконечного числа строк. Что делать, если вы работали наоборот?
Если задано n строк длиной m, должна быть возможность создать грамматику, которая будет генерировать эти строки и только эти строки.
Есть ли известный способ сделать это? В идеале название техники я могу исследовать. В качестве альтернативы, как бы я занялся поиском литературы, чтобы найти такой метод?
formal-languages
regular-languages
formal-grammars
finite-sets
Густав Бертрам
источник
источник
Ответы:
Это относится к общей теме «индукции грамматики»; поиск по этой фразе найдет тонны литературы. См., Например, Введение контекстно-свободной грамматики , https://en.wikipedia.org/wiki/Grammar_induction , https://cstheory.stackexchange.com/q/27347/5038 .
Для регулярных языков (а не контекстных), см. Также Regex golf NP-Complete? , Наималейший DFA , что принимает данный строки и отвергает другие данные строки , Существует ли улучшения в алгоритме Даны Энглиной для обучения регулярных множеств , и https://cstheory.stackexchange.com/q/1854/5038 .
источник
Если число строк конечно, например, установите вы всегда можете придумать грамматику без контекста, которая генерирует все эти строки, пусть не является терминалом, тогда правило может быть . Для конечного набора строк вы можете даже создать автомат с конечным состоянием, который принимает только эти строки. Таким образом, случай конечного набора строк действительно тривиален.A A → s 1 | с 2 | , , , с нS= { с1, с2, , , , sм} A A → s1| s2| , , , sN
источник
Есть много способов, поэтому вам нужно наложить дополнительные критерии качества результатов.
источник
То, что вы спрашиваете, сродни поисковому индексу. Действительно, Конечные Государственные Преобразователи могут быть созданы и использованы для распознавания переданного им текста. Например, Lucene использует этот алгоритм: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.3698.
Для практического использования, проверьте это сообщение в блоге Эндрю Галлант: Индекс 1 600 000 000 ключей с автоматами и Rust
В этом посте он описывает метод построения FSA с учетом корпуса текста таким образом, чтобы он распознавал все слова. Конечным результатом является построение приблизительно минимального FST из предварительно отсортированных ключей за линейное время и в постоянной памяти.
Реализация доступна в его
fst
библиотеке: https://github.com/BurntSushi/fstисточник
Ответ на вопрос, заданный reinierpost, который также отвечает на оригинальный вопрос:
Мы строим словарный автомат следующим образом:
Максимальный размер автомата - это общая длина входных строк. Предполагая, что вы можете моделировать переходы и создавать новые за постоянное время, также время выполнения - это общая длина входных строк. Нет лучших или худших случаев.
Этот автомат минимален. поскольку в обычном случае автоматы и грамматики соответствуют почти один к одному, то же самое верно и для грамматики. Конечно, невозможно построить что-то размером n менее чем за n раз.
источник