Existe-t-il une méthode connue pour construire une grammaire étant donné un ensemble fini de chaînes finies?

10

D'après ma lecture, il semble que la plupart des grammaires se préoccupent de générer un nombre infini de chaînes. Et si vous travailliez dans l'autre sens?

Si on donne n chaînes de m longueur, il devrait être possible de faire une grammaire qui générera ces chaînes, et juste ces chaînes.

Existe-t-il une méthode connue pour ce faire? Idéalement, un nom de technique que je peux rechercher. Sinon, comment pourrais-je faire une recherche documentaire pour trouver une telle méthode?

Gustav Bertram
la source
5
Trivial: Construire la table BNF des chaînes.
Joshua
Les chaînes sont finies par définition. Et vous ne pouvez pas "donner" un ensemble infini à moins d'en avoir une description finie.
vonbrand

Réponses:

11

Cela relève du thème général de «l'induction grammaticale»; la recherche sur cette phrase fera apparaître des tonnes de littérature. Voir, par exemple, Inducing a context free grammar , https://en.wikipedia.org/wiki/Grammar_induction , https://cstheory.stackexchange.com/q/27347/5038 .

Pour les langues régulières (plutôt que sans contexte), voir aussi regex golf NP-Complete? , DFA le plus petit qui accepte des chaînes données et rejette d'autres chaînes données , Y a-t-il des améliorations sur l'algorithme de Dana Angluin pour l'apprentissage des ensembles réguliers , et https://cstheory.stackexchange.com/q/1854/5038 .

DW
la source
L'induction de grammaires pour des langues régulières éventuellement infinies est difficile et très différente de ce problème.
reinierpost
Je marque cette question comme correcte, car même si elle ne répond pas directement à la question (ce qui s'avère trivialement résoluble comme indiqué), elle me fournit le type de terminologie dont j'ai besoin pour poursuivre mes recherches.
Gustav Bertram
8

Si le nombre de chaînes est fini, disons set vous pouvez toujours trouver une grammaire sans contexte qui génère toutes ces chaînes, soit A un non terminal, alors la règle peut être A s 1 | s 2 | . . . s n . Pour un ensemble fini de chaînes, vous pouvez même proposer des automates à états finis qui n'acceptent que ces chaînes. Ainsi, le cas d'un ensemble fini de chaînes est vraiment trivial.S={s1,s2....sm}UNEUNEs1|s2|...sn

sashas
la source
Je pense que je dois revoir mon manuel d'analyse. Rétrospectivement, cette réponse semble évidente. Je vous remercie!
Gustav Bertram
3

Il existe de nombreuses façons, vous devez donc imposer des critères supplémentaires sur la qualité des résultats.

  1. Liste: Pour chaque chaîne de la langue, ayez une règle S w . Soit S le terminal non terminal. Terminé.wSwS
  2. wXww1Xw2XXw1XXw2wXwϵXϵ
  3. Arbre de suffixe: le même, inversé.
  4. Appliquer un algorithme garanti pour produire une grammaire de taille minimale, par exemple avec le nombre minimal de règles. Je ne sais pas à quel point c'est difficile.
reinierpost
la source
Oui, après la première réponse, il était évident que j'aurais dû imposer des critères supplémentaires, mais il était injuste de changer la question après la première réponse.
Gustav Bertram
Pourtant, j'aimerais connaître la complexité temporelle de la recherche d'une grammaire minimale pour un ensemble fini de chaînes ... disons, dans la longueur totale des chaînes, ou dans la longueur totale du résultat.
reinierpost
3

Ce que vous demandez s'apparente à un index de recherche. En effet, les transducteurs à états finis peuvent être créés et utilisés pour reconnaître le texte qui leur est envoyé. Par exemple, Lucene utilise cet algorithme: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.3698

Pour une utilisation pratique, consultez cet article de blog d'Andrew Gallant: Index 1 600 000 000 de clés avec automates et rouille

Dans le post, il décrit une méthode pour construire un FSA à partir d'un corpus de texte tel qu'il reconnaît tous les mots. Le résultat final est de construire un FST approximativement minimal à partir de clés pré-triées en temps linéaire et en mémoire constante.

FSA partageant des préfixes et suffixes

L'implémentation est disponible dans sa fstbibliothèque: https://github.com/BurntSushi/fst

lkraider
la source
1

Une réponse à la question posée par reinierpost qui répond également à la question d'origine:

Nous construisons l'automate du dictionnaire comme suit:

  1. construire un automate qui lit et accepte exactement la première chaîne.
  2. pour la chaîne suivante, commencez à la lire avec l'automate jusqu'à ce que pour une lettre il n'y ait pas de transition. démarrer une nouvelle branche pour le reste de la chaîne. répéter jusqu'à ce que toutes les chaînes soient traitées

La taille maximale de l'automate est la longueur totale des chaînes d'entrée. En supposant que vous pouvez simuler des transitions et en créer de nouvelles en temps constant, le temps d'exécution est également la longueur totale des chaînes d'entrée. Aucun meilleur ou pire cas.

Cet automate est minimal. comme dans le cas normal, les automates et les grammaires correspondent presque un à un, il en va de même pour la grammaire. Bien sûr, il est impossible de construire quelque chose de taille n en moins de n temps.

Peter Leupold
la source
Merci. En ce qui concerne la réponse à cette question: je ne vois pas ce que cela apporte sur reinierpost. De plus, nous ne voulons pas de réponses qui répondent ou commentent une autre réponse: ce n'est pas un forum de discussion. La façon de procéder serait de publier une nouvelle question et d'y répondre vous-même. Je me rends compte que cela pourrait ne pas être évident. [Cela dit, je ne vois pas comment votre réponse répond au problème de reinierpost. Le problème à la fin de la réponse de reinierpost était de trouver une grammaire avec le nombre minimum de règles. Votre réponse montre comment créer un DFA avec un nombre minimal d'états. (suite)
DW
1
Bien sûr, nous pouvons convertir ce DFA en une grammaire régulière, mais qu'est-ce qui vous fait penser qu'il sera minimal en termes de nombre de règles dans la grammaire? Il semble que cela ait besoin de preuves.]
DW
Ce que ma réponse apporte, c'est le temps d'exécution, je pense. Vous avez raison, plusieurs choses dont je dis auraient besoin d'une preuve. Mais la correspondance entre les transitions des automates finis et les règles de grammaire régulière est très claire pour moi (si ces dernières ne peuvent générer qu'un seul terminal par règle comme dans la plupart des définitions); alors toute grammaire plus petite que la mienne donnerait un automate plus petit que le minimum. Je pense donc que la grammaire de l'automate minimal (je ne prouve pas que la mienne est minimale) sera également minime. - Je garderai à l'esprit vos conseils concernant les réponses, merci
Peter Leupold
La notion de minimalité pour les DFA concerne le nombre d' États . Cela implique-t-il une minimalité en ce qui concerne le nombre de transitions dans le DFA, ou une minimité du nombre de règles dans la grammaire résultante? Je pense que nous devons garder une trace de votre métrique, sinon je crains que nous comparions les pommes aux oranges.
DW
Correct, la grammaire sera minimale dans les non-terminaux termson. Pour les règles, ce n'est pas clair.
Peter Leupold