let rel_from ~base p =
  match (base, p) with
  | ((`Abs, []), _) | (_, (`Abs, [])) -> assert false
  | ((`Abs, bh :: bsegs), (`Abs, ph :: psegs)) ->
      let rec inner bsegs psegs =
        (* let () = Printf.printf "b=%S p=%S\n%!" (segs_to_string bsegs)
          (segs_to_string psegs) in *)

        (match bsegs with
         | [] | [ "" ] -> (`Rel, psegs)
         | bh :: bt ->
             (match psegs with
              | ph :: pt when bh = ph -> inner bt pt
              | [] | _ :: _ ->
                  (`Rel, ((map_nonempty_segs (fun _ -> "..") bsegs) @ psegs))))
      in (assert (bh = ""); assert (ph = ""); inner bsegs psegs)