Index: src/ResolvExpr/Alternative.h
===================================================================
--- src/ResolvExpr/Alternative.h	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/ResolvExpr/Alternative.h	(revision 8c49c0e874fb58f676d7d0589d6897e2cf4e9581)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Alternative.h -- 
+// Alternative.h --
 //
 // Author           : Richard C. Bilson
@@ -12,5 +12,5 @@
 // Last Modified On : Sat May 16 23:54:39 2015
 // Update Count     : 2
-// 
+//
 
 #ifndef ALTERNATIVE_H
@@ -33,9 +33,9 @@
 		Alternative &operator=( const Alternative &other );
 		~Alternative();
-  
+
 		void initialize( const Alternative &src, Alternative &dest );
-  
+
 		void print( std::ostream &os, int indent = 0 ) const;
-  
+
 		Cost cost;
 		Cost cvtCost;
@@ -43,4 +43,41 @@
 		TypeEnvironment env;
 	};
+
+	/// helper function used by explode
+	template< typename OutputIterator >
+	void explodeUnique( Expression * expr, const Alternative & alt, OutputIterator out ) {
+		Type * res = expr->get_result();
+		if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) {
+			if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( alt.expr ) ) {
+				for ( Expression * expr : tupleExpr->get_exprs() ) {
+					explodeUnique( expr, alt, out );
+				}
+			} else {
+				UniqueExpr * unq = new UniqueExpr( expr->clone() );
+				for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
+					TupleIndexExpr * idx = new TupleIndexExpr( unq->clone(), i );
+					explodeUnique( idx, alt, out );
+					delete idx;
+				}
+				delete unq;
+			}
+		} else {
+			*out++ = Alternative( expr->clone(), alt.env, alt.cost, alt.cvtCost );
+		}
+	}
+
+	/// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type
+	template< typename OutputIterator >
+	void explode( Alternative &alt, OutputIterator out ) {
+		explodeUnique( alt.expr, alt, out );
+	}
+
+	// explode list of alternatives
+	template< typename OutputIterator >
+	void explode( AltList & alts, OutputIterator out ) {
+		for ( Alternative & alt : alts ) {
+			explode( alt, out );
+		}
+	}
 } // namespace ResolvExpr
 
