/**
   * si l'arbre match check appelera cette fonction
   *
   * @param tree l'arbre qui correspond a la partie droite d'une regle cad la partie que doit
   *     devenir un arbre si il correspond a la partie gauche de la regle
   * @param ht une hashmap qui pour chaque variable du pattern a associé une variable de l'arbre par
   *     exemple si une rule dit que a + a = 2 * a et qu'on apelle cette rule sur l'arbre x + x avec
   *     x = 5 la hashpam nous dit que dans l'arbre droit de la rule la est une varible qui s'apelle
   *     x et qui vaut 5
   * @return elle retourne l'arbre remplacé
   */
  public Expression replace(Expression tree, Hashtable<Character, Expression> ht) {
    /** l'expression que l'on renverra a la fin, qui correspond a l'arbre quand il sera remplace */
    Expression newTree = tree.copy();
    if (tree.getType().contains("expressionoperator")) {

      int i;
      List<Expression> childs = tree.getChildren();
      List<Expression> newChilds = new ArrayList<Expression>();

      for (i = 0; i < childs.size(); i++) {
        newChilds.add(replace(childs.get(i), ht));
        // System.out.println("HO"+childs.get(i).show());
        // System.out.println("HEY"+newChilds.get(i).show());
      }
      newTree.setChildren(newChilds);

      return newTree;
    }

    // si c'est une variable
    if (tree.getType().contains("variable")) {
      newTree = ht.get(tree.getName());
    }
    return newTree;
  }