(* This program is free software; you can redistribute it and/or      *)
(* modify it under the terms of the GNU Lesser General Public License *)
(* as published by the Free Software Foundation; either version 2.1   *)
(* of the License, or (at your option) any later version.             *)
(*                                                                    *)
(* This program is distributed in the hope that it will be useful,    *)
(* but WITHOUT ANY WARRANTY; without even the implied warranty of     *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *)
(* GNU General Public License for more details.                       *)
(*                                                                    *)
(* You should have received a copy of the GNU Lesser General Public   *)
(* License along with this program; if not, write to the Free         *)
(* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *)
(* 02110-1301 USA                                                     *)
(* Contribution to the Coq Library   V6.3 (July 1999)                    *)
(*  ---                        two_power.v                             ---  *)
(*                                                                          *)
(* Author: Pierre Casteran.                                                 *)
(*    LABRI, URA CNRS 1304,                                                 *)
(*    Departement d'Informatique, Universite Bordeaux I,                    *)
(*    33405 Talence CEDEX,                                                  *)
(*    e-mail:  casteran@labri.u-bordeaux.fr                                 *)
(* The integer powers of 2 are fundamental in computer science; so we wrote this module, the results of which are used mainly in the "log2_spec" module. *)
(* 2 at the n *)
(**************)
Fixpoint two_power (m : nat) : nat :=
match m with
| O => 1
| S n => two * two_power n
end.
(********************************************)
Hint Resolve zero_lt_pow: arith.
(**************************************************)
(***************************************************************)
(*************************************************************)
(**************************************************************)
(****************************************************************)
(* if 2^n < z <2^(n+1), then z cannot be a power of 2 ! *)
(*********************************************************)
(**************************************************************)
(* the intervals ]2^n,2^(n+1)[ are pairwise disjoint *)
(*****************************************************)

Lemma log2_unicity :
forall n p z : nat,
two_power n < z ->
z < two_power (S n) -> two_power p < z -> z < two_power (S p) -> n = p.