proposition: Lemma le_dec : forall n m, {n <= m} + {m <= n}.
proof: Proof. Proof le_ge_dec. Definition lt_or_eq n m := {m > n} + {n = m}. Lemma le_decide : forall n m, n <= m -> lt_or_eq n m. Proof le_lt_eq_dec. Lemma le_le_S_eq : forall n m, n <= m -> S n <= m \/ n = m. Proof (fun n m Hle => proj1 (Nat.lt_eq_cases n m) Hle). Lemma discrete_nat : forall n m, n < m -> S n = m \/ (exists r : nat, m = S (S (n + r))). Proof. intros m n H. lapply (proj1 (Nat.le_succ_l m n)); auto. intro H'; lapply (proj1 (Nat.lt_eq_cases (S m) n)); auto. induction 1; auto. right; exists (n - S (S m)); simpl. rewrite (Nat.add_comm m (n - S (S m))). rewrite (plus_n_Sm (n - S (S m)) m). rewrite (plus_n_Sm (n - S (S m)) (S m)). rewrite (Nat.add_comm (n - S (S m)) (S (S m))). rewrite Nat.add_sub_assoc; [ | assumption ]. rewrite Nat.add_comm. rewrite <- Nat.add_sub_assoc; [ | reflexivity ]. rewrite Nat.sub_diag. symmetry; apply Nat.add_0_r. Qed.
imports: Arith_base Peano_dec Compare_dec