Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Spaces.Nat.Core.Local Set Universe Minimization ToSet.LocalClose Scope trunc_scope.LocalOpen Scope nat_scope.(** TODO: The results in this file are in the process of being moved over to Core.v *)(** TODO: move, rename *)
intro l; apply (leq_trans l); exact (leq_add_r m k).Defined.(** This inductive type is defined because it lets you loop from [i = 0] up to [i = n] by structural induction on a proof of [increasing_geq n 0]. With the existing [leq] type and the inductive structure of [n], it is easier and more natural to loop downwards from [i = n] to [i = 0], but harder to find the least natural number in the interval $[0,n]$ satisfying a given property. *)Local Unset Elimination Schemes.Inductiveincreasing_geq (n : nat) : nat -> Type0 :=
| increasing_geq_n : increasing_geq n n
| increasing_geq_S (m : nat) : increasing_geq n m.+1 ->
increasing_geq n m.Schemeincreasing_geq_ind := Induction for increasing_geq SortType.Schemeincreasing_geq_rec := Minimality for increasing_geq SortType.Definitionincreasing_geq_rect := increasing_geq_rec.Local Set Elimination Schemes.
n, m: nat
increasing_geq n m -> increasing_geq n.+1 m.+1
n, m: nat
increasing_geq n m -> increasing_geq n.+1 m.+1
n, m: nat a: increasing_geq n m
increasing_geq n.+1 m.+1
n: nat
increasing_geq n.+1 n.+1
n, m: nat a: increasing_geq n m.+1 IHa: increasing_geq n.+1 m.+2
increasing_geq n.+1 m.+1
n: nat
increasing_geq n.+1 n.+1
constructor.
n, m: nat a: increasing_geq n m.+1 IHa: increasing_geq n.+1 m.+2
increasing_geq n.+1 m.+1
byconstructor.Defined.
n: nat
increasing_geq n 0
n: nat
increasing_geq n 0
increasing_geq 00
n: nat IHn: increasing_geq n 0
increasing_geq n.+10
increasing_geq 00
constructor.
n: nat IHn: increasing_geq n 0
increasing_geq n.+10
n: nat
increasing_geq n.+1 n
n, m: nat IHn: increasing_geq n m.+1 IHIHn: increasing_geq n.+1 m.+1
increasing_geq n.+1 m
n: nat
increasing_geq n.+1 n
constructor; byconstructor.
n, m: nat IHn: increasing_geq n m.+1 IHIHn: increasing_geq n.+1 m.+1
n: nat IHn: forallm : nat, n <= m -> m - (m - n) = n
forallm : nat, n.+1 <= m -> m - (m - n.+1) = n.+1
n: nat IHn: forallm : nat, n <= m -> m - (m - n) = n m: nat ineq: n.+1 <= m
m - (m - n.+1) = n.+1
n: nat IHn: forallm : nat, n <= m -> m - (m - n) = n m: nat ineq: n.+1 <= m
m - (m - (1 + n)) = n.+1
n: nat IHn: forallm : nat, n <= m -> m - (m - n) = n m: nat ineq: n.+1 <= m
m - (m - (n + 1)) = n.+1
n: nat IHn: forallm : nat, n <= m -> m - (m - n) = n m: nat ineq: n.+1 <= m
m - (m - n - 1) = n.+1
n: nat IHn: forallm : nat, n <= m -> m - (m - n) = n m: nat ineq: n.+1 <= m
m - nat_pred (m - n) = n.+1
n: nat IHn: forallm : nat, n <= m -> m - (m - n) = n m: nat ineq: n.+1 <= m dp: 0 < m - n
m - nat_pred (m - n) = n.+1
n: nat IHn: forallm : nat, n <= m -> m - (m - n) = n m: nat ineq: n.+1 <= m dp: 0 < m - n sh: nat_pred (m - n) < m
m - nat_pred (m - n) = n.+1
n: nat IHn: forallm : nat, n <= m -> m - (m - n) = n m: nat ineq: n.+1 <= m dp: 0 < m - n sh: nat_pred (m - n) < m
(m - (nat_pred (m - n)).+1).+1 = n.+1
n: nat IHn: forallm : nat, n <= m -> m - (m - n) = n m: nat ineq: n.+1 <= m dp: 0 < m - n sh: nat_pred (m - n) < m
(m - (m - n)).+1 = n.+1
apply (ap S), IHn, leq_succ_l, ineq.Defined.
n, m: nat
n <= m <-> increasing_geq m n
n, m: nat
n <= m <-> increasing_geq m n
n, m: nat
n <= m -> increasing_geq m n
n, m: nat
increasing_geq m n -> n <= m
n, m: nat
n <= m -> increasing_geq m n
n, m: nat ineq: n <= m
increasing_geq m n
n: nat
increasing_geq n n
n, m: nat ineq: n <= m IHineq: increasing_geq m n
increasing_geq m.+1 n
n: nat
increasing_geq n n
constructor.
n, m: nat ineq: n <= m IHineq: increasing_geq m n
increasing_geq m.+1 n
apply increasing_geq_S_n in IHineq; constructor; assumption.
n, m: nat
increasing_geq m n -> n <= m
n, m: nat a: increasing_geq m n
n <= m
m: nat
m <= m
m, m0: nat a: increasing_geq m m0.+1 IHa: m0.+1 <= m
m0 <= m
m: nat
m <= m
constructor.
m, m0: nat a: increasing_geq m m0.+1 IHa: m0.+1 <= m
m0 <= m
exact (leq_succ_l _).Defined.(** TODO: remove *)(** This tautology accepts a (potentially opaqued or QED'ed) proof of [n <= m], and returns a transparent proof which can be computed with (i.e., one can loop from n to m) *)
n, m: nat
n <= m -> n <= m
n, m: nat
n <= m -> n <= m
n, m: nat ineq: n <= m
n <= m
n, m: nat ineq, l: n <= m
n <= m
n, m: nat ineq: n <= m g: n > m
n <= m
n, m: nat ineq, l: n <= m
n <= m
exact l.
n, m: nat ineq: n <= m g: n > m
n <= m
contradiction (lt_irrefl m (lt_lt_leq_trans g ineq)).Defined.
R: nat -> nat -> Type p: Symmetric R p': Reflexive R
(forallnm : nat, n < m -> R n m) ->
forallnm : nat, R n m
R: nat -> nat -> Type p: Symmetric R p': Reflexive R
(forallnm : nat, n < m -> R n m) ->
forallnm : nat, R n m
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m n, m: nat
R n m
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m n, m: nat m_leq_n: m <= n
R n m
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m n, m: nat m_gt_n: m > n
R n m
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m n, m: nat m_leq_n: m <= n
R n m
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m n, m: nat m_leq_n: m <= n
R m n
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m m: nat
R m m
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m m, m0: nat m_leq_n: m <= m0
R m m0.+1
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m m: nat
R m m
applyreflexivity.
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m m, m0: nat m_leq_n: m <= m0
R m m0.+1
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m m, m0: nat m_leq_n: m <= m0
m < m0.+1
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m m, m0: nat m_leq_n: m <= m0
m <= m0
assumption.
R: nat -> nat -> Type p: Symmetric R p': Reflexive R A: forallnm : nat, n < m -> R n m n, m: nat m_gt_n: m > n