End Be_iter1.

(* Specifications: *)
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)).