open subtype nat constant f : Π (a : nat), {b : nat | b > a} → nat definition f_flat (a : nat) (b : nat) (p : b > a) : nat := f a (tag b p) definition greater [reducible] (a : nat) := {b : nat | b > a} set_option blast.recursion.structure true definition f_flat_def [simp] (a : nat) (b : nat) (p : b > a) : f a (tag b p) = f_flat a b p := rfl definition has_property_tag [simp] {A : Type} {p : A → Prop} (a : A) (h : p a) : has_property (tag a h) = h := rfl lemma to_f_flat : ∀ (a : nat) (b : greater a), f a b = f_flat a (elt_of b) (has_property b) := by rec_simp