Index: src/ResolvExpr/Alternative.h
===================================================================
--- src/ResolvExpr/Alternative.h	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
+++ src/ResolvExpr/Alternative.h	(revision aefcc3b4bc74c06dfe70a46ab130a8295ab26c3c)
@@ -32,4 +32,6 @@
 		Alternative( const Alternative &other );
 		Alternative &operator=( const Alternative &other );
+		Alternative( Alternative && other );
+		Alternative &operator=( Alternative && other );
 		~Alternative();
 
@@ -49,9 +51,12 @@
 		Type * res = expr->get_result();
 		if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) {
-			if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( alt.expr ) ) {
+			if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( expr ) ) {
+				// can open tuple expr and dump its exploded components
 				for ( Expression * expr : tupleExpr->get_exprs() ) {
 					explodeUnique( expr, alt, out );
 				}
 			} else {
+				// tuple type, but not tuple expr - need to refer to single instance of the argument
+				// expression and index into its components
 				UniqueExpr * unq = new UniqueExpr( expr->clone() );
 				for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
@@ -63,4 +68,5 @@
 			}
 		} else {
+			// atomic (non-tuple) type - output a clone of the expression in a new alternative
 			*out++ = Alternative( expr->clone(), alt.env, alt.cost, alt.cvtCost );
 		}
@@ -69,5 +75,5 @@
 	/// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type
 	template< typename OutputIterator >
-	void explode( Alternative &alt, OutputIterator out ) {
+	void explode( const Alternative &alt, OutputIterator out ) {
 		explodeUnique( alt.expr, alt, out );
 	}
@@ -75,6 +81,6 @@
 	// explode list of alternatives
 	template< typename OutputIterator >
-	void explode( AltList & alts, OutputIterator out ) {
-		for ( Alternative & alt : alts ) {
+	void explode( const AltList & alts, OutputIterator out ) {
+		for ( const Alternative & alt : alts ) {
 			explode( alt, out );
 		}
