Existe um método conhecido para construir uma gramática, dado um conjunto finito de seqüências finitas?

10

Pela minha leitura, parece que a maioria das gramáticas está preocupada em gerar um número infinito de strings. E se você trabalhasse o contrário?

Se forem dadas n strings de m length, deve ser possível fazer uma gramática que gere essas strings, e apenas essas strings.

Existe um método conhecido para fazer isso? Idealmente, um nome de técnica que eu possa pesquisar. Como alternativa, como eu faria uma pesquisa na literatura para encontrar esse método?

Gustav Bertram
fonte
5
Trivial: construa a tabela BNF das strings.
Joshua
Strings são finitas por definição. E você não pode receber um conjunto infinito, a menos que tenha alguma descrição finita dele.
vonbrand

Respostas:

11

Isso se enquadra no tópico geral da "indução gramatical"; pesquisar nessa frase irá gerar toneladas de literatura. Consulte, por exemplo, Induzindo uma gramática livre de contexto , https://en.wikipedia.org/wiki/Grammar_induction , https://cstheory.stackexchange.com/q/27347/5038 .

Para idiomas regulares (em vez de sem contexto), consulte também O regex golf NP-Complete? , Menor DFA que aceita seqüências de caracteres dadas e rejeita outras strings , existem melhorias no algoritmo de Dana Angluin para aprender conjuntos regulares e https://cstheory.stackexchange.com/q/1854/5038 .

DW
fonte
Induzir gramáticas para idiomas regulares possivelmente infinitos é difícil e bem diferente desse problema.
Reinierpost
Estou marcando esta pergunta como correta, porque, embora ela não responda diretamente à pergunta (que, segundo se afirma, é trivialmente solucionável), ela me fornece o tipo de terminologia de que preciso para fazer mais pesquisas.
Gustav Bertram
8

Se o número de strings for finito, diga set você sempre pode criar uma gramática livre de contexto que gere todas essas strings, deixe A ser um terminal e, em seguida, a regra pode ser A s 1 | s 2 | . . . s n . Para um conjunto finito de cadeias, você pode até criar um autômato de estado finito que aceita apenas essas cadeias. Portanto, o caso do conjunto finito de strings é realmente trivial.S={s1 1,s2....sm}UMAUMAs1 1|s2|...sn

sashas
fonte
Acho que preciso revisar meu livro de análise. Em retrospecto, essa resposta parece óbvia. Obrigado!
Gustav Bertram
3

Existem várias maneiras, então você precisa impor critérios adicionais à qualidade dos resultados.

  1. Lista: Para cada sequência no idioma, tenha uma regra S w . Seja S o ponto inicial não-terminal. Feito.WSWS
  2. WXWW1 1xW2xXW1 1xXW2WXWϵXϵ
  3. Árvore de sufixo: a mesma, invertida.
  4. A aplicação de um algoritmo garantido para produzir uma gramática de tamanho mínimo, por exemplo, com o número mínimo de regras. Eu não sei o quão difícil isso é.
reinierpost
fonte
Sim, após a primeira resposta, era óbvio que eu deveria ter imposto critérios adicionais, mas parecia injusto alterar a pergunta após a primeira resposta.
Gustav Bertram
Ainda assim, eu adoraria saber a complexidade do tempo de encontrar uma gramática mínima para um determinado conjunto finito de strings ... digamos, no comprimento total das strings ou no comprimento total do resultado.
Reinierpost
3

O que você está perguntando é semelhante a um índice de pesquisa. Na verdade, os transdutores de estado finito podem ser criados e usados ​​para reconhecer o texto alimentado a eles. Por exemplo, Lucene usa este algoritmo: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.3698

Para um uso prático, confira este post de Andrew Gallant: Índice 1.600.000.000 de chaves com autômatos e ferrugem

No post, ele descreve um método para construir uma FSA, com um corpus de texto que reconhece todas as palavras. O resultado final é construir um FST aproximadamente mínimo a partir de chaves pré-classificadas em tempo linear e em memória constante.

Prefixos e sufixos de compartilhamento da FSA

A implementação está disponível em sua fstbiblioteca: https://github.com/BurntSushi/fst

lkraider
fonte
1

Uma resposta para a pergunta feita pelo reinierpost que também responde à pergunta original:

Construímos o autômato de dicionário da seguinte maneira:

  1. construa um autômato que leia e aceite exatamente a primeira string.
  2. para a próxima sequência, comece a lê-la com o autômato até que, para alguma letra, não haja transição. inicie uma nova ramificação para o restante da string. repita até que todas as strings sejam processadas

O tamanho máximo do autômato é o comprimento total das cadeias de entrada. Supondo que você possa simular transições e criar novas em tempo constante, também o tempo de execução é o comprimento total das seqüências de entrada. Não há casos melhores ou piores.

Esse autômato é mínimo. Como no caso normal, autômatos e gramáticas correspondem quase um a um, o mesmo se aplica à gramática. É claro que é impossível construir algo de tamanho n em menos de n tempo.

Peter Leupold
fonte
Obrigado. Quanto a responder a essa pergunta: não vejo o que isso contribui sobre o reinierpost. Além disso, não queremos respostas que respondam ou comentem sobre outra resposta: este não é um fórum de discussão. A maneira de fazer isso seria postar uma nova pergunta e respondê-la. Sei que isso pode não ser óbvio. [Dito isto, não vejo como sua resposta responde ao problema que o reinierpost estava curioso. O problema no final da resposta do reinierpost era encontrar uma gramática com o número mínimo de regras. Sua resposta mostra como criar um DFA com número mínimo de estados. (continuação)
DW
11
É claro que podemos converter esse DFA em uma gramática comum, mas o que faz você pensar que será mínimo em termos de número de regras na gramática? Parece que isso precisa de provas.]
DW
O que minha resposta contribui é o tempo de execução, eu acho. Você está certo, várias coisas que eu digo precisariam de alguma prova. Mas a correspondência entre transições de autômatos finitos e regras gramaticais regulares é muito clara para mim (se o último puder gerar apenas um terminal por regra, como na maioria das definições); qualquer gramática menor que a minha daria um autômato menor que o mínimo. Então, acho que a gramática do autômato mínimo (não provo que a minha é mínima) também será mínima. - Vou manter o seu conselho quanto às respostas em mente, graças
Peter Leupold
A noção de minimalidade para os DFAs diz respeito ao número de estados . Isso implica em minimalidade em relação ao número de transições no DFA ou em quantidade mínima de regras na gramática resultante? Acho que precisamos acompanhar qual é a sua métrica, caso contrário, estou preocupada em comparar maçãs com laranjas.
DW
Correto, a gramática será mínima em termos não terminais. Para regras, isso não está claro.
quer