let Prim = (\X => [ Var: Nat , Lit: Nat , Suc: X , Abs: X , App: , Unit: <> , Pair: , Fst: X , Snd: X , Absurd: , Inl: X , Inr: X , Case: , Expand: X , Contract: X , Fold: , Let: , Annot: < Term: X , Type: (\Y => [ Var: Nat , N: <> , Arrow: , Unit: <> , Pair: , Bottom: <> , Sum: , Fix: Y ]) > ]) in let lift (f : Nat -> Nat) (x : Nat) : Nat = case !x of { Z u => 0 ; S n => suc (f n) } in let rename (t : Prim) : (Nat -> Nat) -> Prim = foldcase t by { Var n => \f => ~(Var (f n)) ; Lit n => \f => ~(Lit n) ; Suc t => \f => ~(Suc (t f)) ; Abs t => \f => ~(Abs (t (lift f))) ; App p => \f => ~(App ) ; Unit u => \f => ~(Unit u) ; Pair p => \f => ~(Pair ) ; Fst t => \f => ~(Fst (t f)) ; Snd t => \f => ~(Snd (t f)) ; Absurd p => \f => ~(Absurd ) ; Inl t => \f => ~(Inl (t f)) ; Inr t => \f => ~(Inr (t f)) ; Case p => \f => ~(Case ) ; Expand t => \f => ~(Expand (t f)) ; Contract t => \f => ~(Contract (t f)) ; Fold p => \f => ~(Fold ) ; Let p => \f => ~(Let ) ; Annot p => \f => ~(Annot ) } in \p => foldcase p by { Var n => ~(Var n) ; Zero u => ~(Lit 0) ; Suc e => ~(Suc e) ; Abs e => ~(Abs e) ; App p => ~(App p) ; Rec p => ~(Fold < Target: p.Target , Body: ~(Case < Target: ~(Var 0) , Left: rename p.Zero (\x => suc (suc x)) , Right: rename p.Suc (lift suc) >) >) }