Fixpoint lazy_power_aux (A : Set) (egalite : Map A -> Map A -> bool)
(f : Map A -> Map A) (x : Map A) (n : nat) {struct n} :
MapFlag A :=
match n with
| O => flag_false A x
| S p =>
match lazy_power_aux A egalite f x p with
| flag_true y => flag_true A y
| flag_false y =>
match f y with
| z => if egalite y z then flag_true A y else flag_false A z
end
end
end.
Definition lazy_power (A : Set) (egalite : Map A -> Map A -> bool)
(f : Map A -> Map A) (x : Map A) (n : nat) : Map A :=
match lazy_power_aux A egalite f x n with
| flag_false z => z
| flag_true z => z
end.

Lemma lazy_power_eg_power :
forall (A : Set) (egalite : Map A -> Map A -> bool)
(f : Map A -> Map A) (x : Map A) (n : nat),
(forall a b : Map A, egalite a b = true <-> a = b) ->
lazy_power A egalite f x n = power (Map A) f x n.