+qed-.
+
+(* Elimination principles ***************************************************)
+
+fact ynat_ind_lt_le_aux: ∀R:predicate ynat.
+ (∀y. (∀x. x < y → R x) → R y) →
+ ∀y:nat. ∀x. x ≤ y → R x.
+#R #IH #y elim y -y
+[ #x #H >(yle_inv_O2 … H) -x
+ @IH -IH #x #H elim (ylt_yle_false … H) -H //
+| /5 width=3 by ylt_yle_trans, ylt_fwd_succ2/
+]
+qed-.
+
+fact ynat_ind_lt_aux: ∀R:predicate ynat.
+ (∀y. (∀x. x < y → R x) → R y) →
+ ∀y:nat. R y.
+/4 width=2 by ynat_ind_lt_le_aux/ qed-.
+
+lemma ynat_ind_lt: ∀R:predicate ynat.
+ (∀y. (∀x. x < y → R x) → R y) →
+ ∀y. R y.
+#R #IH * /4 width=1 by ynat_ind_lt_aux/
+@IH #x #H elim (ylt_inv_Y2 … H) -H
+#n #H destruct /4 width=1 by ynat_ind_lt_aux/
+qed-.
+
+fact ynat_f_ind_aux: ∀A. ∀f:A→ynat. ∀R:predicate A.
+ (∀x. (∀a. f a < x → R a) → ∀a. f a = x → R a) →
+ ∀x,a. f a = x → R a.
+#A #f #R #IH #x @(ynat_ind_lt … x) -x
+/3 width=3 by/
+qed-.
+
+lemma ynat_f_ind: ∀A. ∀f:A→ynat. ∀R:predicate A.
+ (∀x. (∀a. f a < x → R a) → ∀a. f a = x → R a) → ∀a. R a.
+#A #f #R #IH #a
+@(ynat_f_ind_aux … IH) -IH [2: // | skip ]
+qed-.