Built with Alectryon, running Coq+SerAPI v8.10.0+0.7.0. Coq sources are in this panel; goals and messages will appear in the other. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus.
(************************************************************************)
(*         *   The Coq Proof Assistant / The Coq Development Team       *)
(*  v      *   INRIA, CNRS and contributors - Copyright 1999-2018       *)
(* <O___,, *       (see CREDITS file for the list of authors)           *)
(*   \VV/  **************************************************************)
(*    //   *    This file is distributed under the terms of the         *)
(*         *     GNU Lesser General Public License Version 2.1          *)
(*         *     (see LICENSE file for the text of the license)         *)
(************************************************************************)

Require Import Bool.
Require Import Sumbool.
Require Import Arith.
Require Import BinPos.
Require Import BinNat.
Require Import Pnat.
Require Import Nnat.
Require Import Ndigits.

Local Open Scope N_scope.
Obsolete results about boolean comparisons over N, kept for compatibility with IntMap and SMC.
Notation Peqb_correct := Pos.eqb_refl (only parsing).
Notation Neqb_correct := N.eqb_refl (only parsing).
Notation Neqb_comm := N.eqb_sym (only parsing).

p, p':positive

(p =? p')%positive = true -> p = p'
p, p':positive

(p =? p')%positive = true -> p = p'
now apply Pos.eqb_eq. Qed.
p, p':positive

(p =? p')%positive = true -> (p ?= p')%positive = Eq
p, p':positive

(p =? p')%positive = true -> (p ?= p')%positive = Eq
now rewrite Pos.compare_eq_iff, <- Pos.eqb_eq. Qed.
p, p':positive

(p ?= p')%positive = Eq -> (p =? p')%positive = true
p, p':positive

(p ?= p')%positive = Eq -> (p =? p')%positive = true
now rewrite Pos.eqb_eq, <- Pos.compare_eq_iff. Qed.
n, n':N

(n =? n') = true -> (n ?= n') = Eq
n, n':N

(n =? n') = true -> (n ?= n') = Eq
now rewrite N.compare_eq_iff, <- N.eqb_eq. Qed.
n, n':N

(n ?= n') = Eq -> (n =? n') = true
n, n':N

(n ?= n') = Eq -> (n =? n') = true
now rewrite N.eqb_eq, <- N.compare_eq_iff. Qed.
n, n':N

(n =? n') = true -> n = n'
n, n':N

(n =? n') = true -> n = n'
now apply N.eqb_eq. Qed.
n, n':N

N.lxor n n' = 0 -> (n =? n') = true
n, n':N

N.lxor n n' = 0 -> (n =? n') = true
n, n':N
H:N.lxor n n' = 0

(n =? n') = true
n, n':N
H:n = n'

(n =? n') = true
n':N

(n' =? n') = true
apply N.eqb_refl. Qed. Ltac eqb2eq := rewrite <- ?not_true_iff_false in *; rewrite ?N.eqb_eq in *.
n, n':N
p:positive

N.lxor n n' = N.pos p -> (n =? n') = false
n, n':N
p:positive

N.lxor n n' = N.pos p -> (n =? n') = false
n, n':N
p:positive
H:N.lxor n n' = N.pos p

(n =? n') = false
n, n':N
p:positive
H:N.lxor n n' = N.pos p

n <> n'
n, n':N
p:positive
H:N.lxor n n' = N.pos p
H0:n = n'

False
n':N
p:positive
H:N.lxor n' n' = N.pos p

False
now rewrite N.lxor_nilpotent in *. Qed.
a:N

Nodd a -> forall a0 : N, (N.double a0 =? a) = false
a:N

Nodd a -> forall a0 : N, (N.double a0 =? a) = false
a:N
H:Nodd a
a0:N

(N.double a0 =? a) = false
a:N
H:Nodd a
a0:N

N.double a0 <> a
a0:N
H:Nodd (N.double a0)

False
a0:N
H:N.odd (N.double a0) = true

False
now rewrite Ndouble_bit0 in *. Qed.
a, a0:N

(N.div2 a =? a0) = false -> (a =? N.double a0) = false
a, a0:N

(N.div2 a =? a0) = false -> (a =? N.double a0) = false
a, a0:N
H:(N.div2 a =? a0) = false

(a =? N.double a0) = false
a, a0:N
H:N.div2 a <> a0

a <> N.double a0
a, a0:N
H:a = N.double a0

N.div2 a = a0
a0:N

N.div2 (N.double a0) = a0
apply N.div2_double. Qed.
a:N

Neven a -> forall a0 : N, (N.succ_double a0 =? a) = false
a:N

Neven a -> forall a0 : N, (N.succ_double a0 =? a) = false
a:N
H:Neven a
a0:N

(N.succ_double a0 =? a) = false
a:N
H:Neven a
a0:N

N.succ_double a0 <> a
a0:N
H:Neven (N.succ_double a0)

False
a0:N
H:N.odd (N.succ_double a0) = false

False
now rewrite Ndouble_plus_one_bit0 in *. Qed.
a, a0:N

(N.div2 a =? a0) = false -> (N.succ_double a0 =? a) = false
a, a0:N

(N.div2 a =? a0) = false -> (N.succ_double a0 =? a) = false
a, a0:N
H:(N.div2 a =? a0) = false

(N.succ_double a0 =? a) = false
a, a0:N
H:N.div2 a <> a0

N.succ_double a0 <> a
a, a0:N
H:N.succ_double a0 = a

N.div2 a = a0
a0:N

N.div2 (N.succ_double a0) = a0
apply N.div2_succ_double. Qed.
a, a':N

N.odd a = false -> N.odd a' = true -> (a =? a') = false
a, a':N

N.odd a = false -> N.odd a' = true -> (a =? a') = false
a, a':N
H:N.odd a = false
H0:N.odd a' = true

(a =? a') = false
a, a':N
H:N.odd a <> true
H0:N.odd a' = true

a <> a'
now intros <-. Qed.
a, a':N

(a =? a') = true -> (N.div2 a =? N.div2 a') = true
a, a':N

(a =? a') = true -> (N.div2 a =? N.div2 a') = true
a, a':N
H:(a =? a') = true

(N.div2 a =? N.div2 a') = true
a, a':N
H:a = a'

N.div2 a = N.div2 a'
now subst. Qed.
a, a':N

(N.div2 a =? N.div2 a') = false -> (a =? a') = false
a, a':N

(N.div2 a =? N.div2 a') = false -> (a =? a') = false
a, a':N
H:(N.div2 a =? N.div2 a') = false

(a =? a') = false
a, a':N
H:N.div2 a <> N.div2 a'

a <> a'
a, a':N
H:a = a'

N.div2 a = N.div2 a'
now subst. Qed.
a, a':N

N.odd a = N.odd a' -> N.div2 a = N.div2 a' -> a = a'
a, a':N

N.odd a = N.odd a' -> N.div2 a = N.div2 a' -> a = a'
intros H H'; now rewrite (N.div2_odd a), (N.div2_odd a'), H, H'. Qed.
a, a':N

(a =? a') = false -> N.odd a = N.odd a' -> (N.div2 a =? N.div2 a') = false
a, a':N

(a =? a') = false -> N.odd a = N.odd a' -> (N.div2 a =? N.div2 a') = false
a, a':N
H:(a =? a') = false
H':N.odd a = N.odd a'

(N.div2 a =? N.div2 a') = false
a, a':N
H:a <> a'
H':N.odd a = N.odd a'

N.div2 a <> N.div2 a'
a, a':N
H':N.odd a = N.odd a'
H:N.div2 a = N.div2 a'

a = a'
now apply Ndiv2_bit_eq. Qed.
a, a':N

(a =? a') = false -> N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = false
a, a':N

(a =? a') = false -> N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = false
a, a':N
H:(a =? a') = false

N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = false
a, a':N
H:(a =? a') = false
H0:N.odd a = N.odd a'

N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = false
a, a':N
H:(a =? a') = false
H0:N.odd a = negb (N.odd a')
N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = false
a, a':N
H:(a =? a') = false
N.odd a = N.odd a' \/ N.odd a = negb (N.odd a')
a, a':N
H:(a =? a') = false
H0:N.odd a = N.odd a'

N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = false
a, a':N
H:(a =? a') = false
H0:N.odd a = N.odd a'

(N.div2 a =? N.div2 a') = false
apply Ndiv2_bit_neq; assumption.
a, a':N
H:(a =? a') = false
H0:N.odd a = negb (N.odd a')

N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = false
a, a':N
H:(a =? a') = false
H0:N.odd a = negb (N.odd a')

N.odd a = negb (N.odd a')
assumption.
a, a':N
H:(a =? a') = false

N.odd a = N.odd a' \/ N.odd a = negb (N.odd a')
case (N.odd a), (N.odd a'); auto. Qed.
a:N

({a0 : N | a = N.double a0} + {a1 : N | a = N.succ_double a1})%type
a:N

({a0 : N | a = N.double a0} + {a1 : N | a = N.succ_double a1})%type
elim (sumbool_of_bool (N.odd a)); intros H; [right|left]; exists (N.div2 a); symmetry; apply Ndiv2_double_plus_one || apply Ndiv2_double; auto. Qed.
An inefficient boolean order on N. Please use N.leb instead now.
Definition Nleb (a b:N) := leb (N.to_nat a) (N.to_nat b).

a, b:N

Nleb a b = (a <=? b)
a, b:N

Nleb a b = (a <=? b)
a, b:N

(N.to_nat a <=? N.to_nat b)%nat = (a <=? b)
now rewrite eq_iff_eq_true, N.leb_le, leb_compare, <- N2Nat.inj_compare. Qed.
a, b:N

Nleb a b = true <-> a <= b
a, b:N

Nleb a b = true <-> a <= b
now rewrite Nleb_alt, N.leb_le. Qed.
a:N

Nleb a a = true
a:N

Nleb a a = true
rewrite Nleb_Nle; apply N.le_refl. Qed.
a, b:N

Nleb a b = true -> Nleb b a = true -> a = b
a, b:N

Nleb a b = true -> Nleb b a = true -> a = b
a, b:N

a <= b -> b <= a -> a = b
apply N.le_antisymm. Qed.
a, b, c:N

Nleb a b = true -> Nleb b c = true -> Nleb a c = true
a, b, c:N

Nleb a b = true -> Nleb b c = true -> Nleb a c = true
a, b, c:N

a <= b -> b <= c -> a <= c
apply N.le_trans. Qed.
a, b, c:N

Nleb a b = true -> Nleb c b = false -> Nleb c a = false
a, b, c:N

Nleb a b = true -> Nleb c b = false -> Nleb c a = false
a, b, c:N

(N.to_nat a <=? N.to_nat b)%nat = true -> (N.to_nat c <=? N.to_nat b)%nat = false -> (N.to_nat c <=? N.to_nat a)%nat = false
a, b, c:N
H:(N.to_nat a <=? N.to_nat b)%nat = true
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat c <=? N.to_nat a)%nat = false
a, b, c:N
H:(N.to_nat a <=? N.to_nat b)%nat = true
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat a < N.to_nat c)%nat
a, b, c:N
H:(N.to_nat a <=? N.to_nat b)%nat = true
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat a <= N.to_nat b)%nat
a, b, c:N
H:(N.to_nat a <=? N.to_nat b)%nat = true
H0:(N.to_nat c <=? N.to_nat b)%nat = false
(N.to_nat b < N.to_nat c)%nat
a, b, c:N
H:(N.to_nat a <=? N.to_nat b)%nat = true
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat a <=? N.to_nat b)%nat = true
a, b, c:N
H:(N.to_nat a <=? N.to_nat b)%nat = true
H0:(N.to_nat c <=? N.to_nat b)%nat = false
(N.to_nat b < N.to_nat c)%nat
a, b, c:N
H:(N.to_nat a <=? N.to_nat b)%nat = true
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat b < N.to_nat c)%nat
a, b, c:N
H:(N.to_nat a <=? N.to_nat b)%nat = true
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat c <=? N.to_nat b)%nat = false
assumption. Qed.
a, b, c:N

Nleb b a = false -> Nleb b c = true -> Nleb c a = false
a, b, c:N

Nleb b a = false -> Nleb b c = true -> Nleb c a = false
a, b, c:N

(N.to_nat b <=? N.to_nat a)%nat = false -> (N.to_nat b <=? N.to_nat c)%nat = true -> (N.to_nat c <=? N.to_nat a)%nat = false
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat b <=? N.to_nat c)%nat = true

(N.to_nat c <=? N.to_nat a)%nat = false
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat b <=? N.to_nat c)%nat = true

(N.to_nat a < N.to_nat c)%nat
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat b <=? N.to_nat c)%nat = true

(N.to_nat a < N.to_nat b)%nat
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat b <=? N.to_nat c)%nat = true
(N.to_nat b <= N.to_nat c)%nat
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat b <=? N.to_nat c)%nat = true

(N.to_nat b <=? N.to_nat a)%nat = false
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat b <=? N.to_nat c)%nat = true
(N.to_nat b <= N.to_nat c)%nat
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat b <=? N.to_nat c)%nat = true

(N.to_nat b <= N.to_nat c)%nat
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat b <=? N.to_nat c)%nat = true

(N.to_nat b <=? N.to_nat c)%nat = true
assumption. Qed.
a, b, c:N

Nleb b a = false -> Nleb c b = false -> Nleb c a = false
a, b, c:N

Nleb b a = false -> Nleb c b = false -> Nleb c a = false
a, b, c:N

(N.to_nat b <=? N.to_nat a)%nat = false -> (N.to_nat c <=? N.to_nat b)%nat = false -> (N.to_nat c <=? N.to_nat a)%nat = false
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat c <=? N.to_nat a)%nat = false
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat a < N.to_nat c)%nat
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat a < N.to_nat b)%nat
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat c <=? N.to_nat b)%nat = false
(N.to_nat b < N.to_nat c)%nat
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat b <=? N.to_nat a)%nat = false
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat c <=? N.to_nat b)%nat = false
(N.to_nat b < N.to_nat c)%nat
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat b < N.to_nat c)%nat
a, b, c:N
H:(N.to_nat b <=? N.to_nat a)%nat = false
H0:(N.to_nat c <=? N.to_nat b)%nat = false

(N.to_nat c <=? N.to_nat b)%nat = false
assumption. Qed.
a, b:N

Nleb b a = false -> Nleb a b = true
a, b:N

Nleb b a = false -> Nleb a b = true
a, b:N

(N.to_nat b <=? N.to_nat a)%nat = false -> (N.to_nat a <=? N.to_nat b)%nat = true
a, b:N
H:(N.to_nat b <=? N.to_nat a)%nat = false

(N.to_nat a <=? N.to_nat b)%nat = true
a, b:N
H:(N.to_nat b <=? N.to_nat a)%nat = false

(N.to_nat a <= N.to_nat b)%nat
a, b:N
H:(N.to_nat b <=? N.to_nat a)%nat = false

(N.to_nat a < N.to_nat b)%nat
a, b:N
H:(N.to_nat b <=? N.to_nat a)%nat = false

(N.to_nat b <=? N.to_nat a)%nat = false
assumption. Qed.
a, b:N

Nleb a b = true -> Nleb (N.double a) (N.double b) = true
a, b:N

Nleb a b = true -> Nleb (N.double a) (N.double b) = true
a, b:N

(N.to_nat a <=? N.to_nat b)%nat = true -> (N.to_nat (N.double a) <=? N.to_nat (N.double b))%nat = true
a, b:N
H:(N.to_nat a <=? N.to_nat b)%nat = true

(N.to_nat (N.double a) <=? N.to_nat (N.double b))%nat = true
a, b:N
H:(N.to_nat a <=? N.to_nat b)%nat = true

(2 * N.to_nat a <=? 2 * N.to_nat b)%nat = true
a, b:N
H:(N.to_nat a <=? N.to_nat b)%nat = true

(2 * N.to_nat a <= 2 * N.to_nat b)%nat
a, b:N
H:(N.to_nat a <=? N.to_nat b)%nat = true

(N.to_nat a <= N.to_nat b)%nat
now apply leb_complete. Qed.
a, b:N

Nleb a b = true -> Nleb (N.succ_double a) (N.succ_double b) = true
a, b:N

Nleb a b = true -> Nleb (N.succ_double a) (N.succ_double b) = true
a, b:N

(N.to_nat a <=? N.to_nat b)%nat = true -> (N.to_nat (N.succ_double a) <=? N.to_nat (N.succ_double b))%nat = true
a, b:N
H:(N.to_nat a <=? N.to_nat b)%nat = true

(N.to_nat (N.succ_double a) <=? N.to_nat (N.succ_double b))%nat = true
a, b:N
H:(N.to_nat a <=? N.to_nat b)%nat = true

(S (2 * N.to_nat a) <=? S (2 * N.to_nat b))%nat = true
a, b:N
H:(N.to_nat a <=? N.to_nat b)%nat = true

(S (2 * N.to_nat a) <= S (2 * N.to_nat b))%nat
a, b:N
H:(N.to_nat a <=? N.to_nat b)%nat = true

(N.to_nat a <= N.to_nat b)%nat
now apply leb_complete. Qed.
a, b:N

Nleb (N.double a) (N.double b) = true -> Nleb a b = true
a, b:N

Nleb (N.double a) (N.double b) = true -> Nleb a b = true
a, b:N

(N.to_nat (N.double a) <=? N.to_nat (N.double b))%nat = true -> (N.to_nat a <=? N.to_nat b)%nat = true
a, b:N

(2 * N.to_nat a <=? 2 * N.to_nat b)%nat = true -> (N.to_nat a <=? N.to_nat b)%nat = true
a, b:N
H:(2 * N.to_nat a <=? 2 * N.to_nat b)%nat = true

(N.to_nat a <=? N.to_nat b)%nat = true
a, b:N
H:(2 * N.to_nat a <=? 2 * N.to_nat b)%nat = true

(N.to_nat a <= N.to_nat b)%nat
a, b:N
H:(2 * N.to_nat a <=? 2 * N.to_nat b)%nat = true

(2 * N.to_nat a <= 2 * N.to_nat b)%nat
now apply leb_complete. Qed.
a, b:N

Nleb (N.succ_double a) (N.succ_double b) = true -> Nleb a b = true
a, b:N

Nleb (N.succ_double a) (N.succ_double b) = true -> Nleb a b = true
a, b:N

(N.to_nat (N.succ_double a) <=? N.to_nat (N.succ_double b))%nat = true -> (N.to_nat a <=? N.to_nat b)%nat = true
a, b:N

(S (2 * N.to_nat a) <=? S (2 * N.to_nat b))%nat = true -> (N.to_nat a <=? N.to_nat b)%nat = true
a, b:N
H:(S (2 * N.to_nat a) <=? S (2 * N.to_nat b))%nat = true

(N.to_nat a <=? N.to_nat b)%nat = true
a, b:N
H:(S (2 * N.to_nat a) <=? S (2 * N.to_nat b))%nat = true

(N.to_nat a <= N.to_nat b)%nat
a, b:N
H:(S (2 * N.to_nat a) <=? S (2 * N.to_nat b))%nat = true

(2 * N.to_nat a <= 2 * N.to_nat b)%nat
a, b:N
H:(S (2 * N.to_nat a) <=? S (2 * N.to_nat b))%nat = true

(S (2 * N.to_nat a) <= S (2 * N.to_nat b))%nat
now apply leb_complete. Qed.
a, b:N

Nleb a b = false -> Nleb (N.double a) (N.double b) = false
a, b:N

Nleb a b = false -> Nleb (N.double a) (N.double b) = false
a, b:N
H:Nleb a b = false

Nleb (N.double a) (N.double b) = false
a, b:N
H:Nleb a b = false

Nleb (N.double a) (N.double b) = true -> Nleb (N.double a) (N.double b) = false
a, b:N
H:Nleb a b = false
Nleb (N.double a) (N.double b) = false -> Nleb (N.double a) (N.double b) = false
a, b:N
H:Nleb a b = false
H0:Nleb (N.double a) (N.double b) = true

Nleb (N.double a) (N.double b) = false
a, b:N
H:Nleb a b = false
Nleb (N.double a) (N.double b) = false -> Nleb (N.double a) (N.double b) = false
a, b:N
H:true = false
H0:Nleb (N.double a) (N.double b) = true

Nleb (N.double a) (N.double b) = false
a, b:N
H:Nleb a b = false
Nleb (N.double a) (N.double b) = false -> Nleb (N.double a) (N.double b) = false
a, b:N
H:Nleb a b = false

Nleb (N.double a) (N.double b) = false -> Nleb (N.double a) (N.double b) = false
trivial. Qed.
a, b:N

Nleb a b = false -> Nleb (N.succ_double a) (N.succ_double b) = false
a, b:N

Nleb a b = false -> Nleb (N.succ_double a) (N.succ_double b) = false
a, b:N
H:Nleb a b = false

Nleb (N.succ_double a) (N.succ_double b) = false
a, b:N
H:Nleb a b = false

Nleb (N.succ_double a) (N.succ_double b) = true -> Nleb (N.succ_double a) (N.succ_double b) = false
a, b:N
H:Nleb a b = false
Nleb (N.succ_double a) (N.succ_double b) = false -> Nleb (N.succ_double a) (N.succ_double b) = false
a, b:N
H:Nleb a b = false
H0:Nleb (N.succ_double a) (N.succ_double b) = true

Nleb (N.succ_double a) (N.succ_double b) = false
a, b:N
H:Nleb a b = false
Nleb (N.succ_double a) (N.succ_double b) = false -> Nleb (N.succ_double a) (N.succ_double b) = false
a, b:N
H:true = false
H0:Nleb (N.succ_double a) (N.succ_double b) = true

Nleb (N.succ_double a) (N.succ_double b) = false
a, b:N
H:Nleb a b = false
Nleb (N.succ_double a) (N.succ_double b) = false -> Nleb (N.succ_double a) (N.succ_double b) = false
a, b:N
H:Nleb a b = false

Nleb (N.succ_double a) (N.succ_double b) = false -> Nleb (N.succ_double a) (N.succ_double b) = false
trivial. Qed.
a, b:N

Nleb (N.double a) (N.double b) = false -> Nleb a b = false
a, b:N

Nleb (N.double a) (N.double b) = false -> Nleb a b = false
a, b:N
H:Nleb (N.double a) (N.double b) = false

Nleb a b = false
a, b:N
H:Nleb (N.double a) (N.double b) = false

Nleb a b = true -> Nleb a b = false
a, b:N
H:Nleb (N.double a) (N.double b) = false
Nleb a b = false -> Nleb a b = false
a, b:N
H:Nleb (N.double a) (N.double b) = false
H0:Nleb a b = true

Nleb a b = false
a, b:N
H:Nleb (N.double a) (N.double b) = false
Nleb a b = false -> Nleb a b = false
a, b:N
H:true = false
H0:Nleb a b = true

Nleb a b = false
a, b:N
H:Nleb (N.double a) (N.double b) = false
Nleb a b = false -> Nleb a b = false
a, b:N
H:Nleb (N.double a) (N.double b) = false

Nleb a b = false -> Nleb a b = false
trivial. Qed.
a, b:N

Nleb (N.succ_double a) (N.succ_double b) = false -> Nleb a b = false
a, b:N

Nleb (N.succ_double a) (N.succ_double b) = false -> Nleb a b = false
a, b:N
H:Nleb (N.succ_double a) (N.succ_double b) = false

Nleb a b = false
a, b:N
H:Nleb (N.succ_double a) (N.succ_double b) = false

Nleb a b = true -> Nleb a b = false
a, b:N
H:Nleb (N.succ_double a) (N.succ_double b) = false
Nleb a b = false -> Nleb a b = false
a, b:N
H:Nleb (N.succ_double a) (N.succ_double b) = false
H0:Nleb a b = true

Nleb a b = false
a, b:N
H:Nleb (N.succ_double a) (N.succ_double b) = false
Nleb a b = false -> Nleb a b = false
a, b:N
H:true = false
H0:Nleb a b = true

Nleb a b = false
a, b:N
H:Nleb (N.succ_double a) (N.succ_double b) = false
Nleb a b = false -> Nleb a b = false
a, b:N
H:Nleb (N.succ_double a) (N.succ_double b) = false

Nleb a b = false -> Nleb a b = false
trivial. Qed. (* Nleb and N.compare *) (* NB: No need to prove that Nleb a b = true <-> N.compare a b <> Gt, this statement is in fact Nleb_Nle! *)
a, b:N

Nleb a b = false <-> (a ?= b) = Gt
a, b:N

Nleb a b = false <-> (a ?= b) = Gt
now rewrite N.compare_nle_iff, <- Nleb_Nle, not_true_iff_false. Qed.
a, b:N

(a ?= b) = Gt -> Nleb a b = false
a, b:N

(a ?= b) = Gt -> Nleb a b = false
apply <- Nltb_Ncompare; auto. Qed.
a, b:N

(a ?= b) = Lt -> Nleb b a = false
a, b:N

(a ?= b) = Lt -> Nleb b a = false
a, b:N
H:(a ?= b) = Lt

Nleb b a = false
rewrite Nltb_Ncompare, N.compare_antisym, H; auto. Qed. (* Old results about [N.min] *) Notation Nmin_choice := N.min_dec (only parsing).
a, b:N

Nleb (N.min a b) a = true
a, b:N

Nleb (N.min a b) a = true
a, b:N

N.min a b <= a
apply N.le_min_l. Qed.
a, b:N

Nleb (N.min a b) b = true
a, b:N

Nleb (N.min a b) b = true
a, b:N

N.min a b <= b
apply N.le_min_r. Qed.
a, b, c:N

Nleb a (N.min b c) = true -> Nleb a b = true
a, b, c:N

Nleb a (N.min b c) = true -> Nleb a b = true
a, b, c:N

a <= N.min b c -> a <= b
apply N.min_glb_l. Qed.
a, b, c:N

Nleb a (N.min b c) = true -> Nleb a c = true
a, b, c:N

Nleb a (N.min b c) = true -> Nleb a c = true
a, b, c:N

a <= N.min b c -> a <= c
apply N.min_glb_r. Qed.
a, b, c:N

Nleb a b = true -> Nleb a c = true -> Nleb a (N.min b c) = true
a, b, c:N

Nleb a b = true -> Nleb a c = true -> Nleb a (N.min b c) = true
a, b, c:N

a <= b -> a <= c -> a <= N.min b c
apply N.min_glb. Qed.
a, b, c:N

Nleb (N.min b c) a = false -> Nleb b a = false
a, b, c:N

Nleb (N.min b c) a = false -> Nleb b a = false
a, b, c:N

~ N.min b c <= a -> ~ b <= a
rewrite N.min_le_iff; auto. Qed.
a, b, c:N

Nleb (N.min b c) a = false -> Nleb c a = false
a, b, c:N

Nleb (N.min b c) a = false -> Nleb c a = false
a, b, c:N

~ N.min b c <= a -> ~ c <= a
rewrite N.min_le_iff; auto. Qed.