Definition singles (y z x : nat) := if Dec (x = y) then z else x.Notation "f ∘ g" := (fun_comp f g) (at level 20).Definition ren_ctx {b : logic} f := map (ren f).Definition fun_comp {X Y Z} (f : Y -> Z) (g : X -> Y) x := f (g x).

(* Specifications: *)
Lemma ren_id_t t : ren_t (fun x => x) t = t.
Lemma ren_id {b : logic} t : ren (fun x => x) t = t.
Lemma ren_ctx_id {b : logic} A : ren_ctx (fun x => x) A = A.
Lemma ren_comp_t rho1 rho2 t : ren_t rho1 (ren_t rho2 t) = ren_t (rho1 ∘ rho2) t.
Lemma ren_comp {b : logic} rho1 rho2 phi : ren rho1 (ren rho2 phi) = ren (rho1 ∘ rho2) phi.
Lemma ren_comp_ctx {b : logic} rho1 rho2 A : ren_ctx rho1 (ren_ctx rho2 A) = ren_ctx (rho1 ∘ rho2) A.
Lemma ren_ext_t t rho1 rho2 : (forall p, p el consts_t t -> rho1 p = rho2 p) -> ren_t rho1 t = ren_t rho2 t.
Lemma ren_ext {b : logic} phi rho1 rho2 : (forall p, p el consts phi -> rho1 p = rho2 p) -> ren rho1 phi = ren rho2 phi.
Lemma ren_ext_ctx {b : logic} B rho1 rho2 : (forall p, p el consts_l B -> rho1 p = rho2 p) -> ren_ctx rho1 B = ren_ctx rho2 B.
Lemma ren_subst_t {b : logic} rho x t s : ren_t rho (subst_t x t s) = subst_t x (ren_t rho t) (ren_t rho s).