Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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. Ltac nat_absurd_trivial := unfold ">" in *; unfold "<" in *; match goal with | [ H : ?n.+1 <= 0 |- _ ] => contradiction (not_leq_Sn_0 n H) | [ H : ?n.+1 <= ?n |- _ ] => contradiction (not_lt_n_n n H) | [ H1 : ?k.+1 <= ?n |- _ ] => match goal with | [ H2 : ?n <= ?k |- _] => contradiction (not_leq_Sn_n k (@leq_trans _ _ _ H1 H2)) end end. #[export] Hint Resolve not_lt_n_n : nat. #[export] Hint Resolve not_lt_n_0 : nat. #[export] Hint Resolve not_leq_Sn_0 : nat. #[export] Hint Extern 2 => nat_absurd_trivial : nat. (** This is defined so that it can be added to the [nat] auto hint database. *) Local Definition symmetric_paths_nat (n m : nat) : n = m -> m = n := @symmetric_paths nat n m. Local Definition transitive_paths_nat (n m k : nat) : n = m -> m = k -> n = k := @transitive_paths nat n m k. #[export] Hint Resolve symmetric_paths_nat | 5 : nat. #[export] Hint Resolve transitive_paths_nat : nat. #[export] Hint Resolve leq_0_n : nat. #[export] Hint Resolve leq_trans : nat. #[export] Hint Resolve leq_antisym : nat.
n, m, k: nat

n + (m + k) = n + m + k
n, m, k: nat

n + (m + k) = n + m + k

forall m k : nat, 0 + (m + k) = 0 + m + k
n: nat
IHn: forall m k : nat, n + (m + k) = n + m + k
forall m k : nat, n.+1 + (m + k) = n.+1 + m + k

forall m k : nat, 0 + (m + k) = 0 + m + k
reflexivity.
n: nat
IHn: forall m k : nat, n + (m + k) = n + m + k

forall m k : nat, n.+1 + (m + k) = n.+1 + m + k
n: nat
IHn: forall m k : nat, n + (m + k) = n + m + k
m, k: nat

n.+1 + (m + k) = n.+1 + m + k
n: nat
IHn: forall m k : nat, n + (m + k) = n + m + k
m, k: nat

(n + (m + k)).+1 = n.+1 + m + k
n: nat
IHn: forall m k : nat, n + (m + k) = n + m + k
m, k: nat

n + (m + k).+1 = n.+1 + m + k
n: nat
IHn: forall m k : nat, n + (m + k) = n + m + k
m, k: nat

n + (m.+1 + k) = (n + m).+1 + k
n: nat
IHn: forall m k : nat, n + (m + k) = n + m + k
m, k: nat

n + m.+1 + k = (n + m).+1 + k
n: nat
IHn: forall m k : nat, n + (m + k) = n + m + k
m, k: nat

n + m.+1 = (n + m).+1
apply symmetric_paths, nat_add_n_Sm. Defined.
n, m: nat

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

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

m <= n
destruct (@leq_dichot m n); [ assumption | contradiction]. Defined.
n, m: nat

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

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

m < n
destruct (@leq_dichot n m); [ contradiction | assumption]. Defined.
n, m: nat

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

n < m -> ~ (m <= n)
n, m: nat
ineq1: n < m
ineq2: m <= n

Empty
n, m: nat
ineq1: n < m
ineq2: m <= n

n < n
by apply (leq_trans ineq1). Defined.
n, m: nat

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

n <= m -> ~ (m < n)
n, m: nat
ineq1: n <= m
ineq2: m < n

Empty
contradiction (not_lt_n_n n); by refine (leq_trans _ ineq2). Defined. Ltac convert_to_positive := match goal with | [ H : ~ (?n < ?m) |- _] => apply not_lt_implies_geq in H | [ H : ~ (?n <= ?m) |- _] => apply not_leq_implies_gt in H | [|- ~ (?n < ?m) ] => apply leq_implies_not_gt | [|- ~ (?n <= ?m) ] => apply lt_implies_not_geq end. #[export] Hint Extern 2 => convert_to_positive : nat. (** Because of the inductive definition of [<=], one can destruct the proof of [n <= m] and get a judgemental identification between [n] and [m] rather than a propositional one, which may be preferable to the following lemma. *)
n, m: nat

n <= m -> ((n < m) + (n = m))%type
n, m: nat

