Proof with auto.
repeat intro. simpl in H|-*. unfold join in H|-*. simpl in H|-*.
icase x'; icase y; icase z.
exists (CEmpty). exists (CEmpty). firstorder.
exists (CEmpty). exists (CPart sh0 v0).
destruct H. simpl.
repeat split; congruence.
exists (CEmpty). exists (CFull v0).
simpl in H. simpl.
repeat split; congruence.
exists (CPart sh v0). exists (CEmpty).
destruct H. simpl.
repeat split; congruence.
destruct H.
generalize (paf_preserves_unmap_left saf_T1 f g v v0 v1 H0); intro X.
destruct X as [x [y0 [? [? ?]]]].
exists (CPart sh x). exists (CPart sh0 y0).
split. split...
simpl. split; congruence.
(* combjoin case *)
destruct H.
specialize ( combjoin_preserves_unmap_left A B f g v v0 v1 H).
destruct combjoin_preserves_unmap_left as [x [y0 [? [? ?]]]].
exists (CPart sh x). exists (CPart sh0 y0).
split. split...
simpl. split; congruence.
(* end combjoin case *)
exists (CFull v0). exists (CEmpty).
simpl in H. simpl.
repeat split; congruence.
Qed.

(* Specifications: *)
Lemma fmap_fcombiner_preserves_unmap_right: forall A B (f : A -> B) (g: B -> A),
unmap_right (Join_fcombiner A) (Join_fcombiner B) (fmap f_combiner f g).