Prolog – Eiffel
Transcription
Prolog – Eiffel
Prolog – Eiffel Pourquoi pas Prolog? Pourquoi Java? par Jean Ledesma Je vais essayer avec ce petit rapport de vous demontrer la validite de mon choix envers Java plutot que Prolog pour faire la transcription Prolog Eiffel. 1. Les avantages de Prolog: Il est vrai que Prolog nous fournit une possibilite non triviale aux premiers abords en Java qui est la requete sur faits. Je pourrais par exemple faire etant donne deux faits identifier(#id, 'nom') classDecl(#id, #identifier) ecrireClass(X) := classDecl(X,Y), identifier(Y,Z), write(“class ”), write(Z), write(“end”). Ceci etant en cas trivial on pourrait se dire que c'est plutot simple. Jusqu'a ce qu'on voie des faits plus compliqués a traiter du a la syntaxe d'Eiffel , qui contrairement a celle de Java est assez confuse. J'aurais surement choisi d'effectuer le travail avec Prolog sur Java tout comme Gunther mais certainement pas pour Eiffel. Voyons pourquoi dans la section suivante. 2. Les incovenients Prolog: Voyons maintenant le fait inheritance. inheritance(#id,#classDecl,#classDecl). Il faut que je rattache a la classe d'id classDecl l'heritage vers la classe d'id classDecl. Je ferais quelque chose du genre: ecrireInheritance(Z) := inheritance(Z,X,Y), ecrireClass(X), write(Y). Mais alors il faut que je modifie le premier fait ecrire Class et que j'y ajoute l'ecrire inheritance. Jusque la ca va. Maintenant voyons le fait rename. Rename appartient a un fait d'inheritance tel que: rename(#id,#inheritance or #exheritance,#featureDecl,#identifier) j'ecrirais rename tel que: ecrireRename(R) := rename(R,P,Y,I), write(“inherit”), ecrireInheritance(P), write(“feature”), ecrireFeatureDecl(Y), ecrireIdentifier(I). Mais si je veux faire attention a l'ordre il faut je modifie aussi le fait ecrireInheritance..... Il faut savoir aussi que le dernier rename de la liste des rename s'il est suvi d'un redefine par exemple ou d'un export , en soit pas suivi d'un “;”. Etc, etc... Si vous tenez compte du fait qu'il ya 90 faits. Je trouve ca peut etre trop compliqué et ca empeche de travailler proprement. Pourquoi java alors? Nous allons voir ca dans la section suivante. 3. Les avantages de Java: En Java, il y a plusieurs possibilites offerte pour faciliter le traitement de ces faits. 1. 2. 3. 4. Langage objet Traitement des strings Classes abstraites Possibilites d'ecrire sur des fichiers facile J'ai parle dans la section inconvenients Prolog de rattacher des faits a d'autres. Quoi de mieux pour le faire que les objets? Pour cela je sais deja que je vais devoir implementer les differents faits en classe. Oui, ca sera plus long a ecrire mais beaucoup plus propre et je garantis que les classes seront ecrites dans l'ordre attendu. Je cree une class Fact abstraite, contenant un id et une fonction write() qui renvoie la representation de ce fait. Je tombe alors sur le fait classDecl identifier(#id, 'nom') classDecl(#id, #identifier) Je me dis, il faut que j'ai une table des faits , avec chaque fait a sa place dans la table, sa place etant l'id. Qu'a cela en tienne je cree une table Fact[]. Puis je commence: identifier (#id, 'nom') --> IdentifierFact.java --> j'ajoute le fait a la place id dans la table. --> j'implemente la fonction write() avec return 'nom'; classDecl(#id, #identifier) -->ClassDeclFact.java --> j'ajoute le fait a la place id dans la table --> j'implemente la fonction write() qui return 'class 'nom' end; pour l'instant. inheritance(#id, #classDecl, #classDecl) -->InheritanceFact.java --> j'ajoute le fait a la place id dans la table --> j'implemente la fonction write() qui return pour l'instant getFactById(#classDecl).write(), le nom de classe heritee. Puis je vois que inheritance se referre a une classDecl, qua cela en tienne, je modifie legerement classDecl pour lui rajouter une listed' inheritance. ArrayList<InheritanceFact> inheritanceFacts = new ArrayList<InheritanceFact>(); Dont j'integrel'affichage dans la fonction write() de classDecl qui devient: String buffer=””; buffer+= 'class 'nom' ; if (inheritanceFacts.size()!=0){ buffer+= “inherit “; for (int i=0; i< inheritanceFacts.size(); i++){ buffer+= inheritanceFacts.get(i).write(); } buffer+=”end\n” } buffer+”end”; Puis maintenant j'ai un rename. Ce rename fait reference a une inheritance. Je modifie un peu inheritance... je lui rajoute une liste de rename.... Je modifie sa fonction write(). Pour tous les objets crees, pour tous les faits, ce systeme est automatique et c'est fait de maniere incrementale et toujours respectant un ordre. L'avantage? Je cree une classe et je la remplis petit a petit selon que les faits fassent reference a lui ou pas. Donc on a une hierarchie comme ci dessous ClassDecl -> Indexing ... -> Genericite.... -> Inheritance -> rename ->export ->redefine -> undefine -> select ->CreatorsFeatures -->... -->... --> Features --> local, routine etc --> Invariant... ..... Je n'ai pas tout mis bien sur mais c'est pour vous donner une idee Et de cette maniere, premierement, j'automatise toutes mes ecritures de code Je passe par une factory qui gere chaque fait different et cree l'objet oportun selon le nom du fait. J'ai une base de faits a laquelle je peux acceder facilement par getFactById(..), je simule donc tres facilement le seul avantage que nous ayons pour cela en Prolog. Et pour ajouter un fait, comme dans la classe abstraite Fact j'ai l'id du fait, je lui ai ajoute une procedure addFact(); qui ajoute directement le fait dans la table. Un exemple de fait: type(#id, #classType) public class TypeFact extends Fact{ int idClassType; public TypeFact(String[]f){ id=Integer.parseInt(f[0]); idClassType= Integer.parseInt(f[1]); addFact(); } public String write() { return getFactById(idClassType).write(); } } Avec id , addFact venant de la super classe Fact. Tous les faits suivent ce type de demarche. A la fin? String buffer =ClassDecl.write(); WriteToAFile(buffer); ceci pour chaque classDecl diferent et le tour et joue. Et le tour est joué. On en peut plus clair. Quand je programme en Prolog j'ai l'impression de faire de l'Extreme Programming la c'est clair, net, precis. Je en vois pas de vrai inconvenient mais plutot une securite au niveau du code genere que je n'ai pas la sensation d'avoir en Prolog tant les modifications apportes a chaque nouveau fait implante seraient nombreuses. En Java je peux rajouter un fait, puis un autre, puis un autre... ce qui marchait avant marche encore apres. 4. Les inconvenients java: C'est un peu fastidieux d'ecrire toujours la meme chose. Mais c'est quand meme beaucoup plus propre que sur Prolog.