anchor.diff:    
     visitIntegerLiteral(IntegerLiteral n) {
       super.visitIntegerLiteral(n);
  -    constraints.add(new EqualityConstraint(new TypeVariable(n), new ConcreteType("int")));
  +    constraints.add(new EqualityConstraint(new TypeVariable(n), new NominalType("int")));
     }
     
     visitDoubleLiteral(DoubleLiteral n) {
       super.visitDoubleLiteral(n);
  -    constraints.add(new EqualityConstraint(new TypeVariable(n), new ConcreteType("double")));
  +    constraints.add(new EqualityConstraint(new TypeVariable(n), new NominalType("double")));
     }
     
     visitBinaryExpression(BinaryExpression be) {
  
positive.code:       substitutions[node.rightHandSide] = node.leftHandSide;
        queue.replace(node.rightHandSide, substitutions[node.rightHandSide]); 
        substitutions.replace(node.rightHandSide, substitutions[node.rightHandSide]);
      } else if (node.leftHandSide is ObjectType) {
        node.leftHandSide.union(node.rightHandSide);
      } else if (node.rightHandSide is ObjectType) {
  
negative.code:     });
    }
    
    void addProperty(TypeVariable key, Name property, NonStructuralType type) {
      if (!substitutions.containsKey(key))
        substitutions[key] = new ObjectType(key);
      substitutions[key] = substitutions[key].addProperty(property, type);
    }
    
    String toString(){
      StringBuffer sb = new StringBuffer();
      substitutions.forEach((TypeVariable key, ObjectType type) => sb.writeln("${key}: $type"));
      return sb.toString();  
    }
  }
  