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)         *)
(************************************************************************)
(*                      Evgeny Makarov, INRIA, 2007                     *)
(************************************************************************)

Require Export NMulOrder.

Module Type NSubProp (Import N : NAxiomsMiniSig').
Include NMulOrderProp N.


forall n : t, 0 - n == 0

forall n : t, 0 - n == 0

0 - 0 == 0

forall n : t, 0 - n == 0 -> 0 - S n == 0

forall n : t, 0 - n == 0 -> 0 - S n == 0
n:t
IH:0 - n == 0

P 0 == 0
now apply pred_0. Qed.

forall n m : t, S n - S m == n - m

forall n m : t, S n - S m == n - m
n:t

S n - S 0 == n - 0
n:t
forall n0 : t, S n - S n0 == n - n0 -> S n - S (S n0) == n - S n0
n:t

P (S n - 0) == n - 0
n:t
forall n0 : t, S n - S n0 == n - n0 -> S n - S (S n0) == n - S n0
n:t

P (S n) == n
n:t
forall n0 : t, S n - S n0 == n - n0 -> S n - S (S n0) == n - S n0
n:t

forall n0 : t, S n - S n0 == n - n0 -> S n - S (S n0) == n - S n0
n, m:t
IH:S n - S m == n - m

S n - S (S m) == n - S m
n, m:t
IH:S n - S m == n - m

P (S n - S m) == n - S m
n, m:t
IH:S n - S m == n - m

P (n - m) == n - S m
now rewrite sub_succ_r. Qed.

forall n : t, n - n == 0

forall n : t, n - n == 0

0 - 0 == 0

forall n : t, n - n == 0 -> S n - S n == 0

forall n : t, n - n == 0 -> S n - S n == 0
intros n IH; rewrite sub_succ; now rewrite IH. Qed.

forall n m : t, m < n -> n - m ~= 0

forall n m : t, m < n -> n - m ~= 0

Proper (eq ==> eq ==> iff) (fun m n : t => n - m ~= 0)

forall m : t, S m - 0 ~= 0

forall n m : t, n < m -> m - n ~= 0 -> S m - S n ~= 0

forall m : t, S m - 0 ~= 0

forall n m : t, n < m -> m - n ~= 0 -> S m - S n ~= 0

forall n m : t, n < m -> m - n ~= 0 -> S m - S n ~= 0
intros; now rewrite sub_succ. Qed.

forall n m p : t, p <= m -> n + (m - p) == n + m - p

forall n m p : t, p <= m -> n + (m - p) == n + m - p
n, m:t

0 <= m -> n + (m - 0) == n + m - 0
n, m:t
forall n0 : t, (n0 <= m -> n + (m - n0) == n + m - n0) -> S n0 <= m -> n + (m - S n0) == n + m - S n0
n, m:t

forall n0 : t, (n0 <= m -> n + (m - n0) == n + m - n0) -> S n0 <= m -> n + (m - S n0) == n + m - S n0
n, m, p:t
IH:p <= m -> n + (m - p) == n + m - p
H:S p <= m

n + (m - S p) == n + m - S p
n, m, p:t
IH:p <= m -> n + (m - p) == n + m - p
H:S p <= m

n + P (m - p) == P (n + m - p)
n, m, p:t
IH:p <= m -> n + (m - p) == n + m - p
H:S p <= m

n + P (m - p) == P (n + (m - p))
n, m, p:t
IH:p <= m -> n + (m - p) == n + m - p
H:S p <= m

P (n + (m - p)) == P (n + (m - p))
reflexivity. Qed.

forall n m : t, n <= m -> S m - n == S (m - n)

forall n m : t, n <= m -> S m - n == S (m - n)
n, m:t
H:n <= m

S m - n == S (m - n)
n, m:t
H:n <= m

1 + m - n == S (m - n)
n, m:t
H:n <= m

1 + m - n == 1 + (m - n)
symmetry; now apply add_sub_assoc. Qed.

forall n m : t, n + m - m == n

forall n m : t, n + m - m == n
n, m:t

n + m - m == n
n, m:t

n + (m - m) == n
rewrite sub_diag; now rewrite add_0_r. Qed.

forall n m : t, n <= m -> m - n + n == m

forall n m : t, n <= m -> m - n + n == m
n, m:t
H:n <= m

m - n + n == m
n, m:t
H:n <= m

n + (m - n) == m
n, m:t
H:n <= m

n + m - n == m
n, m:t
H:n <= m

m + n - n == m
apply add_sub. Qed.

forall n m p : t, m + p == n -> n - m == p

forall n m p : t, m + p == n -> n - m == p
n, m, p:t
H:m + p == n

n - m == p
n, m, p:t
H:m + p == n

p == n - m
n, m, p:t
H:m + p == n
H1:m + p - m == n - m

p == n - m
n, m, p:t
H:m + p == n
H1:p + m - m == n - m

p == n - m
now rewrite add_sub in H1. Qed.

forall n m p : t, m + p == n -> n - p == m

forall n m p : t, m + p == n -> n - p == m
intros n m p H; rewrite add_comm in H; now apply add_sub_eq_l. Qed. (* This could be proved by adding m to both sides. Then the proof would use add_sub_assoc and sub_0_le, which is proven below. *)

forall n m p : t, p ~= 0 -> n - m == p -> m + p == n

forall n m p : t, p ~= 0 -> n - m == p -> m + p == n
p:t
H:p ~= 0

forall m : t, 0 - m == p -> m + p == 0
p:t
H:p ~= 0
forall n : t, S n - 0 == p -> 0 + p == S n
p:t
H:p ~= 0
forall n m : t, (n - m == p -> m + p == n) -> S n - S m == p -> S m + p == S n
p:t
H:p ~= 0
m:t
H1:0 == p

m + p == 0
p:t
H:p ~= 0
forall n : t, S n - 0 == p -> 0 + p == S n
p:t
H:p ~= 0
forall n m : t, (n - m == p -> m + p == n) -> S n - S m == p -> S m + p == S n
p:t
H:p ~= 0

forall n : t, S n - 0 == p -> 0 + p == S n
p:t
H:p ~= 0
forall n m : t, (n - m == p -> m + p == n) -> S n - S m == p -> S m + p == S n
p:t
H:p ~= 0

forall n m : t, (n - m == p -> m + p == n) -> S n - S m == p -> S m + p == S n
p:t
H:p ~= 0
n, m:t
IH:n - m == p -> m + p == n
H1:S n - S m == p

S m + p == S n
p:t
H:p ~= 0
n, m:t
IH:n - m == p -> m + p == n
H1:n - m == p

S m + p == S n
p:t
H:p ~= 0
n, m:t
IH:n - m == p -> m + p == n
H1:m + p == n

S m + p == S n
rewrite add_succ_l; now rewrite H1. Qed.

forall n m p : t, n - (m + p) == n - m - p

forall n m p : t, n - (m + p) == n - m - p
n, m:t

n - (m + 0) == n - m - 0
n, m:t
forall n0 : t, n - (m + n0) == n - m - n0 -> n - (m + S n0) == n - m - S n0
n, m:t

forall n0 : t, n - (m + n0) == n - m - n0 -> n - (m + S n0) == n - m - S n0
n, m, p:t
IH:n - (m + p) == n - m - p

n - (m + S p) == n - m - S p
n, m, p:t
IH:n - (m + p) == n - m - p

P (n - (m + p)) == P (n - m - p)
now rewrite IH. Qed.

forall n m p : t, p <= n -> n + m - p == n - p + m

forall n m p : t, p <= n -> n + m - p == n - p + m
n, m, p:t
H:p <= n

n + m - p == n - p + m
n, m, p:t
H:p <= n

m + n - p == n - p + m
n, m, p:t
H:p <= n

m + (n - p) == n - p + m
now rewrite (add_comm m (n - p)). Qed.
Sub and order

forall n m : t, n - m <= n

forall n m : t, n - m <= n
n:t

n - 0 <= n
n:t
forall n0 : t, n - n0 <= n -> n - S n0 <= n
n:t

forall n0 : t, n - n0 <= n -> n - S n0 <= n
n, m:t
IH:n - m <= n

n - S m <= n
n, m:t
IH:n - m <= n

P (n - m) <= n
apply le_trans with (n - m); [apply le_pred_l | assumption]. Qed.

forall n m : t, n - m == 0 <-> n <= m

forall n m : t, n - m == 0 <-> n <= m

forall m : t, 0 - m == 0 <-> 0 <= m

forall n : t, S n - 0 == 0 <-> S n <= 0

forall n m : t, n - m == 0 <-> n <= m -> S n - S m == 0 <-> S n <= S m

forall n : t, S n - 0 == 0 <-> S n <= 0

forall n m : t, n - m == 0 <-> n <= m -> S n - S m == 0 <-> S n <= S m

forall n m : t, n - m == 0 <-> n <= m -> S n - S m == 0 <-> S n <= S m
n, m:t
H:n - m == 0 <-> n <= m

S n - S m == 0 <-> S n <= S m
n, m:t
H:n - m == 0 <-> n <= m

S n - S m == 0 <-> n <= m
now rewrite sub_succ. Qed.

forall n m : t, n <= n - m + m

forall n m : t, n <= n - m + m
n, m:t

n <= n - m + m
n, m:t
LE:n <= m

n <= n - m + m
n, m:t
GE:m <= n
n <= n - m + m
n, m:t
LE:n - m == 0

n <= n - m + m
n, m:t
GE:m <= n
n <= n - m + m
n, m:t
LE:n - m == 0

n <= m
n, m:t
GE:m <= n
n <= n - m + m
n, m:t
GE:m <= n

n <= n - m + m
n, m:t
GE:m <= n

n <= n
apply le_refl. Qed.

forall n m p : t, n - p <= m <-> n <= m + p

forall n m p : t, n - p <= m <-> n <= m + p
n, m, p:t

n - p <= m <-> n <= m + p
n, m, p:t
LE:n - p <= m

n <= m + p
n, m, p:t
LE:n <= m + p
n - p <= m
n, m, p:t
LE:n - p + p <= m + p

n <= m + p
n, m, p:t
LE:n <= m + p
n - p <= m
n, m, p:t
LE:n <= m + p

n - p <= m
n, m, p:t
LE:n <= m + p
LE':n <= p

n - p <= m
n, m, p:t
LE:n <= m + p
GE:p <= n
n - p <= m
n, m, p:t
LE:n <= m + p
LE':n - p == 0

n - p <= m
n, m, p:t
LE:n <= m + p
GE:p <= n
n - p <= m
n, m, p:t
LE:n <= m + p
LE':n - p == 0

0 <= m
n, m, p:t
LE:n <= m + p
GE:p <= n
n - p <= m
n, m, p:t
LE:n <= m + p
GE:p <= n

n - p <= m
n, m, p:t
LE:n <= m + p
GE:p <= n

n - p + p <= m + p
now rewrite sub_add. Qed.

forall n m p : t, n - m <= p <-> n <= m + p

forall n m p : t, n - m <= p <-> n <= m + p
n, m, p:t

n - m <= p <-> n <= m + p
rewrite add_comm; apply le_sub_le_add_r. Qed.

forall n m p : t, n - p < m -> n < m + p

forall n m p : t, n - p < m -> n < m + p
n, m, p:t
LT:n - p < m

n < m + p
n, m, p:t
LT:n - p + p < m + p

n < m + p
apply le_lt_trans with (n-p+p); auto using sub_add_le. Qed.
Unfortunately, we do not have n < m + p n - p < m. For instance 1<0+2 but not 1-2<0.

forall n m p : t, n - m < p -> n < m + p

forall n m p : t, n - m < p -> n < m + p
n, m, p:t

n - m < p -> n < m + p
rewrite add_comm; apply lt_sub_lt_add_r. Qed.

forall n m p : t, n + p <= m -> n <= m - p

forall n m p : t, n + p <= m -> n <= m - p
n, m, p:t
LE:n + p <= m

n <= m - p
n, m, p:t
LE:n + p <= m

n + p <= m - p + p
n, m, p:t
LE:n + p <= m

n + p <= m
n, m, p:t
LE:n + p <= m
p <= m
n, m, p:t
LE:n + p <= m

p <= m
n, m, p:t
LE:n + p <= m

p <= n + p
n, m, p:t
LE:n + p <= m

0 + p <= n + p
n, m, p:t
LE:n + p <= m

0 <= n
apply le_0_l. Qed.
Unfortunately, we do not have n m - p n + p m. For instance 0<=1-2 but not 2+0<=1.

forall n m p : t, n + p <= m -> p <= m - n

forall n m p : t, n + p <= m -> p <= m - n
n, m, p:t

n + p <= m -> p <= m - n
rewrite add_comm; apply le_add_le_sub_r. Qed.

forall n m p : t, n + p < m <-> n < m - p

forall n m p : t, n + p < m <-> n < m - p
n, m, p:t

n + p < m <-> n < m - p
n, m, p:t
LE:p <= m

n + p < m <-> n < m - p
n, m, p:t
GE:m <= p
n + p < m <-> n < m - p
n, m, p:t
LE:p <= m

n + p < m - p + p <-> n < m - p
n, m, p:t
GE:m <= p
n + p < m <-> n < m - p
n, m, p:t
GE:m <= p

n + p < m <-> n < m - p
n, m, p:t
GE, GE':m <= p

n + p < m <-> n < m - p
n, m, p:t
GE:m <= p
GE':m - p == 0

n + p < m <-> n < 0
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n + p < m

n < 0
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n < 0
n + p < m
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n + p < m

m < m
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n < 0
n + p < m
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n + p < m

m <= n + p
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n < 0
n + p < m
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n + p < m

0 + m <= n + p
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n < 0
n + p < m
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n + p < m

0 <= n
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n + p < m
m <= p
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n < 0
n + p < m
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n + p < m

m <= p
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n < 0
n + p < m
n, m, p:t
GE:m <= p
GE':m - p == 0
LT:n < 0

n + p < m
now elim (nlt_0_r n). Qed.

forall n m p : t, n + p < m <-> p < m - n

forall n m p : t, n + p < m <-> p < m - n
n, m, p:t

n + p < m <-> p < m - n
rewrite add_comm; apply lt_add_lt_sub_r. Qed.

forall n m : t, m <= n -> 0 < m -> n - m < n

forall n m : t, m <= n -> 0 < m -> n - m < n
n, m:t
LE:m <= n
LT:0 < m

n - m < n
n, m:t
LE:m <= n
LT:0 < m
LE':n - m <= n

n - m < n
n, m:t
LE:m <= n
LT:0 < m
LE':n - m < n \/ n - m == n

n - m < n
n, m:t
LE:m <= n
LT:0 < m
LT':n - m < n

n - m < n
n, m:t
LE:m <= n
LT:0 < m
EQ:n - m == n
n - m < n
n, m:t
LE:m <= n
LT:0 < m
EQ:n - m == n

n - m < n
n, m:t
LE:m <= n
LT:0 < m
EQ:m + n == n

n - m < n
n, m:t
LE:m <= n
LT:n < m + n
EQ:m + n == n

n - m < n
order. Qed.

forall n m p : t, n <= m -> n - p <= m - p

forall n m p : t, n <= m -> n - p <= m - p
n, m, p:t
H:n <= m

n - p <= m - p
n, m, p:t
H:n <= m

n <= m - p + p
n, m, p:t
H:n <= m

n <= m
n, m, p:t
H:n <= m
m <= m - p + p
n, m, p:t
H:n <= m

m <= m - p + p
apply sub_add_le. Qed.

forall n m p : t, n <= m -> p - m <= p - n

forall n m p : t, n <= m -> p - m <= p - n
n, m, p:t
H:n <= m

p - m <= p - n
n, m, p:t
H:n <= m

p <= p - n + m
transitivity (p-n+n); [ apply sub_add_le | now apply add_le_mono_l]. Qed.
Sub and mul

forall n m : t, n * P m == n * m - n

forall n m : t, n * P m == n * m - n
n:t

n * P 0 == n * 0 - n
n:t
forall n0 : t, n * P (S n0) == n * S n0 - n
n:t

forall n0 : t, n * P (S n0) == n * S n0 - n
n, m:t

n * m == n * m + (n - n)
n, m:t
n <= n
n, m:t

n <= n
now apply eq_le_incl. Qed.

forall n m p : t, (n - m) * p == n * p - m * p

forall n m p : t, (n - m) * p == n * p - m * p
m, p:t

(0 - m) * p == 0 * p - m * p
m, p:t
forall n : t, (n - m) * p == n * p - m * p -> (S n - m) * p == S n * p - m * p
m, p:t

forall n : t, (n - m) * p == n * p - m * p -> (S n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p

(S n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:m <= n

(S n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:n < m
(S n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:m <= n

S (n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:n < m
(S n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:m <= n

(n - m) * p + p == n * p + p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:n < m
(S n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:m <= n

p + (n - m) * p == p + n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:n < m
(S n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:m <= n

p + (n - m) * p == p + (n * p - m * p)
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:n < m
(S n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:n < m

(S n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:n < m
H1:S n <= m

(S n - m) * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:n < m
H1:S n <= m

0 * p == S n * p - m * p
m, p, n:t
IH:(n - m) * p == n * p - m * p
H:n < m
H1:S n <= m

0 * p == 0
apply mul_0_l. Qed.

forall n m p : t, p * (n - m) == p * n - p * m

forall n m p : t, p * (n - m) == p * n - p * m
n, m, p:t

(n - m) * p == n * p - m * p
apply mul_sub_distr_r. Qed.
Alternative definitions of and < based on +
Definition le_alt n m := exists p, p + n == m.
Definition lt_alt n m := exists p, S p + n == m.


forall n m : t, le_alt n m <-> n <= m

forall n m : t, le_alt n m <-> n <= m
n, m:t

le_alt n m -> n <= m
n, m:t
n <= m -> le_alt n m
n, m, p:t
H:p + n == m

n <= m
n, m:t
n <= m -> le_alt n m
n, m, p:t
H:p + n == m

n <= n + p
n, m:t
n <= m -> le_alt n m
n, m:t

n <= m -> le_alt n m
n, m:t
H:n <= m

le_alt n m
n, m:t
H:n <= m

m - n + n == m
now apply sub_add. Qed.

forall n m : t, lt_alt n m <-> n < m

forall n m : t, lt_alt n m <-> n < m
n, m:t

lt_alt n m -> n < m
n, m:t
n < m -> lt_alt n m
n, m, p:t
H:S p + n == m

n < m
n, m:t
n < m -> lt_alt n m
n, m, p:t
H:S p + n == m

n <= n + p
n, m:t
n < m -> lt_alt n m
n, m:t

n < m -> lt_alt n m
n, m:t
H:n < m

lt_alt n m
n, m:t
H:n < m

S (m - S n) + n == m
n, m:t
H:n < m

m - S n + S n == m
n, m:t
H:n < m

S n <= m
now rewrite le_succ_l. Qed.

Proper (eq ==> eq ==> iff) le_alt

Proper (eq ==> eq ==> iff) le_alt
x, x':t
Hx:x == x'
y, y':t
Hy:y == y'

(exists p : t, p + x == y) <-> (exists p : t, p + x' == y')
x, x':t
Hx:x == x'
y, y':t
Hy:y == y'

(exists p : t, p + x' == y) <-> (exists p : t, p + x' == y')
x, x':t
Hx:x == x'
y, y':t
Hy:y == y'

(exists p : t, p + x' == y') <-> (exists p : t, p + x' == y')
auto with *. Qed.

Proper (eq ==> eq ==> iff) lt_alt

Proper (eq ==> eq ==> iff) lt_alt
x, x':t
Hx:x == x'
y, y':t
Hy:y == y'

(exists p : t, S p + x == y) <-> (exists p : t, S p + x' == y')
x, x':t
Hx:x == x'
y, y':t
Hy:y == y'

(exists p : t, S p + x' == y) <-> (exists p : t, S p + x' == y')
x, x':t
Hx:x == x'
y, y':t
Hy:y == y'

(exists p : t, S p + x' == y') <-> (exists p : t, S p + x' == y')
auto with *. Qed.
With these alternative definition, the dichotomy:
n m, n m m n
becomes:
n m, ( p, p + n == m) ( p, p + m == n)
We will need this in the proof of induction principle for integers constructed as pairs of natural numbers. This formula can be proved from know properties of . However, it can also be done directly.

forall n m : t, le_alt n m \/ le_alt m n

forall n m : t, le_alt n m \/ le_alt m n
m:t

le_alt 0 m \/ le_alt m 0
m:t
forall n : t, le_alt n m \/ le_alt m n -> le_alt (S n) m \/ le_alt m (S n)
m:t

forall n : t, le_alt n m \/ le_alt m n -> le_alt (S n) m \/ le_alt m (S n)
m, n:t
IH:le_alt n m \/ le_alt m n

le_alt (S n) m \/ le_alt m (S n)
m, n, p:t
H:p + n == m

le_alt (S n) m \/ le_alt m (S n)
m, n, p:t
H:p + m == n
le_alt (S n) m \/ le_alt m (S n)
m, n, p:t
H:0 + n == m
H1:p == 0

le_alt (S n) m \/ le_alt m (S n)
m, n, p, p':t
H:S p' + n == m
H1:p == S p'
le_alt (S n) m \/ le_alt m (S n)
m, n, p:t
H:p + m == n
le_alt (S n) m \/ le_alt m (S n)
m, n, p:t
H:n == m
H1:p == 0

le_alt (S n) m \/ le_alt m (S n)
m, n, p, p':t
H:S p' + n == m
H1:p == S p'
le_alt (S n) m \/ le_alt m (S n)
m, n, p:t
H:p + m == n
le_alt (S n) m \/ le_alt m (S n)
m, n, p, p':t
H:S p' + n == m
H1:p == S p'

le_alt (S n) m \/ le_alt m (S n)
m, n, p:t
H:p + m == n
le_alt (S n) m \/ le_alt m (S n)
m, n, p:t
H:p + m == n

le_alt (S n) m \/ le_alt m (S n)
m, n, p:t
H:p + m == n

S p + m == S n
rewrite add_succ_l; now rewrite H. Qed.

forall n m : t, (exists p : t, p + n == m) \/ (exists p : t, p + m == n)

forall n m : t, (exists p : t, p + n == m) \/ (exists p : t, p + m == n)
exact le_alt_dichotomy. Qed. End NSubProp.