Hint Rewrite <- Zle_is_le_bool: align.
Hint Rewrite Z.eqb_eq: align.
Hint Rewrite power_nat_divide_le using (auto with align): align.
Hint Rewrite Z.mod_divide using (apply two_power_nat_0; auto with align): align.
Hint Rewrite two_p_max_divide using (auto with align): align.
Hint Rewrite two_p_max_1 using (auto with align): align.
Hint Resolve Z_max_two_p: align.

(* Specifications: *)
Lemma Z_of_nat_ge_O: forall n, Z.of_nat n >= 0.
Lemma nth_error_nth:
forall A (al: list A) (z: A) i, (i < length al)%nat -> nth_error al i = Some (nth i al z).
Lemma nat_of_Z_eq: forall i, nat_of_Z (Z_of_nat i) = i.
Lemma nth_error_length:
forall {A} i (l: list A), nth_error l i = None <-> (i >= length l)%nat.
Lemma prop_unext: forall P Q: Prop, P=Q -> (P<->Q).
Inductive sublist {A} : list A -> list A -> Prop :=
| sublist_nil : sublist nil nil
| sublist_cons a l1 l2 : sublist l1 l2 -> sublist (a :: l1) (a :: l2)
| sublist_drop a l1 l2 : sublist l1 l2 -> sublist l1 (a :: l2).
Lemma sublist_In {A} (a : A) l1 l2 : sublist l1 l2 -> In a l1 -> In a l2.
Lemma sublist_norepet {A} (l1 l2 : list A) : sublist l1 l2 -> list_norepet l2 -> list_norepet l1.
Definition Ensemble_join {A} (X Y Z: Ensemble A): Prop :=
(forall a, Z a <-> X a \/ Y a) /\ (forall a, X a -> Y a -> False).