(*
Lemma bool_to_nat_negb : (b:bool)
	(bool_to_nat (negb b))=(minus (S O) (bool_to_nat b)).
Induction b;Auto.
Qed. Hints Resolve bool_to_nat_negb.
*)


(****************************************************************)
(* Conditionnelle polymorphique: le test est un booleen,        *)
(* les clauses d'un type quelconque (le meme pour les 2 clauses *)

Definition If (T : Set) (b : bool) (x y : T) :=
  match b with
  | true => x
  | false => y
  end.

(* Specifications: *)
Lemma If_neg : forall (T : Set) (b : bool) (x y : T), If T (negb b) x y = If T b y x.
Lemma If_eq : forall (T : Set) (b : bool) (x : T), If T b x x = x.
Lemma IfIf : forall (T : Set) (b1 b2 : bool) (x x' y y' : T), If T b1 (If T b2 x y) (If T b2 x' y') = If T b2 (If T b1 x x') (If T b1 y y').
Lemma If_cond_true : forall (T : Set) (a : bool) (x y : T), x <> y -> If T a x y = x -> a = true.
Lemma If_cond_false : forall (T : Set) (a : bool) (x y : T), x <> y -> If T a x y = y -> a = false.
Lemma F_If : forall (T T' : Set) (a : bool) (x y : T) (F : T -> T'), F (If T a x y) = If T' a (F x) (F y).