Definition plusnb (y x: nat) (nb: natBelow x): natBelow (x + y) :=
  match nb in natBelow x' return natBelow (x' + y) with
  | mkNatBelow a b => eq_rec_r natBelow (mkNatBelow a (b + y)) (eq_S _ _ (plus_assoc_reverse a b y))
  end.

Lemma nats_plus x n y: nats n (x + y) = map (fun nb => eq_rec_r natBelow nb (plus_assoc n x y)) (app (map (@plusnb y _) (nats n x)) (nats (n + x) y)).