I think introducing an ExpressionDomain class that encapsulates some of the semantics of how to combine them (intersection, union), whether they represent *all* or *none*, etc. instead of passing Maps all over the place would make the code more readable in general.