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.

(* Specifications: *)
Lemma lazy_power_eg_power_0 :
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) ->
forall z : Map A,
(lazy_power_aux A egalite f x n = flag_true A z ->
z = power (Map A) f x n /\ z = f z) /\
(lazy_power_aux A egalite f x n = flag_false A z -> z = power (Map A) f x n).
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.