(*s [(CG_add x y d)] adds the edge (x,y) of weight d to G, 
   in case an edge already exists, only the minimal one is kept
*)

Definition CG_add (x y : ad) (d : D) :=
  match MapGet _ cg x with
  | None => MapPut _ cg x (M1 _ y d)
  | Some edges =>
      match MapGet _ edges y with
      | None => MapPut _ cg x (MapPut _ edges y d)
      | Some d0 => MapPut _ cg x (MapPut _ edges y (Dmin d d0))
      end
  end.Definition cg2 := CG_add cg1 x y d.

Lemma CG_add_4_1 : forall (l : list ad) (x0 y0 : ad) (d0 : D), CG_path cg2 y0 d0 (x0 :: l) -> {l0 : list ad & {l1 : list ad | x0 :: l = l0 ++ x :: y :: l1}} + CG_path cg1 y0 d0 (x0 :: l).