(def-theory-ensemble-multiple metric-spaces 3)
(def-theory-ensemble-instances metric-spaces
(permutations (0 1) (1 2) (0 2))
(target-multiple 3))
(def-theory-ensemble-overloadings metric-spaces (1 2))
(def-theorem general-composition-of-continuous-functions
"forall(f:[pp_0,pp_1],g:[pp_1,pp_2],x:pp_0,continuous%at%point(f,x) and continuous%at%point(g,f(x)) implies continuous%at%point(g oo f,x))"
(theory metric-spaces-3-tuples)
(proof
(
unfold-defined-constants
beta-reduce-with-minor-premises
direct-and-antecedent-inference-strategy
(auto-instantiate-universal-antecedent "with(p:prop,forall(eps:rr, 0<eps implies p))")
(instantiate-universal-antecedent "with(p:prop,forall(eps:rr, 0<eps implies p))" ("delta_$0"))
(instantiate-existential ("delta"))
(backchain "forall(y_$0:pp_1,dist_1(f(x),y_$0)<=delta_$0
implies
dist_2(g(f(x)),g(y_$0))<=eps_$0)")
(backchain "forall(y:pp_0,
dist_0(x,y)<=delta implies dist_1(f(x),f(y))<=delta_$0)")
(cut-with-single-formula "dist_1(f(x),f(y_$0))<=delta_$0")
(instantiate-universal-antecedent "with(p:prop, forall(eps:rr, 0<eps implies p))" ("1"))
(simplify-antecedent "not(0<1);")
(cut-with-single-formula "dist_1(f(x),f(x))<=1")
(backchain "forall(y:pp_0,dist_0(x,y)<=delta implies dist_1(f(x),f(y))<=1)")
(apply-macete-with-minor-premises tr%zero-self-distance)
simplify
)
(usages transportable-macete)))