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.

(* Specifications: *)
Lemma make_join_nil : forall a, make_join a nil = nil.
Lemma make_join_nil_cons : forall o a c, make_join (o :: a) (None :: c) = None :: make_join a c.
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).