(**************************************************************************)
-(* ___ *)
+(* ___ *)
(* ||M|| *)
(* ||A|| A project by Andrea Asperti *)
(* ||T|| *)
include "datatypes/bool.ma".
include "datatypes/compare.ma".
+let rec eqb n m \def
+match n with
+ [ O \Rightarrow
+ match m with
+ [ O \Rightarrow true
+ | (S q) \Rightarrow false]
+ | (S p) \Rightarrow
+ match m with
+ [ O \Rightarrow false
+ | (S q) \Rightarrow eqb p q]].
+
+theorem eqb_to_Prop: \forall n,m:nat.
+match (eqb n m) with
+[ true \Rightarrow n = m
+| false \Rightarrow \lnot (n = m)].
+intros.
+apply nat_elim2
+(\lambda n,m:nat.match (eqb n m) with
+[ true \Rightarrow n = m
+| false \Rightarrow \lnot (n = m)]).
+intro.elim n1.
+simplify.reflexivity.
+simplify.apply not_eq_O_S.
+intro.
+simplify.
+intro. apply not_eq_O_S n1 ?.apply sym_eq.assumption.
+intros.simplify.
+generalize in match H.
+elim (eqb n1 m1).
+simplify.apply eq_f.apply H1.
+simplify.intro.apply H1.apply inj_S.assumption.
+qed.
+
+theorem eqb_elim : \forall n,m:nat.\forall P:bool \to Prop.
+(n=m \to (P true)) \to (\lnot n=m \to (P false)) \to (P (eqb n m)).
+intros.
+cut
+match (eqb n m) with
+[ true \Rightarrow n = m
+| false \Rightarrow \lnot (n = m)] \to (P (eqb n m)).
+apply Hcut.apply eqb_to_Prop.
+elim eqb n m.
+apply (H H2).
+apply (H1 H2).
+qed.
+
let rec leb n m \def
match n with
[ O \Rightarrow true