#include "algo.h" #include #include void algo::lecture(string nom_fic) { int nb_objets,nb_proprietes; fstream fic; int val; fic.open(nom_fic.c_str(),ios::in); if (fic.fail()) cout<<"fichier d'entree inexistant. "; else { fic>>nb_objets; fic>>nb_proprietes; for(int k=0;k objet; for(int j=0;j>val; objet.push_back(val); } relation_a_examiner.tableau.push_back(objet); } } // Affichage de la relation char rep; do{ cout<<"Voulez-vous afficher la relation ? (o/n) : "; cin>>rep; cout<0) { switch(num%26) { case 0: { res=res+'z'; num=num-26; break; } case 1: { res=res+'a'; num=num-26; break; } case 2: { res=res+'b'; num=num-26; break; } case 3: { res=res+'c'; num=num-26; break; } case 4: { res=res+'d'; num=num-26; break; } case 5: { res=res+'e'; num=num-26; break; } case 6: { res=res+'f'; num=num-26; break; } case 7: { res=res+'g'; num=num-26; break; } case 8: { res=res+'h'; num=num-26; break; } case 9: { res=res+'i'; num=num-26; break; } case 10: { res=res+'j'; num=num-26; break; } case 11: { res=res+'k'; num=num-26; break; } case 12: { res=res+'l'; num=num-26; break; } case 13: { res=res+'m'; num=num-26; break; } case 14: { res=res+'n'; num=num-26; break; } case 15: { res=res+'o'; num=num-26; break; } case 16: { res=res+'p'; num=num-26; break; } case 17: { res=res+'q'; num=num-26; break; } case 18: { res=res+'r'; num=num-26; break; } case 19: { res=res+'s'; num=num-26; break; } case 20: { res=res+'t'; num=num-26; break; } case 21: { res=res+'u'; num=num-26; break; } case 22: { res=res+'v'; num=num-26; break; } case 23: { res=res+'w'; num=num-26; break; } case 24: { res=res+'x'; num=num-26; break; } case 25: { res=res+'y'; num=num-26; break; } } } return res; } // Algorithme de Ganter //Procédure permettant d'initialiser le vecteur A caractérisant les parties //des intensions calculées par l'algorithme de Ganter void algo::init(vector&A,const int & nbpropriete, const int & valeur) { int i; A.resize(nbpropriete); for(i=0;i & A,const int & k,const int & nbpropriete) { int i=-1; int j=k; while (j & A, const vector & Aprim, const int & nbpropriete, const int & i) { int j=nbpropriete; //initialiser à cette valeur pour le cas d'un fermé ( on doit avoir false) int k=0; int vide=1; //on teste si Aprim est composé uniquement de 0, donc si il est égale au vide while((kj (on peut concidérer que j=0) if (vide==1) { return true; } else { k=0; while((k A[k]) j=k; k=k+1; } if (i & A, vector &Aprim, vector &ext, const int & nbpropriete, const int & nbobjet,const vector > & rel) { int i,j,rep; int prem=1; int ferm=1; int testA=1; int testext=1; //on réinitialise Aprim for(i=0;i & A,const int & nbpropriete) { int i; for(i=0;i > Lferme, list > Lext, const int & nbpropriete, const int & nbobjet) { list > ::iterator itf,ite; int i,j; int test;//permet de tester le cas vide * 1..nbpropriete itf=Lferme.begin(); ite=Lext.begin(); //affiche le concept vide * 1..nbpropriete qui est toujours le premier de la //liste car c'est c'est le vecteur initiale de l'algorithme de Ganter cout<<"vide * "; for(j=0;j > Lferme, list > Lext, const int & nbpropriete, const int & nbobjet, string text) { list > ::iterator itf,ite; int i,j; int test;//permet de test le cas vide * 1..nbpropriete //ouverture du fichier ofstream fic(text.c_str()); if (!fic) { cout<<"Impossible de créer le fichier !"< > &Lferme, list > &Lext, int &nbpropriete, int &nbobjet) { int i,j,k,l,k_temp,arret; bool isupj; vector A; vector Aprim; vector ext; int test1=1; nbpropriete = relation_a_examiner.proprietes.size(); nbobjet = relation_a_examiner.objets.size(); init(A,nbpropriete,0);//car A est un fermé init(ext,nbobjet,1); Lferme.push_back(A); Lext.push_back(ext); init(Aprim,nbpropriete,0); //permet d'obtenir le premier vecteur A pour l'indice k étudié par l'algorithme //pour cela on A[k] qui vaut 1 et tout le rest qui vaut 0 for(k=nbpropriete-1; k >= 0; k--) { A[k]=1; for(l=k+1;l>arret; //} //pas besion de calculer si i>j, car dans les deux cas on passe au suivant //c'est-à-dire si ij, donc on ne teste pas si ik) // *1 { //cherche le plus indice de A dont la valeur est 0 après l'indice k i = test(A,k_temp,nbpropriete); //si il n'y en a pas on passe à k suivant if (i==-1) i=k; else { //si il existe, A[i] prend la valeur 1 et pour tout l>i A[l]=0 A[i]=1; for(l=i+1;lj //car c'est obligatoirement faut (A[i]=Aprim[i] pour tout i) Lferme.push_back(Aprim); Lext.push_back(ext); A=Aprim; //affiche_a(A,nbpropriete); //cin>>arret; } else { //si il n'est pas fermé //isupj=test_isupj(A,Aprim,nbpropriete,i); while( isupj == true) // *2 { //si c'est le cas, on passe à l'indice i suivant, c'est-à-dire, //le plus grand indice j tel que j-1 i=i-1; while((A[i]==1) && (i>-1)) i=i-1; //on teste si le nouvel indice est supérieur à k if (i>k_temp) { //si c'est le cas on calcule le nouveau vecteur A (comme //précédemment) A[i]=1; for(l=i+1;l>arret; } //Puis on test si i>j //isupj=test_isupj(A,Aprim,nbpropriete,i); } else { //si ce n'est pas le cas on initialise isupj à false pour sortir //de la boucle while 2. puis on sort de la boucle while 1 car i