3_regular.cpp

Go to the documentation of this file.
00001 
00016 #include "libfaudes.h"
00017 
00018 
00019 // make the faudes namespace available to our program
00020 
00021 using namespace faudes;
00022 
00023 
00024 
00026 // main program
00028 
00029 int main() {
00030 
00031 
00033   // make deterministic
00035 
00036 
00037   // read nondeterministic generator and  perform operation 
00038 
00039   Generator deter_nondet("data/deterministic_nondet.gen");
00040   Generator deter_det;
00041   Deterministic(deter_nondet, deter_det);
00042   deter_det.Write("tmp_deterministic_det.gen");
00043   deter_nondet.Write("tmp_deterministic_nondet.gen");
00044 
00045   // report result to console
00046  
00047   std::cout << "################################\n";
00048   std::cout << "# deterministic generator \n";
00049   deter_det.DWrite();
00050   std::cout << "################################\n";
00051 
00052 
00054   // make minimal
00056 
00057 
00058   // read nonminimal generator and  perform operation 
00059 
00060   Generator minimal_nonmin("data/minimal_nonmin.gen");
00061   Generator minimal_min;
00062   StateMin(minimal_nonmin, minimal_min);
00063   minimal_nonmin.Write("tmp_minimal_nonmin.gen");
00064   minimal_min.Write("tmp_minimal_min.gen");
00065 
00066   // report result to console
00067  
00068   std::cout << "################################\n";
00069   std::cout << "# minimal generator \n";
00070   minimal_min.DWrite();
00071   std::cout << "################################\n";
00072 
00073 
00075   // project
00077 
00078 
00079   // read generator to project 
00080 
00081   Generator project_g("data/project_g.gen");
00082   Generator project_prog;
00083   EventSet alph_proj;
00084   alph_proj.Insert("a");
00085   alph_proj.Insert("c");
00086   alph_proj.Insert("e");
00087   alph_proj.Insert("g");
00088   Project(project_g,  alph_proj, project_prog);
00089   project_g.Write("tmp_project_g.gen");
00090   project_prog.Write("tmp_project_prog.gen");
00091 
00092   // report result to console
00093  
00094   std::cout << "################################\n";
00095   std::cout << "# projected generator \n";
00096   project_prog.DWrite();
00097   std::cout << "################################\n";
00098 
00099 
00100 
00102   // boolean language operations
00104 
00105 
00106   // read generators
00107   Generator boolean_g1("data/boolean_g1.gen");
00108   Generator boolean_g2("data/boolean_g2.gen");
00109 
00110   // perform union
00111   Generator boolean_union;
00112   boolean_union.StateNamesEnabled(false);
00113   LanguageUnion(boolean_g1, boolean_g2, boolean_union);
00114   
00115   // perform intersection
00116   Generator boolean_intersection;
00117   boolean_intersection.StateNamesEnabled(false);
00118   LanguageIntersection(boolean_g1, boolean_g2, boolean_intersection);
00119   
00120   // perform complement twice
00121   Generator boolean_complement_g1=boolean_g1; 
00122   boolean_complement_g1.StateNamesEnabled(false);
00123   LanguageComplement(boolean_complement_g1);
00124   Generator boolean_complement2_g1=boolean_complement_g1;
00125   LanguageComplement(boolean_complement2_g1);
00126   
00127   // write results and operands for html docu
00128   boolean_g1.Write("tmp_boolean_g1.gen");
00129   boolean_g2.Write("tmp_boolean_g2.gen");
00130   boolean_union.Write("tmp_union_g1g2.gen");
00131   boolean_intersection.Write("tmp_intersection_g1g2.gen");
00132   boolean_complement_g1.Write("tmp_complement_g1.gen");
00133   boolean_complement2_g1.Write("tmp_complement2_g1.gen");
00134 
00135   // inspect on console
00136   std::cout << "################################\n";
00137   std::cout << "# boolean language operations\n";
00138   boolean_union.DWrite();
00139   boolean_intersection.DWrite();
00140   boolean_complement_g1.DWrite();
00141   std::cout << "################################\n";
00142 
00143   // compare languages
00144   std::cout << "################################\n";
00145   std::cout << "# boolean language operations\n";
00146   if(LanguageInclusion(boolean_g1,boolean_union))  
00147     std::cout << "Lm(g1) <= Lm(g1) v Lm(g2): OK\n";
00148   else
00149     std::cout << "Lm(g1) > Lm(g1) v Lm(g2): ERR\n";
00150   if(LanguageDisjoint(boolean_complement_g1,boolean_g1))  
00151     std::cout << "Lm(g1) ^ ~Lm(g1) = empty: OK\n";
00152   else
00153     std::cout << "(Lm(g1) v Lm(g2)) ^ ~(Lm(g1) v Lm(g2)) != empty: ERR\n";
00154   if(LanguageEquality(boolean_g1,boolean_complement2_g1))  
00155     std::cout << "Lm(g1) = ~~Lm(g1) : OK\n";
00156   else
00157     std::cout << "Lm(g1) != ~~Lm(g1) : ERR\n";
00158   std::cout << "################################\n";
00159 
00160   
00162   // language difference
00164   
00165   // read generator and write for html docu
00166   Generator difference_g1("data/difference_g1.gen");
00167   difference_g1.Write("tmp_difference_g1.gen");
00168   
00169   Generator difference_g2("data/difference_g2.gen");
00170   difference_g2.Write("tmp_difference_g2.gen");
00171     
00172   // compute language difference Lm(g1)-Lm(g2)
00173   
00174   Generator difference_g1minusg2;
00175   LanguageDifference(difference_g1,difference_g2,difference_g1minusg2);
00176   difference_g1minusg2.Write("tmp_difference_g1minusg2.gen");
00177 
00178   // inspect on console 
00179   std::cout << "################################\n";
00180   std::cout << "# language difference Lm(g1)-Lm(g2) \n";
00181   difference_g1minusg2.DWrite();
00182   std::cout << "################################\n";
00183 
00185   // convert to automaton
00187   
00188   // read generator and write for html docu
00189   Generator automaton_g("data/automaton_g.gen");
00190   automaton_g.Write("tmp_automaton_g.gen");
00191   
00192   // convert to automaton
00193   
00194   Automaton(automaton_g);
00195   automaton_g.Write("tmp_automaton_gRes.gen");
00196 
00197   // inspect on console 
00198   std::cout << "################################\n";
00199   std::cout << "# automaton from generator \n";
00200   automaton_g.DWrite();
00201   std::cout << "################################\n";
00202   
00203   
00205   // language concatenation
00207 
00208   // read generators and write for html docu
00209   Generator concat_g1("data/concat_g1.gen");
00210   Generator concat_g2("data/concat_g2.gen");
00211   Generator concat_g3("data/concat_g3.gen");
00212   Generator concat_g4("data/concat_g4.gen");
00213   concat_g1.Write("tmp_concat_g1.gen");
00214   concat_g2.Write("tmp_concat_g2.gen");
00215   concat_g3.Write("tmp_concat_g3.gen");
00216   concat_g4.Write("tmp_concat_g4.gen");
00217 
00218   // perform language concatenations and inspect on console
00219   std::cout << "################################\n";
00220   std::cout << "# language concatenation\n";
00221   Generator concat;
00222   concat.StateNamesEnabled(false);
00223   LanguageConcatenate(concat_g1,concat_g3,concat);
00224   concat.Write("tmp_concat_g1g3.gen");
00225   concat.DWrite();
00226   LanguageConcatenate(concat_g1,concat_g4,concat);
00227   concat.Write("tmp_concat_g1g4.gen");
00228   concat.DWrite();
00229   LanguageConcatenate(concat_g2,concat_g3,concat);
00230   concat.Write("tmp_concat_g2g3.gen");
00231   concat.DWrite();
00232   LanguageConcatenate(concat_g2,concat_g4,concat);
00233   concat.Write("tmp_concat_g2g4.gen");
00234   concat.DWrite();
00235   std::cout << "################################\n";
00236   
00237   
00239   // full language, alphabet language, empty string language and empty language
00241   
00242   // create alphabet={a,b}
00243   EventSet languages_alphabet;
00244   languages_alphabet.Insert("a");
00245   languages_alphabet.Insert("b");
00246   
00247   // generator for result
00248   Generator languages_g;
00249   
00250   // construct full language from alphabet
00251   FullLanguage(languages_alphabet,languages_g);
00252   languages_g.Write("tmp_languagesFull_result.gen");
00253 
00254   // inspect on console
00255   std::cout << "################################\n";
00256   std::cout << "# full language \n";
00257   languages_g.DWrite();
00258   
00259   // construct alphabet language from alphabet
00260   AlphabetLanguage(languages_alphabet,languages_g);
00261   languages_g.Write("tmp_languagesAlphabet_result.gen");
00262   std::cout << "# alphabet language \n";
00263   languages_g.DWrite();
00264   
00265   // construct empty string language from alphabet
00266   EmptyStringLanguage(languages_alphabet,languages_g);
00267   languages_g.Write("tmp_languagesEmptyString_result.gen");
00268   std::cout << "# empty string language \n";
00269   languages_g.DWrite();
00270   
00271   // construct empty language from alphabet
00272   EmptyLanguage(languages_alphabet,languages_g);
00273   languages_g.Write("tmp_languagesEmpty_result.gen");
00274   std::cout << "# empty language \n";
00275   languages_g.DWrite();
00276   std::cout << "################################\n";
00277 
00278 
00280   // Kleene closure
00282   
00283   // read generator and write for html docu
00284   Generator kleene_g("data/kleene_g.gen");
00285   kleene_g.Write("tmp_kleene_g.gen");
00286   
00287   // compute Kleene closure
00288   kleene_g.StateNamesEnabled(false);
00289   KleeneClosure(kleene_g);
00290   kleene_g.Write("tmp_kleene_gRes.gen");
00291 
00292   // inspect on console 
00293   std::cout << "################################\n";
00294   std::cout << "# Kleene closure \n";
00295   kleene_g.DWrite();
00296   std::cout << "################################\n";
00297   
00298   
00300   // prefix closure
00302   
00303   // read generator and write for html docu
00304   Generator prefixclosure_g("data/prefixclosure_g.gen");
00305   prefixclosure_g.Write("tmp_prefixclosure_g.gen");
00306   
00307   // compute prefix closure
00308   PrefixClosure(prefixclosure_g);
00309   prefixclosure_g.Write("tmp_prefixclosure_gRes.gen");
00310 
00311   // inspect on console 
00312   std::cout << "################################\n";
00313   std::cout << "# prefix closure \n";
00314   prefixclosure_g.DWrite();
00315   std::cout << "################################\n";
00316   
00317 
00319   // selfloop
00321   
00322   // read generator and write for html docu
00323   Generator selfloop_g("data/selfloop_g.gen");
00324   selfloop_g.Write("tmp_selfloop_g.gen");
00325   
00326   // create alphabet={e,f}
00327   EventSet selfloop_alphabet;
00328   selfloop_alphabet.Insert("e");
00329   selfloop_alphabet.Insert("f");
00330   
00331   // generator for result
00332   Generator selfloop_gRes=selfloop_g;
00333   
00334   // add selfloops in each state
00335   SelfLoop(selfloop_gRes,selfloop_alphabet);
00336   selfloop_gRes.Write("tmp_selfloop_gRes.gen");
00337 
00338   // inspect on console 
00339   std::cout << "################################\n";
00340   std::cout << "# selfloop, each state \n";
00341   selfloop_gRes.DWrite();
00342   
00343   // add selfloops in marked states
00344   selfloop_gRes=selfloop_g;
00345   SelfLoopMarkedStates(selfloop_gRes,selfloop_alphabet);
00346   selfloop_gRes.Write("tmp_selfloopMarked_gRes.gen");
00347   std::cout << "# selfloop, marked states \n";
00348   selfloop_gRes.DWrite();
00349   
00350   // add selfloops in inital state(s)
00351   selfloop_gRes=selfloop_g;
00352   SelfLoop(selfloop_gRes,selfloop_alphabet,selfloop_gRes.InitStates());
00353   selfloop_gRes.Write("tmp_selfloopInit_gRes.gen");
00354   std::cout << "# selfloop, init state(s) \n";
00355   selfloop_gRes.DWrite();
00356   std::cout << "################################\n";
00357 
00358   // say good bye    
00359   std::cout << "done.\n";
00360   return 0;
00361 }
00362 
00363 
00364 

Generated on Mon Nov 10 08:13:14 2008 for libFAUDES 2.11v by  doxygen 1.4.4