n <= m -> ((n < m) + (n = m))%type
n, m: nat
l: n <= m

((n < m) + (n = m))%type
n: nat

((n < n) + (n = n))%type
n, m: nat
l: n <= m
IHl: ((n < m) + (n = m))%type
((n < m.+1) + (n = m.+1))%type
n: nat

((n < n) + (n = n))%type
now right.
n, m: nat
l: n <= m
IHl: ((n < m) + (n = m))%type

((n < m.+1) + (n = m.+1))%type
n, m: nat
l: n <= m
IHl: ((n < m) + (n = m))%type

n < m.+1
exact (leq_S_n' _ _ l). Defined.
n, m: nat

n <> m -> ((n < m) + (n > m))%type
n, m: nat

n <> m -> ((n < m) + (n > m))%type
n, m: nat
diseq: n <> m

((n < m) + (n > m))%type
n, m: nat
diseq: n <> m
a: ~ (n < m)

((n < m) + (n > m))%type
n, m: nat
diseq: n <> m
a: ~ (n < m)

n > m
n, m: nat
diseq: n <> m
a: ~ (n < m)
n_leq_m: n <= m

n > m
destruct n_leq_m; [ now contradiction diseq | contradiction a; now apply leq_S_n']. Defined.
n, m: nat

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

n < m -> n <> m
n, m: nat
ineq: n < m
eq: n = m

Empty
n, m: nat
ineq: m < m
eq: n = m

Empty
contradiction (not_lt_n_n m). Defined. #[export] Hint Resolve lt_implies_diseq : nat. (** This lemma is just for convenience in the case where the user forgets to unfold the definition of [<]. *)
n: nat

n < n.+1
n: nat

n < n.+1
exact (leq_n n.+1). Defined.
n, m: nat

n.+1 <= m -> n <= m
n, m: nat

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

n <= m
now apply leq_S_n, leq_S. Defined. Ltac easy_eq_to_ineq := match goal with | [ H : ?x = ?n |- ?x <= ?n ] => destruct H; constructor | [ H : ?x.+1 = ?n |- ?x <= ?n ] => rewrite <- H; constructor; constructor | [ H : ?x.+1 = ?n |- ?x < ?n ] => rewrite <- H; apply leq_n | [ H : ?x.+2 = ?n |- ?x <= ?n ] => rewrite <- H; apply leq_S'; apply leq_S'; apply leq_n | [ H : ?x.+2 = ?n |- ?x < ?n ] => rewrite <- H; apply leq_S_n'; apply leq_S end. #[export] Hint Extern 3 => easy_eq_to_ineq : nat.
n, m, k: nat

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

n <= m -> m < k -> n < k
n, m, k: nat
l: n <= m
j: m < k

n < k
n, m, k: nat
l: n.+1 <= m.+1
j: m < k

n < k
apply (@leq_trans (n.+1) (m.+1) k); trivial. Defined. Ltac leq_trans_resolve := match goal with | [ H : ?n <= ?m |- ?n <= ?k ] => apply (leq_trans H) | [ H : ?k <= ?m |- ?n <= ?k ] => refine (leq_trans _ H) | [ H : ?n <= ?m |- ?n < ?k ] => apply (mixed_trans1 _ _ _ H) | [ H : ?m <= ?k |- ?n < ?k ] => refine (leq_trans _ H) | [ H : ?m < ?k |- ?n < ?k ] => refine (mixed_trans1 _ _ _ _ H) | [ H : ?n < ?m |- ?n < ?k ] => apply (leq_trans H) end. #[export] Hint Extern 2 => leq_trans_resolve : nat.
n, m, k: nat

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

n < m -> m <= k -> n < k
n, m, k: nat
l: n < m
j: m <= k

n < k
apply (@leq_trans (n.+1) m k); trivial. Defined. #[export] Hint Resolve mixed_trans1 : nat. #[export] Hint Resolve mixed_trans2 : nat.
n: nat

n - n = 0
n: nat

n - n = 0

0 - 0 = 0
n: nat
IHn: n - n = 0
n.+1 - n.+1 = 0

0 - 0 = 0
reflexivity.
n: nat
IHn: n - n = 0

n.+1 - n.+1 = 0
simpl; exact IHn. Defined.
n: nat

n - 0 = n
n: nat

n - 0 = n
destruct n; reflexivity. Defined. Ltac rewrite_subn0 := match goal with | [ |- context [ ?n - 0 ] ] => rewrite -> sub_n_0 end. Ltac rewrite_subnn := match goal with | [ |- context [ ?n - ?n ] ] => rewrite -> sub_n_n end. #[export] Hint Rewrite -> sub_n_0 : nat. #[export] Hint Rewrite -> sub_n_n : nat. #[export] Hint Resolve sub_n_0 : nat.
m, n: nat

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

m + n - n = m
n: nat

0 + n - n = 0
m, n: nat
m.+1 + n - n = m.+1
n: nat

0 + n - n = 0

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

0 + 0 - 0 = 0
reflexivity.
n: nat
IH: 0 + n - n = 0

0 + n.+1 - n.+1 = 0
assumption.
m, n: nat

m.+1 + n - n = m.+1
m: nat

m.+1 + 0 - 0 = m.+1
m, n: nat
IH: m.+1 + n - n = m.+1
m.+1 + n.+1 - n.+1 = m.+1
m: nat

m.+1 + 0 - 0 = m.+1
m: nat

(m + 0).+1 = m.+1
destruct (add_n_O m); reflexivity.
m, n: nat
IH: m.+1 + n - n = m.+1

m.+1 + n.+1 - n.+1 = m.+1
m, n: nat
IH: m.+1 + n - n = m.+1

m + n.+1 - n = m.+1
m, n: nat
IH: m.+1 + n - n = m.+1

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

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

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

m + n - n = m
exact (add_n_sub_n_eq m n). Defined.
k, m, n: nat
p: k + n = m

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

k = m - n
k, n: nat

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

k + n - n = k
apply add_n_sub_n_eq. Defined.
n, m: nat

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

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

n <= m
apply leq_S, leq_S_n in H; exact H. Defined. #[export] Hint Resolve n_lt_m_n_leq_m : nat.
n, m, k: nat

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

n < m -> m < k -> n < k
eauto with nat. Defined.
n, m: nat

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

n < m -> ~ (m < n)
intros l a; contradiction (not_lt_n_n _ (lt_trans _ _ _ l a)). Defined.
n, m: nat

n <= n + m
n, m: nat

n <= n + m
m: nat

0 <= 0 + m
m, n: nat
IHn: n <= n + m
n.+1 <= n.+1 + m
m: nat

0 <= 0 + m
apply leq_0_n.
m, n: nat
IHn: n <= n + m

n.+1 <= n.+1 + m
simpl; apply leq_S_n', IHn. Defined.
n, m: nat

n <= m + n
n, m: nat

n <= m + n
n: nat

n <= 0 + n
n, m: nat
IH: n <= m + n
n <= m.+1 + n
n: nat

n <= 0 + n
exact(leq_n n).
n, m: nat
IH: n <= m + n

n <= m.+1 + n
n, m: nat
IH: n <= m + n

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

n <= m + n
assumption. Defined.
n: nat

n <= 0 -> n = 0
n: nat

n <= 0 -> n = 0

0 <= 0 -> 0 = 0
n: nat
n.+1 <= 0 -> n.+1 = 0

0 <= 0 -> 0 = 0
reflexivity.
n: nat

n.+1 <= 0 -> n.+1 = 0
n: nat
H: n.+1 <= 0

n.+1 = 0
contradiction (not_leq_Sn_0 n). Defined.
n, m, k: nat

n - (m + k) = n - m - k
n, m, k: nat

n - (m + k) = n - m - k

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

forall m k : nat, 0 - (m + k) = 0 - m - k
reflexivity.
n: nat
IHn: forall m k : nat, n - (m + k) = n - m - k

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

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

n.+1 - (0 + k) = n.+1 - 0 - k
change (0 + k) with k; reflexivity.
n: nat
IHn: forall m k : nat, n - (m + k) = n - m - k
m, k: nat

n.+1 - (m.+1 + k) = n.+1 - m.+1 - k
change (m.+1 + k) with (m + k).+1; apply IHn. Defined. #[export] Hint Resolve subsubadd : nat.
n, m, k: nat

n - m - k = n - (m + k)
n, m, k: nat

n - m - k = n - (m + k)
auto with nat. Defined.
n, m: nat

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

n <= m.+1 -> ((n <= m) + (n = m.+1))%type

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

forall m : nat, 0 <= m.+1 -> ((0 <= m) + (0 = m.+1))%type
m: nat

0 <= m.+1 -> ((0 <= m) + (0 = m.+1))%type
m: nat
H: 0 <= m.+1

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

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

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

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

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

((n.+1 <= 0) + (n.+1 = 1))%type
right; apply ap; exact l.
n: nat
IHn: forall m : nat, n <= m.+1 -> ((n <= m) + (n = m.+1))%type
m: nat

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

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

((n.+1 <= m.+1) + (n.+1 = m.+2))%type
n: nat
IHn: forall m : nat, n <= m.+1 -> ((n <= m) + (n = m.+1))%type
m: nat
b: n = m.+1
((n.+1 <= m.+1) + (n.+1 = m.+2))%type
n: nat
IHn: forall m : nat, n <= m.+1 -> ((n <= m) + (n = m.+1))%type
m: nat
a: n <= m

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

n.+1 <= m.+1
apply leq_S_n'; exact a.
n: nat
IHn: forall m : nat, n <= m.+1 -> ((n <= m) + (n = m.+1))%type
m: nat
b: n = m.+1

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

n.+1 = m.+2
apply ap; exact b. Defined.
n, m: nat

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

n <= m -> n - m = 0
n: nat

n - n = 0
n, m: nat
l: n <= m
IHl: n - m = 0
n - m.+1 = 0
n: nat

n - n = 0
exact (sub_n_n n).
n, m: nat
l: n <= m
IHl: n - m = 0

n - m.+1 = 0
n, m: nat
l: n <= m
IHl: n - m = 0

n - (1 + m) = 0
m: nat
l: 0 <= m
IHl: 0 - m = 0

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

0 - (1 + m) = 0
reflexivity.
n, m: nat
l: n.+1 <= m
IHl: n.+1 - m = 0

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

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

n.+1 - m - 1 = 0
n, m: nat
l: n.+1 <= m
IHl: 0 = 0

0 - 1 = 0
reflexivity. Defined.
n, m: nat

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

n - m = 0 -> n <= m

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

forall m : nat, 0 - m = 0 -> 0 <= m
auto with nat.
n: nat
IHn: forall m : nat, n - m = 0 -> n <= m

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

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

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

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

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

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

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

n.+1 <= m.+1
apply leq_S_n', IHn, eq. Defined.
n, m: nat

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

n - m > 0 -> m < n
n, m: nat
ineq: n - m > 0

m < n
n, m: nat
ineq: n - m > 0
n_leq_m: n <= m

m < n
n, m: nat
ineq: n - m > 0
n_leq_m: n - m = 0

m < n
n, m: nat
ineq: n - m > 0
n_leq_m: n - m = 0

0 < 0
now rewrite n_leq_m in ineq. Defined.
n, m: nat

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

m < n -> 0 < n - m

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

forall m : nat, m < 0 -> 0 < 0 - m
m: nat
ineq: m < 0

0 < 0 - m
contradiction (not_lt_n_0 m).
n: nat
IHn: forall m : nat, m < n -> 0 < n - m

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

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

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

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

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

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

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

0 < n - m
now apply IHn in ineq. Defined.
n, m: nat

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

n <= m -> m - n + n = m

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

forall m : nat, 0 <= m -> m - 0 + 0 = m
m: nat
H: 0 <= m

m - 0 + 0 = m
m: nat
H: 0 <= m.+1

m.+1 - 0 + 0 = m.+1
m: nat
H: 0 <= m.+1

(m + 0).+1 = m.+1
apply (ap S), symmetric_paths, add_n_O.
n: nat
IHn: forall m : nat, n <= m -> m - n + n = m

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

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

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

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

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

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

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

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

m.+1 = m.+1
reflexivity. Defined.
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
g: m > n
n <= n - m + m
n, m: nat
l: m <= n

n <= n - m + m
destruct (symmetric_paths _ _ (natminuspluseq _ _ l)); constructor.
n, m: nat
g: m > n

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

n <= n - m + m
now destruct (symmetric_paths _ _ (sub_leq_0 n m _)). Defined.
n, m: nat

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

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

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

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

n <= m
assumption. Defined. #[export] Hint Rewrite -> natminuspluseq : nat. #[export] Hint Rewrite -> natminuspluseq' : nat.
n, m: nat

n <= m <~> {k : nat & k + n = m}
n, m: nat

n <= m <~> {k : nat & k + n = m}
n, m: nat

IsHProp {k : nat & k + n = m}
n, m: nat
n <= m -> {k : nat & k + n = m}
n, m: nat
{k : nat & k + n = m} -> n <= m
n, m: nat

IsHProp {k : nat & k + n = m}
n, m: nat

forall x y : {k : nat & k + n = m}, x = y
n, m, x: nat
p: x + n = m
y: nat
q: y + n = m

(x; p) = (y; q)
n, m, x: nat
p: x + n = m
y: nat
q: y + n = m
r:= summand_is_sub x m n p @ (summand_is_sub y m n q)^: x = y

(x; p) = (y; q)
n, m, x: nat
p, q: x + n = m

(x; p) = (x; q)
n, m, x: nat
p, q: x + n = m

p = q
apply path_ishprop.
n, m: nat

n <= m -> {k : nat & k + n = m}
n, m: nat
p: n <= m

{k : nat & k + n = m}
n, m: nat
p: n <= m

m - n + n = m
apply natminuspluseq, p.
n, m: nat

{k : nat & k + n = m} -> n <= m
n, m, k: nat
p: k + n = m

n <= m
n, k: nat

n <= k + n
apply leq_add. Defined. #[export] Hint Resolve leq_S_n' : nat. Ltac leq_S_n_in_hypotheses := match goal with | [ H : ?n.+1 <= ?m.+1 |- _ ] => apply leq_S_n in H | [ H : ?n < ?m.+1 |- _ ] => apply leq_S_n in H | [ H : ?m.+1 > ?n |- _ ] => apply leq_S_n in H | [ H : ?m.+1 >= ?n.+1 |- _ ] => apply leq_S_n in H end. #[export] Hint Extern 4 => leq_S_n_in_hypotheses : nat.
n, m, k: nat

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

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

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

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

n + 0 <= m + 0
destruct (add_n_O n), (add_n_O m); exact l.
n, m: nat
l: n <= m
k: nat
IHk: n + k <= m + k

n + k.+1 <= m + k.+1
destruct (nat_add_n_Sm n k), (nat_add_n_Sm m k); apply leq_S_n'; exact IHk. Defined. #[export] Hint Resolve nataddpreservesleq : nat.
n, m, k: nat

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

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

n <= m -> n + k <= m + k
exact nataddpreservesleq. Defined. #[export] Hint Resolve nataddpreservesleq' : nat.
n, m, k: nat

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

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

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

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

forall n : nat, n <= m -> n + k <= m + k
n, m, k, n': nat
l: n' <= m

n' + k <= m + k
n, m, n': nat
l: n' <= m

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

n' + 0 <= m + 0
destruct (add_n_O n'), (add_n_O m); exact l.
n, m, n': nat
l: n' <= m
k: nat
IHk: n' + k <= m + k

n' + k.+1 <= m + k.+1
destruct (nat_add_n_Sm n' k), (nat_add_n_Sm m k); apply leq_S_n'; exact IHk. Defined.
n, m, k: nat

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

n < m -> k + n < k + m
destruct (symmetric_paths _ _ (nat_add_comm k n)), (symmetric_paths _ _ (nat_add_comm k m)); exact nataddpreserveslt. Defined.
n, m, k: nat

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

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

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

n + 0 < m + 0 -> n < m
destruct (add_n_O n), (add_n_O m); trivial.
n, m, k: nat
IHk: n + k < m + k -> n < m

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

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

n < m
apply leq_S_n, IHk in l; exact l. Defined.
n, m, k: nat

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

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

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

0 + k <= m + k -> 0 <= m
intros ?; apply leq_0_n.
n, m, k: nat

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

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

n.+1 <= m
now apply (@nataddreflectslt n m k). Defined.
n, m, k: nat

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

k + n < k + m -> n < m
destruct (symmetric_paths _ _ (nat_add_comm k n)), (symmetric_paths _ _ (nat_add_comm k m)); exact nataddreflectslt. Defined.
n, m, k: nat

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

k + n <= k + m -> n <= m
destruct (symmetric_paths _ _ (nat_add_comm k n)), (symmetric_paths _ _ (nat_add_comm k m)); exact nataddreflectsleq. Defined.
n, m, k: nat

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

k <= m -> n - k <= m - k -> n <= m
n, m, k: nat
ineq1: k <= m
ineq2: n - k <= m - k

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

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

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

m - k + k <= m
destruct (symmetric_paths _ _ (natminuspluseq k m ineq1)); easy. Defined.
k, m: nat

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

k <= m -> m.+1 - k = (m - k).+1

forall m : nat, 0 <= m -> m.+1 - 0 = (m - 0).+1
k: nat
IHk: forall m : nat, k <= m -> m.+1 - k = (m - k).+1
forall m : nat, k.+1 <= m -> m.+1 - k.+1 = (m - k.+1).+1

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

m.+1 = (m - 0).+1
destruct m; reflexivity.
k: nat
IHk: forall m : nat, k <= m -> m.+1 - k = (m - k).+1

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

k.+1 <= 0 -> 1 - k.+1 = (0 - k.+1).+1
k: nat
IHk: forall m : nat, k <= m -> m.+1 - k = (m - k).+1
m: nat
k.+1 <= m.+1 -> m.+2 - k.+1 = (m.+1 - k.+1).+1
k: nat
IHk: forall m : nat, k <= m -> m.+1 - k = (m - k).+1

k.+1 <= 0 -> 1 - k.+1 = (0 - k.+1).+1
simpl; intro g; contradiction (not_leq_Sn_0 _ g).
k: nat
IHk: forall m : nat, k <= m -> m.+1 - k = (m - k).+1
m: nat

k.+1 <= m.+1 -> m.+2 - k.+1 = (m.+1 - k.+1).+1
k: nat
IHk: forall m : nat, k <= m -> m.+1 - k = (m - k).+1
m: nat
l: k <= m

m.+2 - k.+1 = (m.+1 - k.+1).+1
k: nat
IHk: forall m : nat, k <= m -> m.+1 - k = (m - k).+1
m: nat
l: k <= m

m.+1 - k = (m.+1 - k.+1).+1
k: nat
IHk: forall m : nat, k <= m -> m.+1 - k = (m - k).+1
m: nat
l: k <= m

m.+1 - k = (m - k).+1
exact (IHk _ l). Defined.
n, m, k: nat

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

k <= m -> n + (m - k) = n + m - k
n: nat

forall m k : nat, k <= m -> n + (m - k) = n + m - k

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

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

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

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

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

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

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

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

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

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

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

k <= m
assumption. Defined.
n, m, k: nat

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

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

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

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

n - m + k = k + (n - m)
apply nat_add_comm. Defined.
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; [ apply leq_n | apply leq_S; apply leq_n ].
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_n.
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.
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 (add_n_O n), (add_n_O (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
now apply leq_S_n'. Defined.
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.
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_n_0 _ _).
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_0_n.
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
apply (IHn m i l). Defined.
n, m, k, z: nat

k <= m -> n + (m - k) = z -> n + m - k = z
n, m, k, z: nat

k <= m -> n + (m - k) = z -> n + m - k = z
n, m, k, z: nat
H: k <= m

n + (m - k) = z -> n + m - k = z
destruct (symmetric_paths _ _ (nataddsub_assoc n H)); done. Defined. #[export] Hint Resolve nataddsub_assoc_implication : nat.
n, k: nat

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

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

k + (n - k) = n
destruct (symmetric_paths _ _ (nataddsub_assoc k H)); destruct (nat_add_comm n k); exact (add_n_sub_n_eq _ _). Defined. #[export] Hint Resolve nat_add_sub_eq : nat.
n: nat

n - 1 = pred n
n: nat

n - 1 = pred n

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

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

n.+1 - 1 = pred n.+1
apply sub_n_0. Defined.
n: nat

pred n <= n
n: nat

pred n <= n
case n; [ apply leq_n | intro; apply leq_S; apply leq_n]. Defined. #[export] Hint Resolve predn_leq_n : nat.
n, i: nat

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

i < n -> (pred n).+1 = n
i: nat
l: i < 0

(pred 0).+1 = 0
i, n: nat
IH: i < n -> (pred n).+1 = n
l: i < n.+1
(pred n.+1).+1 = n.+1
i: nat
l: i < 0

(pred 0).+1 = 0
contradiction (not_lt_n_0 i).
i, n: nat
IH: i < n -> (pred n).+1 = n
l: i < n.+1

(pred n.+1).+1 = n.+1
reflexivity. Defined. #[export] Hint Rewrite S_predn : nat. #[export] Hint Rewrite <- pred_Sn : nat. #[export] Hint Resolve S_predn : nat. #[export] Hint Resolve leq_n_pred : nat.
k, n: nat

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

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

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

k < (pred 0).+1
contradiction (not_lt_n_0 _ _).
k, n: nat
ineq: k < n.+1

k < (pred n.+1).+1
assumption. Defined.
n: nat

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

n <= (pred n).+1
destruct n; auto. Defined.
i, n, k: nat

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

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

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

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

n.+1 <= k -> pred n.+1 < k
intro; assumption. Defined.
n, k: nat

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

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

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

0 <= k
apply leq_0_n.
n, k: nat
l: pred n.+1 < k

n.+1 <= k
assumption. Defined.
i, j: nat

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

i < j -> i <= pred j
intro l; apply leq_n_pred in l; assumption. Defined. #[export] Hint Resolve lt_implies_pred_geq : nat.
i, j, k: nat

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

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

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

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

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

k <= pred j.+1
now simpl; apply leq_S_n. Defined. #[export] Hint Resolve lt_implies_pred_geq : nat.
i, j: nat

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

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

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

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

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

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

i.+1 < j
i, j: nat
ineq: i < pred j
H: i.+2 <= j
X: i < j

i.+1 < j
assumption. Defined.
i, n: nat
p: i < n
m: nat

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

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

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

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

n.+1 <= (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 <= (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.
n, m, k: nat

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

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

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

n <= m -> n - 0 <= m - 0
destruct (symmetric_paths _ _ (sub_n_0 n)), (symmetric_paths _ _ (sub_n_0 m)); done.
n, m, k: nat
IHk: n <= m -> n - k <= m - k

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

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

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

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

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

n - k - 1 <= m - k - 1
n, m, k: nat
IHk: n <= m -> n - k <= m - k
l: n <= m

pred (n - k) <= m - k - 1
n, m, k: nat
IHk: n <= m -> n - k <= m - k
l: n <= m

pred (n - k) <= pred (m - k)
n, m, k: nat
IHk: n <= m -> n - k <= m - k
l: n <= m

n <= m
exact l. Defined. #[export] Hint Resolve natsubpreservesleq : nat.
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_0_n.
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_n.
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_S, leq_n]. Defined. #[export] Hint Resolve sub_less : nat. #[export] Hint Resolve leq_S_n' : nat.
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_S_n', sub_less. Defined.
k, m, n: nat

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

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

k - n < m
k, m, n: nat
l: n <= k
q: k < n + m
q': k - n + n < m + n

k - n < m
exact (nataddreflectslt q'). Defined. #[export] Hint Resolve natpmswap1 : nat.
k, m, n: nat

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

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

k <= n + m
k, m, n: nat
l: n <= k
q: n + (k - n) <= n + m

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

k <= n + m
destruct (symmetric_paths _ _ (add_n_sub_n_eq' k n)) in q; assumption. Defined. #[export] Hint Resolve natpmswap2 : nat.
k, m, n: nat

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

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

k + m <= n
k, m, n: nat
ineq: k <= n
qe: k + m <= k + (n - k)

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

k + m <= n
destruct (symmetric_paths _ _ (add_n_sub_n_eq' n k)) in qe; assumption. Defined. #[export] Hint Resolve natpmswap3 : nat.
k, m, n: nat

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

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

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

k < m + n
now apply (mixed_trans1 k (k - n + n) (m + n) (nat_sub_add_ineq _ _)). Defined. #[export] Hint Resolve natpmswap4 : nat.
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 (n_leq_add_n_k m k). Defined.
n, n', m, m': nat

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

n <= m -> n' <= m' -> n + n' <= m + m'

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

forall n' m m' : nat, 0 <= m -> n' <= m' -> 0 + n' <= m + m'
n', m, m': nat
l: 0 <= m
l': n' <= m'

0 + n' <= m + m'
n', m, m': nat
l: 0 <= m
l': n' <= m'

n' <= m + m'
n', m, m': nat
l: 0 <= m
l': n' <= m'

m' <= m + m'
exact (n_leq_add_n_k' m' m).
n: nat
IHn: forall n' m m' : nat, n <= m -> n' <= m' -> n + n' <= m + m'

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

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

forall m' : nat, n.+1 <= 0 -> n' <= m' -> n.+1 + n' <= 0 + m'
n: nat
IHn: forall n' m m' : nat, n <= m -> n' <= m' -> n + n' <= m + m'
n', m': nat
H: n.+1 <= 0
H0: n' <= m'

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

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

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

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

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

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

n <= m
exact l.
n: nat
IHn: forall n' m m' : nat, n <= m -> n' <= m' -> n + n' <= m + m'
n', m, m': nat
l: n <= m
l': n' <= m'

n' <= m'
exact l'. Defined. #[export] Hint Resolve nat_add_bifunctor : nat. #[export] Hint Resolve nataddpreserveslt : nat. #[export] Hint Resolve nataddpreservesleq' : nat. #[export] Hint Resolve nataddpreserveslt' : nat. #[export] Hint Resolve natineq0eq0 : nat. #[export] Hint Resolve n_leq_add_n_k : nat. #[export] Hint Resolve n_leq_m_n_leq_plus_m_k : nat. #[export] Hint Immediate add_n_sub_n_eq : nat. #[export] Hint Immediate add_n_sub_n_eq' : nat. #[export] Hint Rewrite <- add_n_O : nat. #[export] Hint Rewrite -> add_O_n : nat. #[export] Hint Rewrite -> add_n_sub_n_eq : nat. #[export] Hint Rewrite -> add_n_sub_n_eq' : nat. #[export] Hint Rewrite -> nataddsub_assoc : nat. Ltac autorewrite_or_fail := progress ltac:(autorewrite with nat). #[export] Hint Extern 7 => autorewrite_or_fail : nat.
P: nat -> Type

(forall n : nat, (forall m : nat, m < n -> P m) -> P n) -> forall n : nat, P n
P: nat -> Type

(forall n : nat, (forall m : nat, m < n -> P m) -> P n) -> forall n : nat, P n
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n

forall n : nat, P n
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n

forall n m : nat, m < n -> P m
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
X: forall n m : nat, m < n -> P m
forall n : nat, P n
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n

forall n m : nat, m < n -> P m
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n

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

forall m : nat, m < 0 -> P m
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
m: nat
l: m < 0

P m
contradiction (not_lt_n_0 m).
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
n: nat
IHn: forall m : nat, m < n -> P m

forall m : nat, m < n.+1 -> P m
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
n: nat
IHn: forall m : nat, m < n -> P m
m: nat
l: m < n.+1

P m
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
n: nat
IHn: forall m : nat, m < n -> P m
m: nat
l: m <= n

P m
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
m: nat
IHn: forall m0 : nat, m0 < m -> P m0

P m
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
n: nat
IHn: forall m : nat, m < n.+1 -> P m
m: nat
l: m <= n
P m
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
m: nat
IHn: forall m0 : nat, m0 < m -> P m0

P m
apply a; intros ? ?; now apply IHn.
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
n: nat
IHn: forall m : nat, m < n.+1 -> P m
m: nat
l: m <= n

P m
now apply (IHn m), leq_S_n'.
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
X: forall n m : nat, m < n -> P m

forall n : nat, P n
P: nat -> Type
a: forall n : nat, (forall m : nat, m < n -> P m) -> P n
X: forall n m : nat, m < n -> P m
n: nat

P n
apply (X (n.+1) n), (leq_n n.+1). 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
now 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; now constructor.
n, m: nat
IHn: increasing_geq n m.+1
IHIHn: increasing_geq n.+1 m.+1

increasing_geq n.+1 m
constructor; now 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 _ _ (sub_n_0 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 (pred (n - k))
n, k: nat
IHk: increasing_geq n (n - k)
g: n > k

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

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

increasing_geq n (pred (n - k)).+1
now (destruct (symmetric_paths _ _ (S_predn (n - k) 0 _))). 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_n_0 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
apply (nataddsub_assoc_lemma _). 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 _ _ (sub_n_0 m)), (symmetric_paths _ _ (sub_n_n 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 - 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 - 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: pred (m - n) < m

m - 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: pred (m - n) < m

(m - (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: pred (m - n) < m

(m - (m - n)).+1 = n.+1
apply (ap S), IHn, leq_S', 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_S' _ _ _). Defined. (** 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 (not_lt_n_n m (@mixed_trans2 _ _ _ 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.