2010-01-26 6 views
13

Le pumping lemma est une propriété de regular languages et de context-free languages. Mais tous les exemples que j'ai vu des choses comme:Existe-t-il des exemples de lemmes de pompage avec des langues «réelles»?

L = {0 n n n: n ≥ 0}

(qui, soit dit en passant, est pas une langage sans contexte).

Mais ce qui m'intéresse est la suivante: y a-t-il des exemples de son utilisation avec des langages réels ou utiles? Je n'ai pas réussi à en trouver. Est-ce une de ces choses ou une valeur purement théorique sans aucune application pratique?

+1

Est-il possible de prouver si une langue est ou non d'usage courant? –

+1

@Anon: oui parce que la question de savoir si une langue peut être décrite par une grammaire sans contexte est utile pour les générateurs d'analyseurs. – cletus

+0

Il m'a fallu du temps pour comprendre pourquoi L n'est pas une langue sans contexte. Je pense qu'une bonne façon de penser à la réponse est: si vous voulez écrire n 0, gardez la trace en ajoutant quelque chose à la pile n fois. Ensuite, pour imprimer n 1, gardez la trace en supprimant tous les éléments de la pile. Cependant, il n'y a plus aucun moyen de se souvenir de ce que n devait imprimer n 2. –

Répondre

7

L = {0 n n: n ≥ 0} étant une langue sans contexte.

correspondant parenthesis dans une expression peut être considérée comme une forme similaire à savoir

L = {(n) n: n ≥ 0}

+0

Euh ... ni l'un ni l'autre ne sont ce que j'appelle des "vrais" langages. Je sais comment cela s'applique à ces exemples artificiels. Ce que je veux, c'est au moins un exemple d'application à un langage de programmation ou à quelque chose de "monde réel". – cletus

+3

comment les parenthèses correspondantes (ou accolades, guillemets) ne sont pas du monde réel? –

2

Une utilisation pratique est le fait que tout le monde peut cesser d'essayer de construire un automate fini pour reconnaître la syntaxe de C# ou de Fortran.

Une autre utilisation pratique est le fait que tout le monde peut arrêter d'essayer de construire un automate à pile pour reconnaître la sémantique de C# ou de Fortran. (Même si dans Fortran si vous mal orthographiez un nom de variable, vous obtenez une nouvelle variable gratuitement, la nouvelle variable ne fonctionnera probablement pas avec les opérateurs que vous avez codés lorsque vous vouliez nommer l'une de vos variables déclarées.)

+0

Je ne suis pas après une description de pourquoi c'est utile, mais comment il a été appliqué à un langage réel plutôt que des séquences de abc ou 012. – cletus

+3

@cletus Concevoir un compilateur se passe en dehors du monde réel, dans des langages non réels? –

1

ceci de ces choses ou valeur purement théorique avec absolument aucune application pratique? "

Hrm. Qu'est-ce qu'une application pratique? Vous avez judicieusement étiqueté votre question "informatique-science". Donc, je suppose que votre question vise à demander: « est-il pratique la science à l'ordinateur?

Dans ce cas, la réponse est ...

Bien sûr, il est! Il est enseigné comme une des premières façons de classer différentes classes de complexité de langage, au-delà de simplement "big-O (whateverthehell)" Il montre qu'il y a des problèmes concernant le calcul au-delà du runtime, dans ce cas certains modèles ne peuvent simplement pas calculer certaines fonctions. * -ball introduction aux preuves formelles concernant la théorie des automates

Une énorme partie de l'informatique que la plupart des étudiants en informatique (mes pairs) semblent Vouloir éviter est la Théorie du Calcul, une classification que les lemmes de pompage relèvent évidemment.

Le fait, on l'espère, est que la théorie du calcul, qu'elle soit ou non, est fondamentale pour l'informatique. Ne pas comprendre l'idée de classes de complexité différentes (le big-O ne le coupe pas vraiment) ne sera pas la mort de l'informaticien, mais il cachera une partie considérable du champ de sa vue.

* Oui, le problème d'arrêt est généralement affiché en premier, mais il ne l'est jamais la première fois. En ce qui concerne peut-être l'interprétation plus cynique de votre question, dans laquelle vous voulez dire "est-ce que n'importe quel logiciel utilise vraiment ceci?", Ma réponse est bien sûr que non. Cela fait partie du fondement du calcul, pas de ses applications. Cela ne veut pas paraître dédaigneux de ses applications, pas du tout. Les deux sont d'égale valeur noble.

+1

C'est un beau discours et tout mais il ne répond pas à la question: je suis après des exemples du monde réel de son utilisation – cletus

+1

Peut-être que vous avez manqué la forêt pour les arbres. ** Education **. par ce que vous entendez par "monde réel"?: P – agorenst

4

ce programme python est valide:

print ((((((((((((((((((((((((1)))))))))))))))))))))))) 

ainsi que toutes les autres déclarations équivalentes avec une quantité égale de ( à gauche et ) sur le côté droit.

Vous ne pouvez pas générer une expression régulière pour vérifier cela, vous devez donc utiliser un analyseur.

Ce n'est pas du tout théorique. C'est la raison pour laquelle vous ne pouvez pas utiliser regex pour analyser HTML.