diff --git a/alib2algo/src/grammar/simplify/ToCNF.h b/alib2algo/src/grammar/simplify/ToCNF.h
index 5e233c6a58bd8a76bbd07942853cd0a37ccae74b..dd7d4d2839a0c646ba8575d01a8426000d5a216f 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.h
+++ b/alib2algo/src/grammar/simplify/ToCNF.h
@@ -130,41 +130,22 @@ grammar::CNF < TerminalSymbolType,  ext::variant < TerminalSymbolType, Nontermin
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
 void splitRule ( ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > lhs, const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs, grammar::CNF < TerminalSymbolType, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > & result ) {
-	switch ( rhs.size ( ) ) {
-	case 2: {
-			ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > left { rhs [ 0 ] };
-			ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > right { rhs [ 1 ] };
-			result.addRule ( std::move ( lhs ), ext::make_pair ( std::move ( left ), std::move ( right ) ) );
-			break;
-		}
-	case 3: {
-			ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > left { rhs [ 0 ] };
-
-			ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > right ( std::next ( rhs.begin ( ) ), rhs.end ( ) );
-			if ( result.addNonterminalSymbol ( right ) )
-				splitRule ( right, right, result );
+	ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > left;
+	ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > right;
 
-			result.addRule ( std::move ( lhs ), ext::make_pair ( std::move ( left ), std::move ( right ) ) );
-			break;
-		}
-	default: {
-			ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > left;
-			for ( unsigned i = 0; i < rhs.size ( ) / 2; ++ i )
-				left.push_back ( rhs [ i ] );
+	for ( unsigned i = 0; i < rhs.size ( ) / 2; ++ i )
+		left.push_back ( rhs [ i ] );
 
-			if ( result.addNonterminalSymbol ( left ) )
-				splitRule ( left, left, result );
+	if ( result.addNonterminalSymbol ( left ) && left.size ( ) > 1 )
+		splitRule ( left, left, result );
 
-			ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > right;
-			for ( unsigned i = rhs.size ( ) / 2; i < rhs.size ( ); ++ i )
-				right.push_back ( rhs [ i ] );
+	for ( unsigned i = rhs.size ( ) / 2; i < rhs.size ( ); ++ i )
+		right.push_back ( rhs [ i ] );
 
-			if ( result.addNonterminalSymbol ( right ) )
-				splitRule ( right, right, result );
+	if ( result.addNonterminalSymbol ( right ), right.size ( ) > 1 )
+		splitRule ( right, right, result );
 
-			result.addRule ( std::move ( lhs ), ext::make_pair ( std::move ( left ), std::move ( right ) ) );
-		}
-	}
+	result.addRule ( std::move ( lhs ), ext::make_pair ( std::move ( left ), std::move ( right ) ) );
 }
 
 template < class T, class TerminalSymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class NonterminalSymbolType = typename grammar::NonterminalSymbolTypeOfGrammar < T > >