Proof with auto.
intros. red in H, H0. unfold join.
icase a;icase b;icase c;icase d;icase e;inv H;inv H0.
exists CEmpty;split;red...
exists (CPart sh0 v0);split;red...
exists (CFull v0);split;red...
exists (CPart sh1 v1);split;red...
exists (CPart sh2 v2);split;red...
exists (CFull v2);split;red...
exists (CFull v1);split;red...
exists CEmpty;split;red...
exists (CPart sh0 v0);split;red...
exists (CPart sh0 v0);split;red...
exists (CPart sh0 v0);split;red...
exists (CPart sh0 v0);split;red...
3: exists (CEmpty);split;red...
destruct (ijoin_assoc _ _ _ _ _ H1 H) as [sh' [? ?]].
destruct (join_assoc H2 H3) as [fv [? ?]].
exists (CPart sh' fv); split; red...
icase sh; icase sh0; icase sh1; icase sh2.
red in H1, H3. simpl in H1, H3.
destruct (join_assoc H1 H3) as [sh' [? ?]].
assert ((~identity sh') /\ (~full sh')).
split; intro.
generalize (split_identity _ _ H0 H5); intro.
unfold midObj in *.
tauto.
specialize ( H5 x).
spec H5. exists A_top...
specialize ( H5 sh' A_top H4).
subst sh'.
apply unit_identity in H4.
unfold midObj in *.
tauto.
destruct (combjoin_assoc _ _ _ _ _ H2 H) as [v' [? ?]].
exists (CPart (existT _ sh' H5) v').
split; split...
Qed.

(* Specifications: *)
Lemma combineJ_com: forall a b c : combiner,
join a b c -> join b a c.