Fixpoint BDDiter (f : BDDconfig -> ad -> BDDconfig * ad)
(cfg : BDDconfig) (node : ad) (n : nat) {struct n} :
BDDconfig * ad :=
match n with
| O => (cfg, node)
| S m =>
match f cfg node with
| (cfg1, node1) =>
if Neqb node node1 then (cfg1, node1) else BDDiter f cfg1 node1 m
end
end.
Fixpoint BDDiter2n (f : BDDconfig -> ad -> BDDconfig * ad)
(cfg : BDDconfig) (node : ad) (n : nat) {struct n} :
BDDconfig * ad * bool :=
match n with
| O =>
match f cfg node with
| (cfg1, node1) => (cfg1, node1, Neqb node node1)
end
| S m =>
match BDDiter2n f cfg node m with
| ((cfg1, node1), true) => (cfg1, node1, true)
| ((cfg1, node1), false) => BDDiter2n f cfg1 node1 m
end
end.
Definition cfgnode_eq (cfgnode1 cfgnode2 : BDDconfig * ad) :=
Neqb (snd cfgnode1) (snd cfgnode2).

(* Specifications: *)
Lemma BDDiter_as_iter :
forall (n : nat) (cfg : BDDconfig) (node : ad)
(f : BDDconfig -> ad -> BDDconfig * ad),
BDDiter f cfg node n =
iter _ cfgnode_eq (fun x => f (fst x) (snd x)) (cfg, node) n.