Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 1fdfc232a699adc53d34403e6ac291a624b88d41)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision d551d0a2adefe8ac465d8cb523460251ca58c873)
@@ -579,25 +579,4 @@
 			  expls(), nextExpl(0), tupleEls() {}
 		
-		ArgPack(const ArgPack& old, Expression* actual, TypeEnvironment&& env, 
-				OpenVarSet&& openVars, const Cost& cost = Cost::zero)
-			: actuals(old.actuals), env(std::move(env)), need(old.need), have(old.have), 
-			  openVars(std::move(openVars)), nextArg(old.nextArg + 1), tupleEls(old.tupleEls) {
-			// add new actual
-			actuals.emplace_back( actual, this->env, cost );
-			// count tuple elements, if applicable
-			if ( ! tupleEls.empty() ) ++tupleEls.back();
-		}
-		
-		ArgPack(const ArgPack& old, Expression* actual, TypeEnvironment&& env, AssertionSet&& need, 
-				AssertionSet&& have, OpenVarSet&& openVars, const Cost& cost = Cost::zero)
-			: actuals(old.actuals), env(std::move(env)), need(std::move(need)), 
-			  have(std::move(have)), openVars(std::move(openVars)), nextArg(old.nextArg + 1), 
-			  tupleEls(old.tupleEls) {
-			// add new actual
-			actuals.emplace_back( actual, this->env, cost );
-			// count tuple elements, if applicable
-			if ( ! tupleEls.empty() ) ++tupleEls.back();
-		}
-
 		/// Starts a new tuple expression
 		void beginTuple() {
@@ -676,5 +655,5 @@
 						if ( unify( ttype, argType, result.env, result.need, result.have, 
 								result.openVars, indexer ) ) {
-							finalResults.emplace_back( std::move(result) );
+							finalResults.push_back( std::move(result) );
 						}
 						continue;
@@ -766,5 +745,5 @@
 				// consider only first exploded actual
 				const Alternative& aActual = exploded.front();
-				Type* actualType = aActual.expr->get_result();
+				Type* actualType = aActual.expr->get_result()->clone();
 
 				PRINT(
@@ -840,5 +819,5 @@
 					// keep if used all arguments
 					if ( result.nextArg >= args.size() ) {
-						finalResults.emplace_back( std::move(result) );
+						finalResults.push_back( std::move(result) );
 						continue;
 					}
@@ -846,9 +825,20 @@
 					// add each possible next argument
 					for ( const Alternative& actual : args[result.nextArg] ) {
-						TypeEnvironment env{ result.env };
-						OpenVarSet openVars{ result.openVars };
-						env.addActual( actual.env, openVars );
-						nextResults.emplace_back( result, actual.expr->clone(), std::move(env), 
-							std::move(openVars), actual.cost );
+						ArgPack aResult = result; // copy to clone everything
+						// add details of actual to result
+						aResult.env.addActual( actual.env, aResult.openVars );
+						Cost cost = actual.cost;
+
+						// explode argument
+						std::vector<Alternative> exploded;
+						Tuples::explode( actual, indexer, back_inserter( exploded ) );
+
+						// add exploded argument to arg list
+						for ( Alternative& aActual : exploded ) {
+							aResult.withArg( aActual.expr, cost );
+							cost = Cost::zero;
+						}
+						++aResult.nextArg;
+						nextResults.push_back( std::move(aResult) );
 					}
 				}
@@ -862,5 +852,5 @@
 			for ( ArgPack& result : results ) {
 				if ( result.nextArg >= args.size() ) {
-					finalResults.emplace_back( std::move(result) );
+					finalResults.push_back( std::move(result) );
 				}
 			}
