Fixpoint make_join (a c : ghost) : ghost :=
  match a, c with
  | nil, _ => c
  | _, nil => nil
  | None :: a', x :: c' => x :: make_join a' c'
  | _ :: a', None :: c' => None :: make_join a' c'
  | Some (ga, pa) :: a', Some (gc, _) :: c' => Some (gc, pa) :: make_join a' c'
  end.

Lemma ghost_joins_approx: forall n a c, joins (ghost_fmap (approx n) (approx n) a) (ghost_fmap (approx n) (approx n) c) -> let c' := make_join a c in joins (ghost_fmap (approx (S n)) (approx (S n)) a) (ghost_fmap (approx (S n)) (approx (S n)) c') /\ forall b, joins b (ghost_fmap (approx (S n)) (approx (S n)) c') -> joins (ghost_fmap (approx n) (approx n) b) (ghost_fmap (approx n) (approx n) c).