Ciao ragazzi,
penso di aver già preso una strada per risolvere questo problema:
prima di tutto ho la classe abstract "Espressione" con i metodi "semplifica","derivata","espressioneToString"

codice:
abstract public class Espressione {
        static Espressione semplifica(Espressione e){
                    ....//ancora da implementare
        }
        static void derivata(){
                    ...//ancora da implementare
        }
        static String espressioneToString(Espressione e) {
          if(e instanceof Variabile){ 
               return ((Variabile)e).variabile();
          }
          else 
          if(e instanceof Negazione){
               return "-" + espressioneToString(((Negazione)e).operando());
          }
          else 
          if(e instanceof Somma){
              return espressioneToString(((Somma)e).operando1()) +
              " + " + espressioneToString(((Somma)e).operando2());
          }
     
         ....ecc.
    

         if(e instanceof Costante){
            double c = ((Costante)e).getValore(); 
            String str = new String(String.valueOf(c));
            return (str);
         }
       return (" ");
      }

}
poi tutte le altre classi (una per ogni operazione tra espressioni) in numero limitato:
"Somma","Sottrazione","Divisione","Moltiplicazione ","Negazione","Variabile","Costante","Seno","Cosen o","Tangente","Esponente" e "Ln".
poi sulla faccio una cosa del genere:
codice:
void main(){
  ...
  
   //test stampa espressione: sin(2^x-y)/(ln(x))
   Espressione myExp = new Divisione(new Seno(new Sottrazione(new Esponente(new Costante(2.0), new Variabile("x")),new Variabile("y"))),new Ln(new Variabile("x")) ); 
   System.out.println("\nStampa espressione: "+ Espressione.espressioneToString(myExp));
    
   /****************OUTPUT************************
    * Stampa espressione: sin(2.0^x - y) / ln(x)
    *
    **********************************************
mi serve da implementare:
"semplifica" e "derivata"
idee?!