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'now apply Pos.eqb_eq. Qed.p, p':positive(p =? p')%positive = true -> p = p'p, p':positive(p =? p')%positive = true -> (p ?= p')%positive = Eqnow rewrite Pos.compare_eq_iff, <- Pos.eqb_eq. Qed.p, p':positive(p =? p')%positive = true -> (p ?= p')%positive = Eqp, p':positive(p ?= p')%positive = Eq -> (p =? p')%positive = truenow rewrite Pos.eqb_eq, <- Pos.compare_eq_iff. Qed.p, p':positive(p ?= p')%positive = Eq -> (p =? p')%positive = truen, n':N(n =? n') = true -> (n ?= n') = Eqnow rewrite N.compare_eq_iff, <- N.eqb_eq. Qed.n, n':N(n =? n') = true -> (n ?= n') = Eqn, n':N(n ?= n') = Eq -> (n =? n') = truenow rewrite N.eqb_eq, <- N.compare_eq_iff. Qed.n, n':N(n ?= n') = Eq -> (n =? n') = truen, n':N(n =? n') = true -> n = n'now apply N.eqb_eq. Qed.n, n':N(n =? n') = true -> n = n'n, n':NN.lxor n n' = 0 -> (n =? n') = truen, n':NN.lxor n n' = 0 -> (n =? n') = truen, n':NH:N.lxor n n' = 0(n =? n') = truen, n':NH:n = n'(n =? n') = trueapply N.eqb_refl. Qed. Ltac eqb2eq := rewrite <- ?not_true_iff_false in *; rewrite ?N.eqb_eq in *.n':N(n' =? n') = truen, n':Np:positiveN.lxor n n' = N.pos p -> (n =? n') = falsen, n':Np:positiveN.lxor n n' = N.pos p -> (n =? n') = falsen, n':Np:positiveH:N.lxor n n' = N.pos p(n =? n') = falsen, n':Np:positiveH:N.lxor n n' = N.pos pn <> n'n, n':Np:positiveH:N.lxor n n' = N.pos pH0:n = n'Falsenow rewrite N.lxor_nilpotent in *. Qed.n':Np:positiveH:N.lxor n' n' = N.pos pFalsea:NNodd a -> forall a0 : N, (N.double a0 =? a) = falsea:NNodd a -> forall a0 : N, (N.double a0 =? a) = falsea:NH:Nodd aa0:N(N.double a0 =? a) = falsea:NH:Nodd aa0:NN.double a0 <> aa0:NH:Nodd (N.double a0)Falsenow rewrite Ndouble_bit0 in *. Qed.a0:NH:N.odd (N.double a0) = trueFalsea, a0:N(N.div2 a =? a0) = false -> (a =? N.double a0) = falsea, a0:N(N.div2 a =? a0) = false -> (a =? N.double a0) = falsea, a0:NH:(N.div2 a =? a0) = false(a =? N.double a0) = falsea, a0:NH:N.div2 a <> a0a <> N.double a0a, a0:NH:a = N.double a0N.div2 a = a0apply N.div2_double. Qed.a0:NN.div2 (N.double a0) = a0a:NNeven a -> forall a0 : N, (N.succ_double a0 =? a) = falsea:NNeven a -> forall a0 : N, (N.succ_double a0 =? a) = falsea:NH:Neven aa0:N(N.succ_double a0 =? a) = falsea:NH:Neven aa0:NN.succ_double a0 <> aa0:NH:Neven (N.succ_double a0)Falsenow rewrite Ndouble_plus_one_bit0 in *. Qed.a0:NH:N.odd (N.succ_double a0) = falseFalsea, a0:N(N.div2 a =? a0) = false -> (N.succ_double a0 =? a) = falsea, a0:N(N.div2 a =? a0) = false -> (N.succ_double a0 =? a) = falsea, a0:NH:(N.div2 a =? a0) = false(N.succ_double a0 =? a) = falsea, a0:NH:N.div2 a <> a0N.succ_double a0 <> aa, a0:NH:N.succ_double a0 = aN.div2 a = a0apply N.div2_succ_double. Qed.a0:NN.div2 (N.succ_double a0) = a0a, a':NN.odd a = false -> N.odd a' = true -> (a =? a') = falsea, a':NN.odd a = false -> N.odd a' = true -> (a =? a') = falsea, a':NH:N.odd a = falseH0:N.odd a' = true(a =? a') = falsenow intros <-. Qed.a, a':NH:N.odd a <> trueH0:N.odd a' = truea <> a'a, a':N(a =? a') = true -> (N.div2 a =? N.div2 a') = truea, a':N(a =? a') = true -> (N.div2 a =? N.div2 a') = truea, a':NH:(a =? a') = true(N.div2 a =? N.div2 a') = truenow subst. Qed.a, a':NH:a = a'N.div2 a = N.div2 a'a, a':N(N.div2 a =? N.div2 a') = false -> (a =? a') = falsea, a':N(N.div2 a =? N.div2 a') = false -> (a =? a') = falsea, a':NH:(N.div2 a =? N.div2 a') = false(a =? a') = falsea, a':NH:N.div2 a <> N.div2 a'a <> a'now subst. Qed.a, a':NH:a = a'N.div2 a = N.div2 a'a, a':NN.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':NN.odd a = N.odd a' -> N.div2 a = N.div2 a' -> a = a'a, a':N(a =? a') = false -> N.odd a = N.odd a' -> (N.div2 a =? N.div2 a') = falsea, a':N(a =? a') = false -> N.odd a = N.odd a' -> (N.div2 a =? N.div2 a') = falsea, a':NH:(a =? a') = falseH':N.odd a = N.odd a'(N.div2 a =? N.div2 a') = falsea, a':NH:a <> a'H':N.odd a = N.odd a'N.div2 a <> N.div2 a'now apply Ndiv2_bit_eq. Qed.a, a':NH':N.odd a = N.odd a'H:N.div2 a = N.div2 a'a = a'a, a':N(a =? a') = false -> N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = falsea, a':N(a =? a') = false -> N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = falsea, a':NH:(a =? a') = falseN.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = falsea, a':NH:(a =? a') = falseH0:N.odd a = N.odd a'N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = falsea, a':NH:(a =? a') = falseH0:N.odd a = negb (N.odd a')N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = falsea, a':NH:(a =? a') = falseN.odd a = N.odd a' \/ N.odd a = negb (N.odd a')a, a':NH:(a =? a') = falseH0:N.odd a = N.odd a'N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = falseapply Ndiv2_bit_neq; assumption.a, a':NH:(a =? a') = falseH0:N.odd a = N.odd a'(N.div2 a =? N.div2 a') = falsea, a':NH:(a =? a') = falseH0:N.odd a = negb (N.odd a')N.odd a = negb (N.odd a') \/ (N.div2 a =? N.div2 a') = falseassumption.a, a':NH:(a =? a') = falseH0:N.odd a = negb (N.odd a')N.odd a = negb (N.odd a')case (N.odd a), (N.odd a'); auto. Qed.a, a':NH:(a =? a') = falseN.odd a = N.odd a' \/ N.odd a = negb (N.odd a')a:N({a0 : N | a = N.double a0} + {a1 : N | a = N.succ_double a1})%typeelim (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.a:N({a0 : N | a = N.double a0} + {a1 : N | a = N.succ_double a1})%type
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:NNleb a b = (a <=? b)a, b:NNleb a b = (a <=? b)now rewrite eq_iff_eq_true, N.leb_le, leb_compare, <- N2Nat.inj_compare. Qed.a, b:N(N.to_nat a <=? N.to_nat b)%nat = (a <=? b)a, b:NNleb a b = true <-> a <= bnow rewrite Nleb_alt, N.leb_le. Qed.a, b:NNleb a b = true <-> a <= ba:NNleb a a = truerewrite Nleb_Nle; apply N.le_refl. Qed.a:NNleb a a = truea, b:NNleb a b = true -> Nleb b a = true -> a = ba, b:NNleb a b = true -> Nleb b a = true -> a = bapply N.le_antisymm. Qed.a, b:Na <= b -> b <= a -> a = ba, b, c:NNleb a b = true -> Nleb b c = true -> Nleb a c = truea, b, c:NNleb a b = true -> Nleb b c = true -> Nleb a c = trueapply N.le_trans. Qed.a, b, c:Na <= b -> b <= c -> a <= ca, b, c:NNleb a b = true -> Nleb c b = false -> Nleb c a = falsea, b, c:NNleb a b = true -> Nleb c b = false -> Nleb c a = falsea, 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 = falsea, b, c:NH:(N.to_nat a <=? N.to_nat b)%nat = trueH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat c <=? N.to_nat a)%nat = falsea, b, c:NH:(N.to_nat a <=? N.to_nat b)%nat = trueH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat a < N.to_nat c)%nata, b, c:NH:(N.to_nat a <=? N.to_nat b)%nat = trueH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat a <= N.to_nat b)%nata, b, c:NH:(N.to_nat a <=? N.to_nat b)%nat = trueH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat b < N.to_nat c)%nata, b, c:NH:(N.to_nat a <=? N.to_nat b)%nat = trueH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat a <=? N.to_nat b)%nat = truea, b, c:NH:(N.to_nat a <=? N.to_nat b)%nat = trueH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat b < N.to_nat c)%nata, b, c:NH:(N.to_nat a <=? N.to_nat b)%nat = trueH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat b < N.to_nat c)%natassumption. Qed.a, b, c:NH:(N.to_nat a <=? N.to_nat b)%nat = trueH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat c <=? N.to_nat b)%nat = falsea, b, c:NNleb b a = false -> Nleb b c = true -> Nleb c a = falsea, b, c:NNleb b a = false -> Nleb b c = true -> Nleb c a = falsea, 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 = falsea, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat b <=? N.to_nat c)%nat = true(N.to_nat c <=? N.to_nat a)%nat = falsea, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat b <=? N.to_nat c)%nat = true(N.to_nat a < N.to_nat c)%nata, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat b <=? N.to_nat c)%nat = true(N.to_nat a < N.to_nat b)%nata, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat b <=? N.to_nat c)%nat = true(N.to_nat b <= N.to_nat c)%nata, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat b <=? N.to_nat c)%nat = true(N.to_nat b <=? N.to_nat a)%nat = falsea, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat b <=? N.to_nat c)%nat = true(N.to_nat b <= N.to_nat c)%nata, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat b <=? N.to_nat c)%nat = true(N.to_nat b <= N.to_nat c)%natassumption. Qed.a, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat b <=? N.to_nat c)%nat = true(N.to_nat b <=? N.to_nat c)%nat = truea, b, c:NNleb b a = false -> Nleb c b = false -> Nleb c a = falsea, b, c:NNleb b a = false -> Nleb c b = false -> Nleb c a = falsea, 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 = falsea, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat c <=? N.to_nat a)%nat = falsea, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat a < N.to_nat c)%nata, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat a < N.to_nat b)%nata, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat b < N.to_nat c)%nata, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat b <=? N.to_nat a)%nat = falsea, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat b < N.to_nat c)%nata, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat b < N.to_nat c)%natassumption. Qed.a, b, c:NH:(N.to_nat b <=? N.to_nat a)%nat = falseH0:(N.to_nat c <=? N.to_nat b)%nat = false(N.to_nat c <=? N.to_nat b)%nat = falsea, b:NNleb b a = false -> Nleb a b = truea, b:NNleb b a = false -> Nleb a b = truea, b:N(N.to_nat b <=? N.to_nat a)%nat = false -> (N.to_nat a <=? N.to_nat b)%nat = truea, b:NH:(N.to_nat b <=? N.to_nat a)%nat = false(N.to_nat a <=? N.to_nat b)%nat = truea, b:NH:(N.to_nat b <=? N.to_nat a)%nat = false(N.to_nat a <= N.to_nat b)%nata, b:NH:(N.to_nat b <=? N.to_nat a)%nat = false(N.to_nat a < N.to_nat b)%natassumption. Qed.a, b:NH:(N.to_nat b <=? N.to_nat a)%nat = false(N.to_nat b <=? N.to_nat a)%nat = falsea, b:NNleb a b = true -> Nleb (N.double a) (N.double b) = truea, b:NNleb a b = true -> Nleb (N.double a) (N.double b) = truea, 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 = truea, b:NH:(N.to_nat a <=? N.to_nat b)%nat = true(N.to_nat (N.double a) <=? N.to_nat (N.double b))%nat = truea, b:NH:(N.to_nat a <=? N.to_nat b)%nat = true(2 * N.to_nat a <=? 2 * N.to_nat b)%nat = truea, b:NH:(N.to_nat a <=? N.to_nat b)%nat = true(2 * N.to_nat a <= 2 * N.to_nat b)%natnow apply leb_complete. Qed.a, b:NH:(N.to_nat a <=? N.to_nat b)%nat = true(N.to_nat a <= N.to_nat b)%nata, b:NNleb a b = true -> Nleb (N.succ_double a) (N.succ_double b) = truea, b:NNleb a b = true -> Nleb (N.succ_double a) (N.succ_double b) = truea, 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 = truea, b:NH:(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 = truea, b:NH:(N.to_nat a <=? N.to_nat b)%nat = true(S (2 * N.to_nat a) <=? S (2 * N.to_nat b))%nat = truea, b:NH:(N.to_nat a <=? N.to_nat b)%nat = true(S (2 * N.to_nat a) <= S (2 * N.to_nat b))%natnow apply leb_complete. Qed.a, b:NH:(N.to_nat a <=? N.to_nat b)%nat = true(N.to_nat a <= N.to_nat b)%nata, b:NNleb (N.double a) (N.double b) = true -> Nleb a b = truea, b:NNleb (N.double a) (N.double b) = true -> Nleb a b = truea, 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 = truea, b:N(2 * N.to_nat a <=? 2 * N.to_nat b)%nat = true -> (N.to_nat a <=? N.to_nat b)%nat = truea, b:NH:(2 * N.to_nat a <=? 2 * N.to_nat b)%nat = true(N.to_nat a <=? N.to_nat b)%nat = truea, b:NH:(2 * N.to_nat a <=? 2 * N.to_nat b)%nat = true(N.to_nat a <= N.to_nat b)%natnow apply leb_complete. Qed.a, b:NH:(2 * N.to_nat a <=? 2 * N.to_nat b)%nat = true(2 * N.to_nat a <= 2 * N.to_nat b)%nata, b:NNleb (N.succ_double a) (N.succ_double b) = true -> Nleb a b = truea, b:NNleb (N.succ_double a) (N.succ_double b) = true -> Nleb a b = truea, 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 = truea, 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 = truea, b:NH:(S (2 * N.to_nat a) <=? S (2 * N.to_nat b))%nat = true(N.to_nat a <=? N.to_nat b)%nat = truea, b:NH:(S (2 * N.to_nat a) <=? S (2 * N.to_nat b))%nat = true(N.to_nat a <= N.to_nat b)%nata, b:NH:(S (2 * N.to_nat a) <=? S (2 * N.to_nat b))%nat = true(2 * N.to_nat a <= 2 * N.to_nat b)%natnow apply leb_complete. Qed.a, b:NH:(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))%nata, b:NNleb a b = false -> Nleb (N.double a) (N.double b) = falsea, b:NNleb a b = false -> Nleb (N.double a) (N.double b) = falsea, b:NH:Nleb a b = falseNleb (N.double a) (N.double b) = falsea, b:NH:Nleb a b = falseNleb (N.double a) (N.double b) = true -> Nleb (N.double a) (N.double b) = falsea, b:NH:Nleb a b = falseNleb (N.double a) (N.double b) = false -> Nleb (N.double a) (N.double b) = falsea, b:NH:Nleb a b = falseH0:Nleb (N.double a) (N.double b) = trueNleb (N.double a) (N.double b) = falsea, b:NH:Nleb a b = falseNleb (N.double a) (N.double b) = false -> Nleb (N.double a) (N.double b) = falsea, b:NH:true = falseH0:Nleb (N.double a) (N.double b) = trueNleb (N.double a) (N.double b) = falsea, b:NH:Nleb a b = falseNleb (N.double a) (N.double b) = false -> Nleb (N.double a) (N.double b) = falsetrivial. Qed.a, b:NH:Nleb a b = falseNleb (N.double a) (N.double b) = false -> Nleb (N.double a) (N.double b) = falsea, b:NNleb a b = false -> Nleb (N.succ_double a) (N.succ_double b) = falsea, b:NNleb a b = false -> Nleb (N.succ_double a) (N.succ_double b) = falsea, b:NH:Nleb a b = falseNleb (N.succ_double a) (N.succ_double b) = falsea, b:NH:Nleb a b = falseNleb (N.succ_double a) (N.succ_double b) = true -> Nleb (N.succ_double a) (N.succ_double b) = falsea, b:NH:Nleb a b = falseNleb (N.succ_double a) (N.succ_double b) = false -> Nleb (N.succ_double a) (N.succ_double b) = falsea, b:NH:Nleb a b = falseH0:Nleb (N.succ_double a) (N.succ_double b) = trueNleb (N.succ_double a) (N.succ_double b) = falsea, b:NH:Nleb a b = falseNleb (N.succ_double a) (N.succ_double b) = false -> Nleb (N.succ_double a) (N.succ_double b) = falsea, b:NH:true = falseH0:Nleb (N.succ_double a) (N.succ_double b) = trueNleb (N.succ_double a) (N.succ_double b) = falsea, b:NH:Nleb a b = falseNleb (N.succ_double a) (N.succ_double b) = false -> Nleb (N.succ_double a) (N.succ_double b) = falsetrivial. Qed.a, b:NH:Nleb a b = falseNleb (N.succ_double a) (N.succ_double b) = false -> Nleb (N.succ_double a) (N.succ_double b) = falsea, b:NNleb (N.double a) (N.double b) = false -> Nleb a b = falsea, b:NNleb (N.double a) (N.double b) = false -> Nleb a b = falsea, b:NH:Nleb (N.double a) (N.double b) = falseNleb a b = falsea, b:NH:Nleb (N.double a) (N.double b) = falseNleb a b = true -> Nleb a b = falsea, b:NH:Nleb (N.double a) (N.double b) = falseNleb a b = false -> Nleb a b = falsea, b:NH:Nleb (N.double a) (N.double b) = falseH0:Nleb a b = trueNleb a b = falsea, b:NH:Nleb (N.double a) (N.double b) = falseNleb a b = false -> Nleb a b = falsea, b:NH:true = falseH0:Nleb a b = trueNleb a b = falsea, b:NH:Nleb (N.double a) (N.double b) = falseNleb a b = false -> Nleb a b = falsetrivial. Qed.a, b:NH:Nleb (N.double a) (N.double b) = falseNleb a b = false -> Nleb a b = falsea, b:NNleb (N.succ_double a) (N.succ_double b) = false -> Nleb a b = falsea, b:NNleb (N.succ_double a) (N.succ_double b) = false -> Nleb a b = falsea, b:NH:Nleb (N.succ_double a) (N.succ_double b) = falseNleb a b = falsea, b:NH:Nleb (N.succ_double a) (N.succ_double b) = falseNleb a b = true -> Nleb a b = falsea, b:NH:Nleb (N.succ_double a) (N.succ_double b) = falseNleb a b = false -> Nleb a b = falsea, b:NH:Nleb (N.succ_double a) (N.succ_double b) = falseH0:Nleb a b = trueNleb a b = falsea, b:NH:Nleb (N.succ_double a) (N.succ_double b) = falseNleb a b = false -> Nleb a b = falsea, b:NH:true = falseH0:Nleb a b = trueNleb a b = falsea, b:NH:Nleb (N.succ_double a) (N.succ_double b) = falseNleb a b = false -> Nleb a b = falsetrivial. 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:NH:Nleb (N.succ_double a) (N.succ_double b) = falseNleb a b = false -> Nleb a b = falsea, b:NNleb a b = false <-> (a ?= b) = Gtnow rewrite N.compare_nle_iff, <- Nleb_Nle, not_true_iff_false. Qed.a, b:NNleb a b = false <-> (a ?= b) = Gta, b:N(a ?= b) = Gt -> Nleb a b = falseapply <- Nltb_Ncompare; auto. Qed.a, b:N(a ?= b) = Gt -> Nleb a b = falsea, b:N(a ?= b) = Lt -> Nleb b a = falsea, b:N(a ?= b) = Lt -> Nleb b a = falserewrite Nltb_Ncompare, N.compare_antisym, H; auto. Qed. (* Old results about [N.min] *) Notation Nmin_choice := N.min_dec (only parsing).a, b:NH:(a ?= b) = LtNleb b a = falsea, b:NNleb (N.min a b) a = truea, b:NNleb (N.min a b) a = trueapply N.le_min_l. Qed.a, b:NN.min a b <= aa, b:NNleb (N.min a b) b = truea, b:NNleb (N.min a b) b = trueapply N.le_min_r. Qed.a, b:NN.min a b <= ba, b, c:NNleb a (N.min b c) = true -> Nleb a b = truea, b, c:NNleb a (N.min b c) = true -> Nleb a b = trueapply N.min_glb_l. Qed.a, b, c:Na <= N.min b c -> a <= ba, b, c:NNleb a (N.min b c) = true -> Nleb a c = truea, b, c:NNleb a (N.min b c) = true -> Nleb a c = trueapply N.min_glb_r. Qed.a, b, c:Na <= N.min b c -> a <= ca, b, c:NNleb a b = true -> Nleb a c = true -> Nleb a (N.min b c) = truea, b, c:NNleb a b = true -> Nleb a c = true -> Nleb a (N.min b c) = trueapply N.min_glb. Qed.a, b, c:Na <= b -> a <= c -> a <= N.min b ca, b, c:NNleb (N.min b c) a = false -> Nleb b a = falsea, b, c:NNleb (N.min b c) a = false -> Nleb b a = falserewrite N.min_le_iff; auto. Qed.a, b, c:N~ N.min b c <= a -> ~ b <= aa, b, c:NNleb (N.min b c) a = false -> Nleb c a = falsea, b, c:NNleb (N.min b c) a = false -> Nleb c a = falserewrite N.min_le_iff; auto. Qed.a, b, c:N~ N.min b c <= a -> ~ c <= a