Travail pratique #3
IFT-2030 December 7, 2005
¡¡ Dˆ u le 23 d´ ecembre ` a minuit !!
1 Survol
Ce TP a pour but de vous familiariser avec le langage Prolog.
Comme pour les TP pr´ec´edents, les ´etapes sont les suivantes:
1. Parfaire sa connaissance de Prolog.
2. Lire et comprendre cette donn´ee.
3. Lire, trouver, et comprendre le code fourni.
4. Compl´eter le code fourni.
5. ´Ecrire un rapport. Il doit d´ecrire votre exp´erience pendant les 4 points pr´ec´edents: probl`emes rencontr´es, surprises, choix que vous avez dˆu faire, options que vous avez sciemment rejet´ees, etc... Le rapport ne doit pas exc´eder 5 pages.
Contrairement aux deux premiers TP, l’´ecriture du code occupera probable- ment une plus large fraction du temps.
Ce travail est `a faire en groupes de 2 ´etudiants. Le rapport (au format PDF ou Postscript) et le code sont `a remettre par remise ´electronique avant la date indiqu´ee. Aucun retard ne sera accept´e. Indiquez clairement votre nom au d´ebut de chaque fichier.
Si un ´etudiant pr´ef`ere travailler seul, libre `a lui, mais l’´evaluation de son travail n’en tiendra pas compte. Si un ´etudiant ne trouve pas de partenaire, il doit me contacter au plus tard mardi 13 d´ecembreavantle cours. Des groupes de 3 ou plus sontexclus.
2 Les expressions r´ eguli` eres
Vous allez ´ecrire un programme Prolog qui fait de la recherche d’expressions r´eguli`eres (abbr´eg´eesregexp) dans des chaˆınes de caract`eres (voir
1
http://fr.wikipedia.org/wiki/Expression r´eguli`ere). Les expressions r´eguli`eres que vous allez manipuler ont les formes suivantes:
none la regexp qui n’accepte rien
C la regexp qui n’accepte que le caract`ereC any la regexp qui accepte n’importe quel caract`ere [] la regexp qui accepte la chaˆıne vide
[RE1|RE2] la concat´enation
RE1 \/ RE2 accepte une chaˆıne ssi RE1 ouRE2 l’accepte RE1 /\ RE2 accepte une chaˆıne ssi RE1 etRE2 l’acceptent kleene(RE) Une r´ep´etition arbitraire (possiblement vide) de RE Vous devrez non seulement ´ecrire la relationmatchmais aussi une relationopti- mizequi doit optimiser ces expressions autant que possible pour que la relation matchfonctionne au mieux. Voici quelques exemples d’optimisations simples:
RE \/ RE ⇒ RE [] /\ RE ⇒ []
[none|RE] ⇒ none
[RE] ⇒ RE
kleene(kleene(RE)) ⇒ kleene(RE)
Ajoutez-en. Vous devrez implanter une autre optimisation, moins simple mais tr`es importante pour la performance, qui est d’extraire des pr´efixes communs:
[RE|RE1s] \/ [RE|RE2s] ⇒ [RE | RE1s \/ RE2s]
La raison pour laquelle cette optimisation est moins simple est parce que les deux sous-regexps qui ont un pr´efixe commun peuvent ˆetre ´eloign´ees:
([RE|RE1s] \/ RE2) \/ ([RE|RE3s] \/ RE4)
⇒ [RE | RE1s \/ RE2s] \/ (RE2 \/ RE4) Donc votre optimiseur devrait ˆetre capable de transformer:
"hello" \/ "toto" \/ "help" \/ "titi" \/ "hello"
⇒ ["hel"|"lo" \/ "p"] \/ ["t"|"oto" \/ "iti"]
Vu que les chaˆınes de caract`eres en Prolog sont repr´esent´ees simplement par des listes d’entiers, la r´eponse de GNU Prolog ne ressemblera probablement pas `a ce que vous attendez. Par exemple:
| ?- optimize("hello" \/ "toto" \/ "help" \/ "titi" \/ "hello", RE).
RE = [104,101,108|[108|111]\/112]\/[116|[111,116|111]\/[105,116|105]]
(2 ms) yes
| ?-
La relationoptimizedoit ˆetre une fonction, c’est `a dire, quelle ne doit renvoyer qu’une seule valeur.
2
3 Le code fourni
Le code fourni implante seulement une partie de la relationmatch, et implante une relationsearchqui essaie d’appliquermatch`a chaque sous chaˆıne de la chaˆıne de caract`ere pass´ee en param`etre, apr`es avoir optimis´e la regexp.
4 Ce que vous devez faire
Vous avez deux parties `a coder:
1. d’abord il faut compl´eter la relationmatch.
2. ensuite il faut ´ecrire la relationoptimize.
5 Notes
Vous devez remettre deux fichiers: re.plet rapport.pdf.
Les commandes pour remettre ces fichier sont les suivantes:
% remise ift2030 tp2 rapport.pdf re.pl
• Vous pouvez bien sˆur d´efinir de nouvelles relations, mais vous ne devriez pas modifier de relations autres que celles mentionn´ees. Si toutefois il vous paraˆıt n´ecessaire de les modifier, d´ecrivez et justifiez la modification dans le rapport.
• La deuxi`eme partie n´ecessitera probablement l’usage de l’op´erateur de coupure.
• Tout usage de mat´eriel (code ou texte) emprunt´e `a quelqu’un d’autre (ou trouv´e sur le web) doit ˆetre dˆument mentionn´e, sans quoi cela sera consid´er´e comme du plagiat.
• Chaque ligne de code doit faire moins de 80 caract`eres. Tout d´epassement sera consid´er´e comme une erreur.
• V´erifiez la page web du cours, pour d’´eventuels errata, et d’autres indica- tions suppl´ementaires.
3