Index: src/ResolvExpr/ResolveAssertions.cc
===================================================================
--- src/ResolvExpr/ResolveAssertions.cc	(revision 9aaacc27a30138e3cf69cc002b1d861c8aba1aac)
+++ src/ResolvExpr/ResolveAssertions.cc	(revision b3bd772ea908c7315ef740002c68efa5a0c7a41c)
@@ -16,6 +16,8 @@
 #include "ResolveAssertions.h"
 
+#include <algorithm>                // for sort
 #include <cassert>                  // for assertf
 #include <list>                     // for list
+#include <memory>                   // for unique_ptr
 #include <unordered_map>            // for unordered_map, unordered_multimap
 #include <utility>                  // for move
@@ -27,4 +29,5 @@
 #include "ResolvExpr/RenameVars.h"  // for renameTyVars
 #include "SymTab/Indexer.h"         // for Indexer
+#include "SymTab/Mangler.h"         // for Mangler
 #include "SynTree/Expression.h"     // for InferredParams
 #include "TypeEnvironment.h"        // for TypeEnvironment, etc.
@@ -370,13 +373,30 @@
 					}
 				} else {
-					// resolve deferred assertions by mutual compatibility and sort by cost
+					// resolve deferred assertions by mutual compatibility
 					std::vector<CandidateEnvMerger::OutType> compatible = filterCombos(
 						resn.deferred, 
 						CandidateEnvMerger{ resn.alt.env, resn.alt.openVars, resn.indexer } );
-					auto lmin = sort_mins( compatible.begin(), compatible.end(), 
-						CandidateCost{resn.indexer} );
-					
-					for ( auto it = compatible.begin(); it != lmin ; ++it ) {
-						auto& compat = *it;
+					// sort by cost
+					CandidateCost coster{ resn.indexer };
+					std::sort( compatible.begin(), compatible.end(), coster );
+					// // sort by cost if pruning
+					// if ( pruneAssertions ) {
+					// 	auto lmin = sort_mins( compatible.begin(), compatible.end(), 
+					// 		CandidateCost{resn.indexer} );
+					// 	compatible.erase( lmin, compatible.end() );
+					// }
+
+					// keep map of detected options
+					std::unordered_map<std::string, Cost> found;
+					for ( auto& compat : compatible ) {
+						// filter by environment-adjusted result type, keep only cheapest option
+						Type* resType = alt.expr->result->clone();
+						compat.env.apply( resType );
+						// skip if cheaper alternative already processed with same result type
+						Cost resCost = coster.get( compat );
+						auto it = found.emplace( SymTab::Mangler::mangleType( resType ), resCost );
+						if ( it.second == false && it.first->second < resCost ) continue;
+
+						// proceed with resolution step
 						ResnState new_resn = resn;
 
