Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision cd6a6ffee16b2e0915b5be3211ed86e60fd011e9)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 7c243a513501aa08a094f605301bcf570fe58e4d)
@@ -132,4 +132,27 @@
 	void printAlts( const AltList &list, std::ostream &os, unsigned int indentAmt ) {
 		Indenter indent = { indentAmt };
+
+		std::vector<int> idx;
+		idx.reserve(list.size());
+		for(int i = 0; i < list.size(); i++) { idx.push_back(i); }
+
+		std::sort(idx.begin(), idx.end(), [&list](int lhs_idx, int rhs_idx) -> bool {
+			const auto & lhs = list.at(lhs_idx);
+			const auto & rhs = list.at(rhs_idx);
+			if(lhs.expr->location.startsBefore(rhs.expr->location)) return true;
+			if(rhs.expr->location.startsBefore(lhs.expr->location)) return false;
+
+			if(lhs.env.size() < rhs.env.size()) return true;
+			if(lhs.env.size() > rhs.env.size()) return false;
+
+			if(lhs.openVars.size() < rhs.openVars.size()) return true;
+			if(lhs.openVars.size() > rhs.openVars.size()) return false;
+
+			if(lhs.need.size() < rhs.need.size()) return true;
+			if(lhs.need.size() > rhs.need.size()) return false;
+
+			return false;
+		});
+
 		for ( AltList::const_iterator i = list.begin(); i != list.end(); ++i ) {
 			i->print( os, indent );
@@ -1718,5 +1741,5 @@
 					std::cerr << std::endl;
 				)
-				
+
 				if ( thisCost != Cost::infinity ) {
 					// count one safe conversion for each value that is thrown away
Index: src/ResolvExpr/TypeEnvironment.h
===================================================================
--- src/ResolvExpr/TypeEnvironment.h	(revision cd6a6ffee16b2e0915b5be3211ed86e60fd011e9)
+++ src/ResolvExpr/TypeEnvironment.h	(revision 7c243a513501aa08a094f605301bcf570fe58e4d)
@@ -149,4 +149,6 @@
 		iterator end() const { return env.end(); }
 
+		auto size() const { return env.size(); }
+
 	  private:
 		ClassList env;
