Fixpoint ad_0_path_dist_1 (x y : ad) (l : list ad) 
 (n : nat) {struct n} : option D :=
  if Neqb x y
  then Some Dz
  else
   match n with
   | O => None
   | S n' =>
       match MapGet _ cg x with
       | None => None
       | Some edges =>
           if ad_in_list x l
           then None
           else
            let l' := x :: l in (* builds reverse path *)
            all_min
              (fun (z : ad) (d : D) =>
               if ad_in_list z l'
               then None
               else Ddplus (ad_0_path_dist_1 z y l' n') d) edges
       end
   end.Definition ad_0_path_dist (x y : ad) :=
  ad_0_path_dist_1 x y nil (MapCard _ cg).

Lemma ad_0_path_dist_correct : CGconsistent cg -> forall x y : ad, ad_0_path_dist x y = ad_simple_path_dist cg x y.