code: protected Disjunct toDisjunctiveNormalForm(SemanticType type) {
  		switch (type.getOpcode()) {
  		case TYPE_null:
  		case TYPE_bool:
  		case TYPE_byte:
  		case TYPE_int:
  			return toDisjunctiveNormalForm((Type.Primitive) type);
  		case TYPE_function:
  		case TYPE_method:
  		case TYPE_property:
  			return toDisjunctiveNormalForm((Type.Callable) type);
  		case SEMTYPE_array:
  		case TYPE_array:
  			return toDisjunctiveNormalForm((SemanticType.Array) type);
  		case TYPE_record:
  		case SEMTYPE_record:
  			return toDisjunctiveNormalForm((SemanticType.Record) type);
  		case TYPE_reference:
  		case TYPE_staticreference:
  		case SEMTYPE_reference:
  		case SEMTYPE_staticreference:
  			return toDisjunctiveNormalForm((SemanticType.Reference) type);
  		case TYPE_nominal:
  			return toDisjunctiveNormalForm((Type.Nominal) type);
  		case TYPE_union:
  		case SEMTYPE_union:
  			return toDisjunctiveNormalForm((SemanticType.Union) type);
  		case SEMTYPE_intersection:
  			return toDisjunctiveNormalForm((SemanticType.Intersection) type);
  		case SEMTYPE_difference:
  			return toDisjunctiveNormalForm((SemanticType.Difference) type);
  		default:
  			throw new IllegalArgumentException("unknown type encountered: " + type);
  		}
  	}
docs: Convert an arbitrary type to <i>Disjunctive Normal Form (DNF)</i>. That is a
  type with a specific structure made up from one or more "conjuncts" which are
  unioned together. Each conjunct contains one or more signed atoms which are
  intersected. For example, <code>int&(null|bool)</code> is converted into
  <code>(int&null)|(int&bool)</code>.
  
  @param type
  @param atoms
  @return
  @throws ResolutionError