let reduce path =
    let rec reduce_aux lst = 
      match lst with 
        ParentDir :: tl ->
          begin
        match reduce_aux tl with
            Root s :: tl ->
            Root s :: tl 
        | ParentDir :: tl ->
          ParentDir :: ParentDir :: tl
        | [] ->
          ParentDir :: tl 
        | _ :: tl ->
          tl
        end
      | (CurrentDir _) :: tl 
      | Component "" :: tl ->
        (reduce_aux tl)
      | Component s :: tl ->
        Component s :: (reduce_aux tl)
      | Root s :: tl ->
        Root s :: (reduce_aux tl)
      | [] ->
        []
    in
    List.rev (reduce_aux (List.rev path))