En vous connectant, vous pouvez utiliser des namespaces (e.g. https://paste.iiens.net/exemple/), supprimer vos pastes, etc.

automate  | cpp   (raw) expire le 16 December 2019 | 14:26

  1. Automaton Automaton::createProduct(const Automaton &lhs, const Automaton &rhs) {
  2.         Automaton ret =  Automaton();
  3.         std::map<std::pair<int,int>,int> workingOn;
  4.  
  5.         std::set<int> lhsInit;
  6.         std::set<int> rhsInit;
  7.         std::set<char> alphabetFromBoth;
  8.  
  9.         for (auto alpha1 : lhs.alphabet) {
  10.             alphabetFromBoth.insert(alpha1);
  11.         }
  12.         for (auto alpha2 : rhs.alphabet) {
  13.             alphabetFromBoth.insert(alpha2);
  14.         }
  15.  
  16.         for (auto lhsSt : lhs.states) {
  17.             if (lhs.isStateInitial(lhsSt.first)) {
  18.                 lhsInit.insert(lhsSt.first);
  19.             }
  20.         }
  21.         for (auto rhsSt : rhs.states) {
  22.             if (rhs.isStateInitial(rhsSt.first)) {
  23.                 rhsInit.insert(rhsSt.first);
  24.             }
  25.         }
  26.         int currentNumber = 0;
  27.         for (auto init1 : lhsInit) {
  28.             for (auto init2 : rhsInit) {
  29.                 ret.addState(currentNumber);
  30.                 ret.setStateInitial(currentNumber);
  31.                 std::cout << "Merged from left automata " << init1 << " and from right automata " << init2 << " into " << currentNumber <<"\n";
  32.                 workingOn.insert(std::make_pair(std::pair<int,int>(init1,init2),currentNumber));
  33.                 if (lhs.isStateFinal(init1) && rhs.isStateFinal(init2)) {
  34.                     ret.setStateFinal(currentNumber);
  35.                 }
  36.                 ++currentNumber;
  37.             }
  38.         }
  39.  
  40.         while (!workingOn.empty()) {
  41.             std::map<std::pair<int,int>,int> copy = workingOn;
  42.             for (auto pair : workingOn) {
  43.                 int p = pair.first.first;
  44.                 int q = pair.first.second;
  45.                 int thatState = pair.second;
  46.                 workingOn.erase(std::pair<int,int>(p,q));
  47.                 if ((lhs.isStateFinal(p)) && (rhs.isStateFinal(q))) {
  48.                     ret.setStateFinal(thatState);
  49.                 }
  50.  
  51.                 for (auto lhsSt : lhs.states) {
  52.                     int pPrime = lhsSt.first;
  53.                     for (auto rhsSt : rhs.states) {
  54.                         int qPrime = rhsSt.first;
  55.                         for (auto alpha : alphabetFromBoth) {
  56.                             if (lhs.hasTransition(p,alpha,pPrime)) {
  57.                                 if (rhs.hasTransition(q,alpha,qPrime)) {
  58.  
  59.                                     if (copy.find(std::pair<int,int>(pPrime,qPrime)) == copy.end()) {
  60.                                         ret.addState(currentNumber);
  61.                                         workingOn.insert(std::make_pair(std::pair<int,int>(pPrime,qPrime),currentNumber));
  62.                                         copy.insert(std::make_pair(std::pair<int,int>(pPrime,qPrime),currentNumber));
  63.                                         std::cout << "Merged from left automata " << pPrime << " and from right automata " << qPrime << " into " << currentNumber <<"\n";
  64.                                         ++currentNumber;
  65.                                     }
  66.                                     auto toThatState = copy.find(std::pair<int,int>(pPrime,qPrime));
  67.                                     ret.addTransition(thatState,alpha,toThatState->second);
  68.                                     std::cout << "Added this transitions (" << p <<","<< q <<") " << alpha << " (" << pPrime <<","<< qPrime <<")\n";
  69.                                 }
  70.                             }
  71.                         }
  72.                     }
  73.                 }
  74.             }
  75.             std::cout << "Copy.size = " << copy.size() << "\n";
  76.             std::cout << "workingOn.size = " << workingOn.size() << "\n";
  77.         }
  78.         return ret;
  79.     }
  80.  

Écrivez votre texte ci-dessous !

Ajoutez "+++" au début d'une ligne pour la mettre en valeur !

Langage Accès Expire dans


Options