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. Local Close Scope trunc_scope. Local Open Scope nat_scope. (** TODO: The results in this file are in the process of being moved over to Core.v *) (** TODO: move, rename *)
n, m: nat

n.+1 - m <= (n - m).+1
n, m: nat

n.+1 - m <= (n - m).+1
n: nat

forall m : nat, n.+1 - m <= (n - m).+1

forall m : nat, 1 - m <= (0 - m).+1
n: nat
IHn: forall m : nat, n.+1 - m <= (n - m).+1
forall m : nat, n.+2 - m <= (n.+1 - m).+1

forall m : nat, 1 - m <= (0 - m).+1
simple_induction m m IHm; exact _.
n: nat
IHn: forall m : nat, n.+1 - m <= (n - m).+1

forall m : nat, n.+2 - m <= (n.+1 - m).+1
n: nat
IHn: forall m : nat, n.+1 - m <= (n - m).+1

n.+2 - 0 <= (n.+1 - 0).+1
n: nat
IHn: forall m : nat, n.+1 - m <= (n - m).+1
m: nat
IHm: n.+2 - m <= (n.+1 - m).+1
n.+2 - m.+1 <= (n.+1 - m.+1).+1
n: nat
IHn: forall m : nat, n.+1 - m <= (n - m).+1

n.+2 - 0 <= (n.+1 - 0).+1
apply leq_refl.
n: nat
IHn: forall m : nat, n.+1 - m <= (n - m).+1
m: nat
IHm: n.+2 - m <= (n.+1 - m).+1

n.+2 - m.+1 <= (n.+1 - m.+1).+1
apply IHn. Defined. (** TODO: move, rename *)
n, m, k: nat

n + k - m <= n - m + k
n, m, k: nat

n + k - m <= n - m + k
n, m: nat

n + 0 - m <= n - m + 0
n, m, k: nat
IHk: n + k - m <= n - m + k
n + k.+1 - m <= n - m + k.+1
n, m: nat

n + 0 - m <= n - m + 0
destruct (nat_add_zero_r n)^, (nat_add_zero_r (n - m))^; constructor.
n, m, k: nat
IHk: n + k - m <= n - m + k

n + k.+1 - m <= n - m + k.+1
n, m, k: nat
IHk: n + k - m <= n - m + k

(n + k).+1 - m <= n - m + k.+1
n, m, k: nat
IHk: n + k - m <= n - m + k

(n + k - m).+1 <= n - m + k.+1
n, m, k: nat
IHk: n + k - m <= n - m + k

(n + k - m).+1 <= (n - m + k).+1
by apply leq_succ. Defined. (** TODO: move, rename *)
n, m: nat

n <= n - m + m
n, m: nat

n <= n - m + m
n, m: nat
l: m <= n

n <= n - m + m
n, m: nat
gt: m > n
n <= n - m + m
n, m: nat
l: m <= n

n <= n - m + m
n, m: nat
l: m <= n

n <= n + m - m
n, m: nat
l: m <= n

n <= n
apply leq_refl; done.
n, m: nat
gt: m > n

n <= n - m + m
n, m: nat
gt: n <= m

n <= n - m + m
n, m: nat
gt: n <= m

n <= 0 + m
assumption. Defined. (** TODO: move, rename *)
n, m, i: nat

i < n - m -> m <= n
n, m, i: nat

i < n - m -> m <= n

forall m i : nat, i < 0 - m -> m <= 0
n: nat
IHn: forall m i : nat, i < n - m -> m <= n
forall m i : nat, i < n.+1 - m -> m <= n.+1

forall m i : nat, i < 0 - m -> m <= 0
m, i: nat
l: i < 0 - m

m <= 0
m, i: nat
l: i < 0

m <= 0
contradiction (not_lt_zero_r _ _).
n: nat
IHn: forall m i : nat, i < n - m -> m <= n

forall m i : nat, i < n.+1 - m -> m <= n.+1
n: nat
IHn: forall m i : nat, i < n - m -> m <= n
m, i: nat
l: i < n.+1 - m

m <= n.+1
n: nat
IHn: forall m i : nat, i < n - m -> m <= n
i: nat
l: i < n.+1 - 0

0 <= n.+1
n: nat
IHn: forall m i : nat, i < n - m -> m <= n
m, i: nat
l: i < n.+1 - m.+1
m.+1 <= n.+1
n: nat
IHn: forall m i : nat, i < n - m -> m <= n
i: nat
l: i < n.+1 - 0

0 <= n.+1
apply leq_zero_l.
n: nat
IHn: forall m i : nat, i < n - m -> m <= n
m, i: nat
l: i < n.+1 - m.+1

