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)