/**
   * la methode qui compare deux arbres et dit si ils match, appele par check
   *
   * @param pattern la partie gauche de la regle utilisee
   * @param arbre l'arbre dont on veut voir si il correspond a cette regle.
   * @param ht la hashmap qui va nous servir dans le remplacement.
   * @return on dit si les arbres match
   */
  private boolean compareExpressions(
      Expression pattern, Expression arbre, Hashtable<Character, Expression> ht) {
    boolean check;
    int i;

    if (!pattern.getType().equals(arbre.getType())) {
      return false;
    }
    // si c'est une variable
    if (pattern.getType().contains("variable")) {
      // si ce sont des varianles on verifie que les noms concordent avec la logique du pattern
      // cad si le pattern dit que a+a se reecrit deux fois on verifie que les variables du pattern
      // aient meme nom
      char patternName = pattern.getName();
      char arbreName = arbre.getName();

      // si on a deja rencontre cette lettre de pattern alors la lettre de la var doit correspondre
      // dans la ht
      if (ht.containsKey(patternName)) {
        if (ht.get(patternName).getName() != arbreName) return false;
      } else ht.put(patternName, arbre);
    }

    // si ce sont des entiers ils doivent avoir meme valeur
    if (pattern.getType().contains("Entier")) {
      if (pattern.calculateValue() != arbre.calculateValue()) return false;
    }
    // si on a des expressions operators
    if (pattern.getType().contains("expressionoperator")) {
      // on verifie qu'ils aient meme nb d'enfants
      if (pattern.getChildren().size() != arbre.getChildren().size()) return false;
      for (i = 0; i < pattern.getChildren().size(); i++) {
        // si une des comparaisons rate tout rate
        check = compareExpressions(pattern.getChildren().get(i), arbre.getChildren().get(i), ht);
        if (check == false) return false;
      }
    }

    return true;
  }