+
+lemma yle_inv_monotonic_plus_dx_inj: ∀x,y:ynat.∀z:nat. x + z ≤ y + z → x ≤ y.
+#x #y #z elim z -z /3 width=1 by yle_inv_succ/
+qed-.
+
+lemma yle_inv_monotonic_plus_sn_inj: ∀x,y:ynat.∀z:nat. z + x ≤ z + y → x ≤ y.
+/2 width=2 by yle_inv_monotonic_plus_dx_inj/ qed-.
+
+lemma yle_inv_monotonic_plus_dx: ∀x,y,z. z < ∞ → x + z ≤ y + z → x ≤ y.
+#x #y #z #Hz elim (ylt_inv_Y2 … Hz) -Hz #m #H destruct
+/2 width=2 by yle_inv_monotonic_plus_sn_inj/
+qed-.
+
+lemma yle_inv_monotonic_plus_sn: ∀x,y,z. z < ∞ → z + x ≤ z + y → x ≤ y.
+/2 width=3 by yle_inv_monotonic_plus_dx/ qed-.
+
+lemma yle_fwd_plus_ge: ∀m1,m2:nat. m2 ≤ m1 → ∀n1,n2:ynat. m1 + n1 ≤ m2 + n2 → n1 ≤ n2.
+#m1 #m2 #Hm12 #n1 #n2 #H
+lapply (monotonic_yle_plus … Hm12 … H) -Hm12 -H
+/2 width=2 by yle_inv_monotonic_plus_sn_inj/
+qed-.
+
+lemma yle_fwd_plus_ge_inj: ∀m1:nat. ∀m2,n1,n2:ynat. m2 ≤ m1 → m1 + n1 ≤ m2 + n2 → n1 ≤ n2.
+#m2 #m1 #n1 #n2 #H elim (yle_inv_inj2 … H) -H
+#x #H0 #H destruct /3 width=4 by yle_fwd_plus_ge, yle_inj/
+qed-.
+
+lemma yle_fwd_plus_yge: ∀n2,m1:ynat. ∀n1,m2:nat. m2 ≤ m1 → m1 + n1 ≤ m2 + n2 → n1 ≤ n2.
+* // #n2 * /2 width=4 by yle_fwd_plus_ge_inj/
+qed-.
+
+(* Properties on strict order ***********************************************)
+
+lemma ylt_plus_dx1_trans: ∀x,z. z < x → ∀y. z < x + y.
+/2 width=3 by ylt_yle_trans/ qed.
+
+lemma ylt_plus_dx2_trans: ∀y,z. z < y → ∀x. z < x + y.
+/2 width=3 by ylt_yle_trans/ qed.
+
+lemma monotonic_ylt_plus_dx_inj: ∀x,y. x < y → ∀z:nat. x + yinj z < y + yinj z.
+#x #y #Hxy #z elim z -z /3 width=1 by ylt_succ/
+qed.
+
+lemma monotonic_ylt_plus_sn_inj: ∀x,y. x < y → ∀z:nat. yinj z + x < yinj z + y.
+/2 width=1 by monotonic_ylt_plus_dx_inj/ qed.
+
+lemma monotonic_ylt_plus_dx: ∀x,y. x < y → ∀z. z < ∞ → x + z < y + z.
+#x #y #Hxy #z #Hz elim (ylt_inv_Y2 … Hz) -Hz
+#m #H destruct /2 width=1 by monotonic_ylt_plus_dx_inj/
+qed.
+
+lemma monotonic_ylt_plus_sn: ∀x,y. x < y → ∀z. z < ∞ → z + x < z + y.
+/2 width=1 by monotonic_ylt_plus_dx/ qed.
+
+lemma monotonic_ylt_plus_inj: ∀m1,m2. m1 < m2 → ∀n1,n2. yinj n1 ≤ n2 → m1 + n1 < m2 + n2.
+/3 width=3 by monotonic_ylt_plus_sn_inj, monotonic_yle_plus_sn, ylt_yle_trans/
+qed.
+
+lemma monotonic_ylt_plus: ∀m1,m2. m1 < m2 → ∀n1. n1 < ∞ → ∀n2. n1 ≤ n2 → m1 + n1 < m2 + n2.
+#m1 #m2 #Hm12 #n1 #H elim (ylt_inv_Y2 … H) -H #m #H destruct /2 width=1 by monotonic_ylt_plus_inj/
+qed.
+
+(* Forward lemmas on strict order *******************************************)
+
+lemma ylt_inv_monotonic_plus_dx: ∀x,y,z. x + z < y + z → x < y.
+* [2: #y #z >yplus_comm #H elim (ylt_inv_Y1 … H) ]
+#x * // #y * [2: #H elim (ylt_inv_Y1 … H) ]
+/4 width=3 by ylt_inv_inj, ylt_inj, lt_plus_to_lt_l/
+qed-.
+
+lemma ylt_fwd_plus_ge: ∀m1,m2. m2 ≤ m1 → ∀n1,n2. m1 + n1 < m2 + n2 → n1 < n2.
+#m1 #m2 #Hm12 #n1 #n2 #H elim (ylt_fwd_gen … H)
+#x #H0 elim (yplus_inv_inj … H0) -H0
+#y #z #_ #H2 #H3 destruct -x
+elim (yle_inv_inj2 … Hm12)
+#x #_ #H0 destruct
+lapply (monotonic_ylt_plus … H … Hm12) -H -Hm12
+/2 width=2 by ylt_inv_monotonic_plus_dx/
+qed-.
+
+(* Properties on predeccessor ***********************************************)
+
+lemma yplus_pred1: ∀x,y:ynat. 0 < x → ⫰x + y = ⫰(x+y).
+#x * // #y elim y -y // #y #IH #Hx
+>yplus_S2 >yplus_S2 >IH -IH // >ylt_inv_O1
+/2 width=1 by ylt_plus_dx1_trans/
+qed-.
+
+lemma yplus_pred2: ∀x,y:ynat. 0 < y → x + ⫰y = ⫰(x+y).
+/2 width=1 by yplus_pred1/ qed-.