m.+1 <= n.+1
n: nat
IHn: forall m i : nat, i < n - m -> m <= n
m, i: nat
l: i < n.+1 - m.+1

m <= n
n: nat
IHn: forall m i : nat, i < n - m -> m <= n
m, i: nat
l: i < n - m

m <= n
exact (IHn m i l). Defined. (** TODO: move, rename *)
n: nat

n - 1 = nat_pred n
n: nat

n - 1 = nat_pred n

0 - 1 = nat_pred 0
n: nat
IH: n - 1 = nat_pred n
n.+1 - 1 = nat_pred n.+1

0 - 1 = nat_pred 0
reflexivity.
n: nat
IH: n - 1 = nat_pred n

n.+1 - 1 = nat_pred n.+1
apply nat_sub_zero_r. Defined. (** TODO: move, rename *)
n: nat

nat_pred n <= n
n: nat

nat_pred n <= n
destruct n; exact _. Defined. (** TODO: move, rename *)
k, n: nat

k < n -> k < (nat_pred n).+1
k, n: nat

k < n -> k < (nat_pred n).+1
k: nat
ineq: k < 0

k < (nat_pred 0).+1
k, n: nat
ineq: k < n.+1
k < (nat_pred n.+1).+1
k: nat
ineq: k < 0

k < (nat_pred 0).+1
contradiction (not_lt_zero_r _ _).
k, n: nat
ineq: k < n.+1

k < (nat_pred n.+1).+1
assumption. Defined. (** TODO: move, rename *)
n: nat

n <= (nat_pred n).+1
n: nat

n <= (nat_pred n).+1
destruct n; exact _. Defined. (** TODO: move, rename *)
i, n, k: nat

n > i -> n <= k -> nat_pred n < k
i, n, k: nat

n > i -> n <= k -> nat_pred n < k
i, k: nat
ineq: 0 > i

0 <= k -> nat_pred 0 < k
i, n, k: nat
ineq: n.+1 > i
n.+1 <= k -> nat_pred n.+1 < k
i, k: nat
ineq: 0 > i

0 <= k -> nat_pred 0 < k
contradiction (not_lt_zero_r i).
i, n, k: nat
ineq: n.+1 > i

n.+1 <= k -> nat_pred n.+1 < k
intro; assumption. Defined. (** TODO: move, rename *)
n, k: nat

nat_pred n < k -> n <= k
n, k: nat

nat_pred n < k -> n <= k
k: nat
l: nat_pred 0 < k

0 <= k
n, k: nat
l: nat_pred n.+1 < k
n.+1 <= k
k: nat
l: nat_pred 0 < k

0 <= k
apply leq_zero_l.
n, k: nat
l: nat_pred n.+1 < k

n.+1 <= k
assumption. Defined. (** TODO: move, rename *)
i, j: nat

i < j -> i <= nat_pred j
i, j: nat

i < j -> i <= nat_pred j
intro l; apply leq_pred in l; assumption. Defined. (** TODO: move, rename *)
i, j, k: nat

i < j -> k.+1 <= j -> k <= nat_pred j
i, j, k: nat

i < j -> k.+1 <= j -> k <= nat_pred j
i, j, k: nat
l: i < j
ineq: k.+1 <= j

k <= nat_pred j
i, k: nat
l: i < 0
ineq: k.+1 <= 0

k <= nat_pred 0
i, j, k: nat
l: i < j.+1
ineq: k.+1 <= j.+1
k <= nat_pred j.+1
i, k: nat
l: i < 0
ineq: k.+1 <= 0

k <= nat_pred 0
contradiction (not_lt_zero_r i).
i, j, k: nat
l: i < j.+1
ineq: k.+1 <= j.+1

k <= nat_pred j.+1
by simpl; apply leq_pred'. Defined. (** TODO: move, rename *)
i, j: nat

i < nat_pred j -> i.+1 < j
i, j: nat

i < nat_pred j -> i.+1 < j
i, j: nat
ineq: i < nat_pred j

i.+1 < j
i, j: nat
ineq: i < nat_pred j
H: i.+2 <= (nat_pred j).+1

i.+1 < j
i, j: nat
ineq: i < nat_pred j
H: i.+2 <= (nat_pred j).+1

i < j
i, j: nat
ineq: i < nat_pred j
H: i.+2 <= (nat_pred j).+1
X: i < j
i.+1 < j
i, j: nat
ineq: i < nat_pred j
H: i.+2 <= (nat_pred j).+1

i < j
apply (@lt_lt_leq_trans _ (nat_pred j) _); [assumption | apply predn_leq_n].
i, j: nat
ineq: i < nat_pred j
H: i.+2 <= (nat_pred j).+1
X: i < j

