anchor.diff:     */
     Minus(first, second): super(first, second);
     
  -  Expression derive(String toVar) => new Minus(first.derive(toVar), second.derive(toVar));
  +  Expression derive(String toVar) => new Minus(first.derive(toVar),
  +                                               second.derive(toVar));
  +  
  +  /**
  +   * Possible simplifications:
  +   * 
  +   * 1. a - 0 = a
  +   * 2. 0 - a = a
  +   */
  +  Expression simplify() {
  +    Expression firstOp = first.simplify();
  +    Expression secondOp = second.simplify();
  +    
  +    if (_isNumber(firstOp, 0)) {
  +      return secondOp;
  +    }
  +    
  +    if (_isNumber(secondOp, 0)) {
  +      return firstOp;
  +    }
  +    
  +    return new Minus(firstOp, secondOp);
  +    
  +    //TODO -a + b = b - a
  +    //TODO -a - b = - (a + b)
  +  }
  +  
     String toString() => '(${first.toString()} - ${second.toString()})';
   }
   
  
positive.code:    * 
     * If the argument is not an expression, it will be wrapped in an appropriate
     * literal.
     *  - A (positive) number will be encapsulated in a [Number] Literal,
     *  - A string will be encapsulated in a [Variable] Literal.
     */
    UnaryOperator(exp) {
      this.exp = _toExpression(exp);
  
negative.code:   
    Expression exp = new Power('x', 2);
    Expression mul = new Times('x', 'x');
    
    print('exp: ${exp.toString()}');
    print('expD: ${exp.derive('x').toString()}');
    print('expDSimp: ${exp.derive('x').simplify().toString()}');
    print('expDSimpDSimp: ${exp.derive('x').simplify().derive('x').simplify().toString()}');
    print('expDD: ${exp.derive('x').derive('x').toString()}');
    print('expDDSimp: ${exp.derive('x').derive('x').simplify().toString()}');
  
    print('mul: ${mul.toString()}');
    print('mulD: ${mul.derive('x').toString()}');
    print('mulDSimp: ${mul.derive('x').simplify().toString()}');
  
    Expression div = new Divide(exp, 'x');
    print('div: ${div.toString()}');
    print('divD: ${div.derive('x').toString()}');
    print('divDSimp: ${div.derive('x').simplify().toString()}');
  
    Expression log = new Log(new Number(10), exp);
    print('log: ${log.toString()}');
    print('logD: ${log.derive('x').toString()}');
    print('logDSimp: ${log.derive('x').simplify().toString()}');
  
    Expression expXY = x^a;
    print('expXY: ${expXY.toString()}');
    print('expXYD: ${expXY.derive('x').toString()}');
    print('expXYDsimp: ${expXY.derive('x').simplify().toString()}');
  
    Expression sqrt = new Sqrt(exp);
    print('sqrt: ${sqrt.toString()}');
    print('sqrtD: ${sqrt.derive('x').toString()}');
    print('sqrtDsimpl: ${sqrt.derive('x').simplify().toString()}');
    
    Expression root = new Root(5, exp);
    print('root: ${root.toString()}');
    print('rootD: ${root.derive('x').toString()}');
    print('rootDsimpl: ${root.derive('x').simplify().toString()}');
  }
  
  class Tokenizer {
  