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)).
Lemma be_iter1_preserves_eq : forall (n : nat) (be1 be2 : bool_expr) (f : bool_expr -> bool_expr), (forall be1 be2 : bool_expr, be_eq be1 be2 -> be_eq (f be1) (f be2)) -> be_eq be1 be2 -> be_eq (be_iter1 f be1 n) (be_iter1 f be2 n).
Lemma be_iter1_plus1 : forall (m n : nat) (be : bool_expr) (f : bool_expr -> bool_expr), be_eq (be_iter1 f (be_iter1 f be m) n) (be_iter1 f be (m + n)).
Lemma be_iter2n_false : forall (n : nat) (be : bool_expr) (f : bool_expr -> bool_expr), (forall be1 be2 : bool_expr, be_eq be1 be2 -> be_eq (f be1) (f be2)) -> snd (be_iter2n f be n) = false -> be_eq (fst (be_iter2n f be n)) (be_iter1 f be (two_power n)).
Lemma be_iter2n_2n : forall (n : nat) (be : bool_expr) (f : bool_expr -> bool_expr), (forall be1 be2 : bool_expr, be_eq be1 be2 -> be_eq (f be1) (f be2)) -> be_eq (fst (be_iter2n f be n)) (be_iter1 f be (two_power n)).
Lemma be_iter1_le_preserved : forall (n : nat) (be1 be2 : bool_expr) (f1 f2 : bool_expr -> bool_expr), be_le be1 be2 -> (forall be1' be2' : bool_expr, be_le be1' be2' -> be_le (f1 be1') (f2 be2')) -> be_le (be_iter1 f1 be1 n) (be_iter1 f2 be2 n).
Lemma be_iter2n_le_preserved : forall (n : nat) (be1 be2 : bool_expr) (f1 f2 : bool_expr -> bool_expr), be_le be1 be2 -> (forall be1' be2' : bool_expr, be_eq be1' be2' -> be_eq (f1 be1') (f1 be2')) -> (forall be1' be2' : bool_expr, be_eq be1' be2' -> be_eq (f2 be1') (f2 be2')) -> (forall be1' be2' : bool_expr, be_le be1' be2' -> be_le (f1 be1') (f2 be2')) -> be_le (fst (be_iter2n f1 be1 n)) (fst (be_iter2n f2 be2 n)).