Section Be_iter1.
Variable bef : bool_expr -> bool_expr.
Hypothesis bef_inc : be_to_be_inc bef.
Hypothesis
bef_ok :
forall be : bool_expr,
be_ok (var_lu 0 N) be -> be_ok (var_lu 0 N) (bef be).
Fixpoint be_iter1 (be : bool_expr) (n : nat) {struct n} : bool_expr :=
match n with
| O => be
| S m => be_iter1 (bef be) m
end.
Fixpoint be_iter2 (be : bool_expr) (n : nat) {struct n} : bool_expr :=
match n with
| O => be
| S m => bef (be_iter2 be m)
end.

(* Specifications: *)
Lemma be_iter1_plus :
forall (m n : nat) (be : bool_expr),
be_iter1 (be_iter1 be m) n = be_iter1 be (m + n).
Lemma be_iter1eq2 :
forall (n : nat) (be : bool_expr), be_iter1 be n = be_iter2 be n.
Lemma be_iter1_inc :
forall (k : nat) (be : bool_expr),
be_le be (bef be) -> be_le (be_iter1 be k) (be_iter1 be (S k)).
Lemma be_iter1_ok :
forall (k : nat) (be : bool_expr),
be_ok (var_lu 0 N) be -> be_ok (var_lu 0 N) (be_iter1 be k).
Lemma be_iter1_fix_ex :
forall be : bool_expr,
be_ok (var_lu 0 N) be ->
be_le be (bef be) ->
exists m : nat,
m <= two_power N /\ be_eq (be_iter1 be m) (be_iter1 be (S m)).