Существует ли известный метод построения грамматики по конечному набору конечных строк?

10

Из моего чтения кажется, что большинство грамматик занимается созданием бесконечного числа строк. Что делать, если вы работали наоборот?

Если задано n строк длиной m, должна быть возможность создать грамматику, которая будет генерировать эти строки и только эти строки.

Есть ли известный способ сделать это? В идеале название техники я могу исследовать. В качестве альтернативы, как бы я занялся поиском литературы, чтобы найти такой метод?

Густав Бертрам
источник
5
Тривиально: Построить БНФ из таблицы строк.
Джошуа
Строки конечны по определению. И вы не можете получить «данное» бесконечное множество, если у вас нет определенного описания этого.
vonbrand

Ответы:

11

Это относится к общей теме «индукции грамматики»; поиск по этой фразе найдет тонны литературы. См., Например, Введение контекстно-свободной грамматики , 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 .

DW
источник
Внедрение грамматик для, возможно, бесконечных регулярных языков является сложным и весьма отличным от этой проблемы.
reinierpost
Я отмечаю этот вопрос правильно, потому что, хотя он и не дает прямого ответа на вопрос (который, как оказывается, тривиально разрешим, как указано), он дает мне ту терминологию, которая мне необходима для дальнейших исследований.
Густав Бертрам
8

Если число строк конечно, например, установите вы всегда можете придумать грамматику без контекста, которая генерирует все эти строки, пусть не является терминалом, тогда правило может быть . Для конечного набора строк вы можете даже создать автомат с конечным состоянием, который принимает только эти строки. Таким образом, случай конечного набора строк действительно тривиален.A A s 1 | с 2 | , , , с нS={s1,s2....sm}AAs1|s2|...sn

SashaS
источник
Я думаю, что мне нужно пересмотреть мой учебник по синтаксическому анализу. Оглядываясь назад, этот ответ кажется очевидным. Спасибо!
Густав Бертрам
3

Есть много способов, поэтому вам нужно наложить дополнительные критерии качества результатов.

  1. Список: для каждой строки в языке есть правило . Пусть будет исходным нетерминалом. Выполнено.S w SwSwS
  2. Дерево префиксов: для каждого префикса строки в языке есть нетерминал . Для каждой строки в языке, где является символом, есть правило . Для каждой строки в языке есть правило . Пусть будет исходным нетерминалом. Выполнено.X w w 1 x w 2 x X w 1x X w 2 w X wϵ X ϵwXww1xw2xXw1xXw2wXwϵXϵ
  3. Суффикс дерево: то же самое, обратное.
  4. Применение алгоритма гарантирует получение грамматики минимального размера, например, с минимальным количеством правил. Я не знаю, как это тяжело.
reinierpost
источник
Да, после первого ответа было очевидно, что я должен был установить дополнительные критерии, но было несправедливо менять вопрос после первого ответа.
Густав Бертрам
Тем не менее, я хотел бы знать сложность времени нахождения минимальной грамматики для данного конечного набора строк ... скажем, по общей длине строк или по общей длине результата.
reinierpost
3

То, что вы спрашиваете, сродни поисковому индексу. Действительно, Конечные Государственные Преобразователи могут быть созданы и использованы для распознавания переданного им текста. Например, Lucene использует этот алгоритм: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.3698.

Для практического использования, проверьте это сообщение в блоге Эндрю Галлант: Индекс 1 600 000 000 ключей с автоматами и Rust

В этом посте он описывает метод построения FSA с учетом корпуса текста таким образом, чтобы он распознавал все слова. Конечным результатом является построение приблизительно минимального FST из предварительно отсортированных ключей за линейное время и в постоянной памяти.

FSA разделяет префиксы и суффиксы

Реализация доступна в его fstбиблиотеке: https://github.com/BurntSushi/fst

lkraider
источник
1

Ответ на вопрос, заданный reinierpost, который также отвечает на оригинальный вопрос:

Мы строим словарный автомат следующим образом:

  1. построить автомат, который читает и принимает именно первую строку.
  2. для следующей строки начните читать ее с помощью автомата, пока для некоторой буквы не произойдет переход. начать новую ветку для остальной части строки. повторять, пока все строки не обработаны

Максимальный размер автомата - это общая длина входных строк. Предполагая, что вы можете моделировать переходы и создавать новые за постоянное время, также время выполнения - это общая длина входных строк. Нет лучших или худших случаев.

Этот автомат минимален. поскольку в обычном случае автоматы и грамматики соответствуют почти один к одному, то же самое верно и для грамматики. Конечно, невозможно построить что-то размером n менее чем за n раз.

Питер Лейпольд
источник
Спасибо. Что касается ответа на этот вопрос: я не вижу, как это влияет на reinierpost. Кроме того, нам не нужны ответы, которые отвечают или комментируют другой ответ: это не дискуссионный форум. Способ сделать это - опубликовать новый вопрос, а затем ответить на него самостоятельно. Я понимаю, что это может быть не очевидно. [Тем не менее, я не понимаю, как ваш ответ отвечает на проблему, которую любопытно задал вопрос. Проблема в конце ответа reinierpost состояла в том, чтобы найти грамматику с минимальным количеством правил. Ваш ответ показывает, как создать DFA с минимальным количеством состояний. (продолжение)
DW
1
Конечно, мы можем преобразовать этот DFA в обычную грамматику, но что заставляет вас думать, что оно будет минимальным с точки зрения количества правил в грамматике? Похоже, что это требует доказательств.]
DW
Мне кажется, что мой ответ дает время выполнения. Вы правы, несколько вещей, которые я говорю, потребуют некоторых доказательств. Но соответствие между переходами конечных автоматов и правилами регулярной грамматики для меня очень ясно (если последний может генерировать только один терминал на правило, как в большинстве определений); тогда любая грамматика, меньшая моей, даст автомат, меньший минимальной. Поэтому я думаю, что грамматика от минимального автомата (я не доказываю, что мой минимален) тоже будет минимальной. - Я буду помнить ваш совет относительно ответов, спасибо
Питер Лейпольд
Понятие минимальности для DFA относится к числу штатов . Означает ли это минимальность количества переходов в DFA или минимальность числа правил в полученной грамматике? Я думаю, что мы должны отслеживать, какой у вас показатель, так как в противном случае я боюсь, что мы будем сравнивать яблоки с апельсинами.
DW
Правильно, грамматика будет минимальной в терминах нетерминалов. Для правил это не ясно.
Питер Лейпольд