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_1_correct_1 : (forall (x : ad) (d : D) (l : list ad), CG_path cg x d (x :: l) -> Dle Dz d = true) -> forall (n : nat) (x y : ad) (l : list ad) (d : D), length l <= n -> CG_path cg y d (x :: l) -> forall prefix : list ad, ad_list_stutters (rev prefix ++ x :: l) = false -> Ddle (ad_0_path_dist_1 x y prefix n) (Some d) = true.