web-dev-qa-db-fra.com

Qu'est-ce qu'une langue régulière?

J'essaie de comprendre le concept des niveaux de langues (régulier, sans contexte, sensible au contexte, etc.).

Je peux le rechercher facilement, mais toutes les explications que je trouve sont une charge de symboles et parlent d'ensembles . J'ai deux questions:

  1. Pouvez-vous décrire en mots ce qu'est une langue ordinaire et en quoi les langues diffèrent?

  2. Où les gens apprennent-ils à comprendre ce genre de choses? Si je comprends bien, ce sont des mathématiques formelles? J'ai eu quelques cours à l'université qui l'ont utilisé et presque personne ne l'a compris car les tuteurs supposaient que nous le savions. Où puis-je l'apprendre et pourquoi les gens sont-ils "censés" le connaître dans tant de sources? C'est comme s'il y avait un écart dans l'éducation.

Voici un exemple :

Toute langue appartenant à cet ensemble est une langue régulière sur l'alphabet.

Comment une langue peut-elle "dépasser" quoi que ce soit?

74
FBryant87

Dans le contexte de l'informatique, un mot est la concaténation de symboles . Les symboles utilisés sont appelés l'alphabet . Par exemple, certains mots issus de l'alphabet {0,1,2,3,4,5,6,7,8,9} serait 1, 2, 12, 543, 1000, et 002.

Une langue est alors un sous-ensemble de tous les mots possibles. Par exemple, nous pourrions vouloir définir un langage qui capture tous les agents Elite MI6. Ceux-ci commencent tous par un double 0, donc les mots dans la langue seraient 007, 001, 005, et 0012, mais non 07 ou 15. Par souci de simplicité, nous disons qu'une langue est " sur un alphabet" au lieu de "un sous-ensemble de mots formé par concaténation de symboles dans un alphabet ".

En informatique, nous voulons maintenant classer les langages. Nous appelons une langue régulière s'il peut être décidé si un mot est dans la langue avec un algorithme/une machine à mémoire constante (finie) en examinant tous symboles dans la Parole les uns après les autres. La langue composée uniquement du mot 42 est régulier, car vous pouvez décider si un mot s'y trouve sans nécessiter des quantités de mémoire arbitraires; il vous suffit de vérifier si le premier symbole est 4, si le second est 2 et si d'autres chiffres suivent.

Toutes les langues avec un nombre fini de mots sont régulières, car nous pouvons (en théorie) simplement construire un arbre de flux de contrôle de taille constante (vous pouvez le visualiser comme un groupe d'instructions if- imbriquées qui examinent un chiffre après L'autre). Par exemple, nous pouvons tester si un mot est dans le langage "nombres premiers entre 10 et 99" avec la construction suivante, ne nécessitant aucune mémoire sauf celle pour encoder à quelle ligne de code nous sommes actuellement:

if Word[0] == 1:
  if Word[1] == 1: # 11
      return true # "accept" Word, i.e. it's in the language
  if Word[1] == 3: # 13
      return true
...
return false

Notez que toutes les langues finies sont régulières, mais toutes les langues régulières ne sont pas finies; notre langue double-0 contient un nombre infini de mots (007, 008, mais aussi 004242 et 0012345), mais peut être testé avec une mémoire constante: pour tester si un mot y appartient, vérifiez si le premier symbole est 0, et si le deuxième symbole est 0. Si tel est le cas, acceptez-le. Si le mot est inférieur à trois ou ne commence pas par 00, ce n'est pas un nom de code MI6.

Formellement, la construction d'une machine à états finis ou d'une grammaire régulière est utilisée pour prouver qu'un langage est régulier. Celles-ci sont similaires aux instructions if- ci-dessus, mais permettent des mots arbitrairement longs. S'il y a une machine à états finis, il y a aussi une grammaire régulière, et vice versa, il suffit donc de montrer l'une ou l'autre. Par exemple, la machine à états finis pour notre langage double-0 est:

start state:  if input = 0 then goto state 2
start state:  if input = 1 then fail
start state:  if input = 2 then fail
...
state 2: if input = 0 then accept
state 2: if input != 0 then fail
accept: for any input, accept

La grammaire régulière équivalente est:

start → 0 B
B → 0 accept
accept → 0 accept
accept → 1 accept
...

L'équivalent expression régulière est:

00[0-9]*

Certaines langues ne sont pas régulières. Par exemple, la langue de n'importe quel nombre de 1, suivi du même nombre de 2 (souvent écrit comme 1n2n, pour un arbitraire n ) n'est pas régulier - vous avez besoin de plus qu'une quantité constante de mémoire (= un nombre constant d'états) pour stocker le nombre de 1s pour décider si un mot est ou non dans la langue.

Cela devrait généralement être expliqué dans le cours théorique d'informatique. Heureusement, Wikipedia explique très bien formel et langues régulières .

141
phihag

Voici quelques définitions équivalentes de Wikipedia :

[...] une langue régulière est une langue formelle (c'est-à-dire un ensemble possiblement infini de séquences finies de symboles d'un alphabet fini) qui satisfait les propriétés équivalentes suivantes:

  • il peut être accepté par une machine à états finis déterministe.
  • il peut être accepté par une machine à états finis non déterministe
  • il peut être décrit par une expression régulière formelle.

    Notez que les fonctionnalités "d'expression régulière" fournies avec de nombreux langages de programmation sont complétées par des fonctionnalités qui les rendent capables de reconnaître des langages qui ne sont pas réguliers, et ne sont donc pas strictement équivalents aux expressions régulières formelles.

La première chose à noter est qu'une langue régulière est ne langue formelle , avec quelques restrictions. Un langage formel est essentiellement une collection (peut-être infinie) de chaînes. Par exemple, le langage formel Java est la collection de tous les fichiers Java Java possibles, qui est un sous-ensemble de la collection de tous les fichiers texte possibles).

L'une des caractéristiques les plus importantes est que, contrairement aux langues sans contexte , un langage normal ne prend pas en charge l'imbrication/récursivité arbitraire, mais vous avez une répétition arbitraire.

Une langue a toujours un alphabet sous-jacent qui est l'ensemble des symboles autorisés. Par exemple, l'alphabet d'un langage de programmation serait généralement soit ASCII ou Unicode, mais dans la théorie formelle du langage, il est également bien de parler de langues sur d'autres alphabets, par exemple l'alphabet binaire où le seul les caractères autorisés sont 0 et 1.

Dans mon université, nous avons appris une théorie du langage formelle dans la classe des compilateurs, mais cela est probablement différent entre les différentes écoles.

5
hammar