cases: fixes a1 :: "collection_unop"   and a2 :: "'a OCL_Types.type"   and a3 :: "'a OCL_Types.type" assumes "collection_unop_type a1 a2 a3" obtains \<tau> :: "'a OCL_Types.type" and uu_ :: "'a OCL_Types.type" where "a1 = CollectionSizeOp" and "a2 = \<tau>__" and "a3 = Integer[1]" and "element_type \<tau>__ uu_"   | \<tau> :: "'a OCL_Types.type" and uv_ :: "'a OCL_Types.type" where "a1 = IsEmptyOp" and "a2 = \<tau>'__" and "a3 = Boolean[1]" and "element_type \<tau>'__ uv_"   | \<tau> :: "'a OCL_Types.type" and uw_ :: "'a OCL_Types.type" where "a1 = NotEmptyOp" and "a2 = \<tau>''__" and "a3 = Boolean[1]" and "element_type \<tau>''__ uw_"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" where "a1 = CollectionMaxOp" and "a2 = \<tau>'''__" and "a3 = \<sigma>__" and "element_type \<tau>'''__ \<sigma>__" and "\<sigma>__ = UnlimitedNatural[1]\<midarrow>Real[1]"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" and oper :: "String.literal \<times> 'a OCL_Types.type \<times> (String.literal \<times> 'a OCL_Types.type \<times> param_dir) list \<times> 'a OCL_Types.type \<times> bool \<times> 'a expr option" where "a1 = CollectionMaxOp" and "a2 = \<tau>''''__" and "a3 = \<sigma>'__" and "element_type \<tau>''''__ \<sigma>'__" and "operation \<sigma>'__ STR ''max'' [\<sigma>'__] oper__"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" where "a1 = CollectionMinOp" and "a2 = \<tau>'''''__" and "a3 = \<sigma>''__" and "element_type \<tau>'''''__ \<sigma>''__" and "\<sigma>''__ = UnlimitedNatural[1]\<midarrow>Real[1]"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" and oper :: "String.literal \<times> 'a OCL_Types.type \<times> (String.literal \<times> 'a OCL_Types.type \<times> param_dir) list \<times> 'a OCL_Types.type \<times> bool \<times> 'a expr option" where "a1 = CollectionMinOp" and "a2 = \<tau>''''''__" and "a3 = \<sigma>'''__" and "element_type \<tau>''''''__ \<sigma>'''__" and "operation \<sigma>'''__ STR ''min'' [\<sigma>'''__] opera__"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" where "a1 = SumOp" and "a2 = \<tau>'''''''__" and "a3 = \<sigma>''''__" and "element_type \<tau>'''''''__ \<sigma>''''__" and "\<sigma>''''__ = UnlimitedNatural[1]\<midarrow>Real[1]"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" and oper :: "String.literal \<times> 'a OCL_Types.type \<times> (String.literal \<times> 'a OCL_Types.type \<times> param_dir) list \<times> 'a OCL_Types.type \<times> bool \<times> 'a expr option" where "a1 = SumOp" and "a2 = \<tau>''''''''__" and "a3 = \<sigma>'''''__" and "element_type \<tau>''''''''__ \<sigma>'''''__" and "operation \<sigma>'''''__ STR ''+'' [\<sigma>'''''__] oper"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" where "a1 = AsSetOp" and "a2 = \<tau>'''''''''__" and "a3 = Set \<sigma>''''''__" and "element_type \<tau>'''''''''__ \<sigma>''''''__"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" where "a1 = AsOrderedSetOp" and "a2 = \<tau>''''''''''__" and "a3 = OrderedSet \<sigma>'''''''__" and "element_type \<tau>''''''''''__ \<sigma>'''''''__"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" where "a1 = AsBagOp" and "a2 = \<tau>'''''''''''__" and "a3 = Bag \<sigma>''''''''__" and "element_type \<tau>'''''''''''__ \<sigma>''''''''__"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" where "a1 = AsSequenceOp" and "a2 = \<tau>''''''''''''__" and "a3 = Sequence \<sigma>'''''''''__" and "element_type \<tau>''''''''''''__ \<sigma>'''''''''__"   | \<tau> :: "'a OCL_Types.type" and \<sigma> :: "'a OCL_Types.type" where "a1 = FlattenOp" and "a2 = \<tau>'''''''''''''__" and "a3 = \<sigma>" and "update_element_type \<tau>'''''''''''''__ (to_single_type \<tau>'''''''''''''__) \<sigma>"   | \<tau> :: "'a OCL_Types.type" where "a1 = FirstOp" and "a2 = OrderedSet \<tau>''''''''''''''__" and "a3 = \<tau>''''''''''''''__"   | \<tau> :: "'a OCL_Types.type" where "a1 = FirstOp" and "a2 = Sequence \<tau>'''''''''''''''__" and "a3 = \<tau>'''''''''''''''__"   | \<tau> :: "'a OCL_Types.type" where "a1 = LastOp" and "a2 = OrderedSet \<tau>''''''''''''''''__" and "a3 = \<tau>''''''''''''''''__"   | \<tau> :: "'a OCL_Types.type" where "a1 = LastOp" and "a2 = Sequence \<tau>'''''''''''''''''__" and "a3 = \<tau>'''''''''''''''''__"   | \<tau> :: "'a OCL_Types.type" where "a1 = ReverseOp" and "a2 = OrderedSet \<tau>''''''''''''''''''__" and "a3 = OrderedSet \<tau>''''''''''''''''''__"   | \<tau> :: "'a OCL_Types.type" where "a1 = ReverseOp" and "a2 = Sequence \<tau>" and "a3 = Sequence \<tau>"