i.+1 < j
by rewrite <- (nat_succ_pred' j i). Defined. (** TODO: move, rename *)
i, n: nat
p: i < n
m: nat

n < m -> nat_pred n < nat_pred m
i, n: nat
p: i < n
m: nat

n < m -> nat_pred n < nat_pred m
i, n: nat
p: i < n
m: nat
l: n < m

nat_pred n < nat_pred m
i, n: nat
p: i < n
m: nat
l: n < m

(nat_pred n).+2 <= (nat_pred m).+1
i, n: nat
p: i < n
m: nat
l: n < m

n.+1 <= (nat_pred m).+1
i, n: nat
p: i < n
m: nat
l: n < m
k:= transitive_lt i n m p l: i < m

n.+1 <= (nat_pred m).+1
i, n: nat
p: i < n
m: nat
l: n < m
k:= transitive_lt i n m p l: i < m

n.+1 <= m
assumption. Defined. (** TODO: move, rename *)
n, k: nat

n - k <= n
n, k: nat

n - k <= n
n: nat

forall k : nat, n - k <= n

forall k : nat, 0 - k <= 0
n: nat
IHn: forall k : nat, n - k <= n
forall k : nat, n.+1 - k <= n.+1

forall k : nat, 0 - k <= 0
intros; apply leq_zero_l.
n: nat
IHn: forall k : nat, n - k <= n

forall k : nat, n.+1 - k <= n.+1
n: nat
IHn: forall k : nat, n - k <= n

n.+1 - 0 <= n.+1
n: nat
IHn: forall k : nat, n - k <= n
k: nat
n.+1 - k.+1 <= n.+1
n: nat
IHn: forall k : nat, n - k <= n

n.+1 - 0 <= n.+1
apply leq_refl.
n: nat
IHn: forall k : nat, n - k <= n
k: nat

n.+1 - k.+1 <= n.+1
simpl; apply (@leq_trans _ n _); [ apply IHn | apply leq_succ_r, leq_refl]. Defined. (** TODO: move, rename *)
n, k: nat

0 < n -> 0 < k -> n - k < n
n, k: nat

0 < n -> 0 < k -> n - k < n
n, k: nat
l: 0 < n
l': 0 < k

n - k < n
n, k: nat
l: 0 < n
l': 0 < k

(n - k).+1 <= n
n, k: nat
l: 0 < n.+1
l': 0 < k.+1

(n.+1 - k.+1).+1 <= n.+1
simpl; apply leq_succ, sub_less. Defined. (** TODO: move, rename *)
n, m, k: nat

n <= m -> n <= m + k
n, m, k: nat

n <= m -> n <= m + k
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. Inductive increasing_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. Scheme increasing_geq_ind := Induction for increasing_geq Sort Type. Scheme increasing_geq_rec := Minimality for increasing_geq Sort Type. Definition increasing_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
by constructor. Defined.
n: nat

increasing_geq n 0
n: nat

increasing_geq n 0

increasing_geq 0 0
n: nat
IHn: increasing_geq n 0
increasing_geq n.+1 0

increasing_geq 0 0
constructor.
n: nat
IHn: increasing_geq n 0

increasing_geq n.+1 0
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; by constructor.
n, m: nat
IHn: increasing_geq n m.+1
IHIHn: increasing_geq n.+1 m.+1

increasing_geq n.+1 m
constructor; by assumption. Defined.
n, k: nat

increasing_geq n (n - k)
n, k: nat

increasing_geq n (n - k)
n: nat

increasing_geq n (n - 0)
n, k: nat
IHk: increasing_geq n (n - k)
increasing_geq n (n - k.+1)
n: nat

increasing_geq n (n - 0)
destruct (symmetric_paths _ _ (nat_sub_zero_r n)); constructor.
n, k: nat
IHk: increasing_geq n (n - k)

increasing_geq n (n - k.+1)
n, k: nat
IHk: increasing_geq n (n - k)
l: n <= k

increasing_geq n (n - k.+1)
n, k: nat
IHk: increasing_geq n (n - k)
g: n > k
increasing_geq n (n - k.+1)
n, k: nat
IHk: increasing_geq n (n - k)
l: n <= k

increasing_geq n (n - k.+1)
n, k: nat
IHk: increasing_geq n 0
l: n <= k

increasing_geq n (n - k.+1)
n, k: nat
IHk: increasing_geq n 0
l: n <= k.+1

increasing_geq n (n - k.+1)
n, k: nat
IHk: increasing_geq n 0
l: n <= k.+1

increasing_geq n 0
exact IHk.
n, k: nat
IHk: increasing_geq n (n - k)
g: n > k

increasing_geq n (n - k.+1)
n, k: nat
IHk: increasing_geq n (n - k)
g: n > k

increasing_geq n (n - (1 + k))
n, k: nat
IHk: increasing_geq n (n - k)
g: n > k

increasing_geq n (n - (k + 1))
n, k: nat
IHk: increasing_geq n (n - k)
g: n > k

increasing_geq n (n - k - 1)
n, k: nat
IHk: increasing_geq n (n - k)
g: n > k

increasing_geq n (nat_pred (n - k))
n, k: nat
IHk: increasing_geq n (n - k)
g: n > k

increasing_geq n (nat_pred (n - k)).+1
n, k: nat
IHk: increasing_geq n (n - k)
g: k.+1 <= n

increasing_geq n (nat_pred (n - k)).+1
n, k: nat
IHk: increasing_geq n (n - k)
g: 0 < n - k

increasing_geq n (nat_pred (n - k)).+1
by (destruct (symmetric_paths _ _ (nat_succ_pred (n - k) _))). Defined.
n, k: nat

k < n -> n - k = (n - k.+1).+1
n, k: nat

k < n -> n - k = (n - k.+1).+1
n, k: nat
ineq: k < n

n - k = (n - k.+1).+1
k: nat
ineq: k < 0

0 - k = (0 - k.+1).+1
n, k: nat
ineq: k < n.+1
n.+1 - k = (n.+1 - k.+1).+1
k: nat
ineq: k < 0

0 - k = (0 - k.+1).+1
contradiction (not_lt_zero_r k).
n, k: nat
ineq: k < n.+1

n.+1 - k = (n.+1 - k.+1).+1
n, k: nat
ineq: k < n.+1

n.+1 - k = (n - k).+1
n, k: nat
ineq: k <= n

n.+1 - k = (n - k).+1
by apply nat_sub_succ_l. Defined.
n, m: nat

n <= m -> m - (m - n) = n
n, m: nat

n <= m -> m - (m - n) = n

forall m : nat, 0 <= m -> m - (m - 0) = 0
n: nat
IHn: forall m : nat, n <= m -> m - (m - n) = n
forall m : nat, n.+1 <= m -> m - (m - n.+1) = n.+1

forall m : nat, 0 <= m -> m - (m - 0) = 0
m: nat
H: 0 <= m

m - (m - 0) = 0
destruct (symmetric_paths _ _ (nat_sub_zero_r m)), (symmetric_paths _ _ (nat_sub_cancel m)); reflexivity.
n: nat
IHn: forall m : nat, n <= m -> m - (m - n) = n

forall m : nat, n.+1 <= m -> m - (m - n.+1) = n.+1
n: nat
IHn: forall m : nat, n <= m -> m - (m - n) = n
m: nat
ineq: n.+1 <= m

m - (m - n.+1) = n.+1
n: nat
IHn: forall m : nat, n <= m -> m - (m - n) = n
m: nat
ineq: n.+1 <= m

m - (m - (1 + n)) = n.+1
n: nat
IHn: forall m : nat, n <= m -> m - (m - n) = n
m: nat
ineq: n.+1 <= m

m - (m - (n + 1)) = n.+1
n: nat
IHn: forall m : nat, n <= m -> m - (m - n) = n
m: nat
ineq: n.+1 <= m

m - (m - n - 1) = n.+1
n: nat
IHn: forall m : nat, n <= m -> m - (m - n) = n
m: nat
ineq: n.+1 <= m

m - nat_pred (m - n) = n.+1
n: nat
IHn: forall m : 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: forall m : 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: forall m : 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: forall m : 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

(forall n m : nat, n < m -> R n m) -> forall n m : nat, R n m
R: nat -> nat -> Type
p: Symmetric R
p': Reflexive R

(forall n m : nat, n < m -> R n m) -> forall n m : nat, R n m
R: nat -> nat -> Type
p: Symmetric R
p': Reflexive R
A: forall n m : nat, n < m -> R n m
n, m: nat

R n m
R: nat -> nat -> Type
p: Symmetric R
p': Reflexive R
A: forall n m : 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: forall n m : 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: forall n m : 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: forall n m : 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: forall n m : nat, n < m -> R n m
m: nat

R m m
R: nat -> nat -> Type
p: Symmetric R
p': Reflexive R
A: forall n m : 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: forall n m : nat, n < m -> R n m
m: nat

R m m
apply reflexivity.
R: nat -> nat -> Type
p: Symmetric R
p': Reflexive R
A: forall n m : 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: forall n m : 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: forall n m : 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: forall n m : nat, n < m -> R n m
n, m: nat
m_gt_n: m > n

R n m
apply A, m_gt_n. Defined.