(def-recursive-constant iterate
"lambda(iter:[zz,ind_1], f:[ind_1,ind_1],x:ind_1,
lambda(n:zz, if(n=0,x,f(iter(n-1)))))"
(theory generic-theory-1)
(definition-name iterate))
(def-theorem iterate-definedness
"forall(f:[ind_1,ind_1],x:ind_1,z:zz,
total_q{f,[ind_1,ind_1]} and 0<=z implies #(iterate(f,x)(z)))"
(theory generic-theory-1)
(usages transportable-macete)
(proof
(
(induction integer-inductor ())
)))
(def-theorem undefined-for-negative
"forall(n:zz,x:ind_1,f:[ind_1,ind_1],n<0 implies not(#(iterate(f,x)(n))))"
(theory generic-theory-1)
(usages transportable-macete)
(proof
(
(instantiate-theorem iterate-minimality_generic-theory-1 ("f" "x"))
(instantiate-universal-antecedent "with(f:[ind_1,ind_1],x:ind_1,
forall(h_0:[zz,ind_1],
h_0=lambda(n:zz,if(n=0, x, f(h_0(n-1))))
implies
forall(u_0:zz,
#(iterate(f,x)(u_0))
implies
iterate(f,x)(u_0)=h_0(u_0))));" ("lambda(n:zz,if(n<0,?ind_1,iterate(f,x)(n)))"))
(contrapose "with(p:prop, not(p))")
extensionality
direct-inference
(unfold-single-defined-constant (0) iterate)
(case-split ("x_0<0"))
simplify
simplify
direct-inference
(backchain "with(p:prop, t:ind_1, forall(u:zz, #(t) implies p))")
simplify
)))
(def-theorem iterate-translate
"forall(n:zz,x:ind_1,f:[ind_1,ind_1],
f oo (iterate(f,x))=lambda(n:zz,if(n=[-1],?ind_1,iterate(f,x)(n+1))))"
(theory generic-theory-1)
(usages transportable-macete)
(proof
(
direct-inference
(unfold-single-defined-constant (1) iterate)
extensionality
direct-inference
simplify-insistently
(instantiate-theorem undefined-for-negative ("x_0" "x" "f"))
simplify
simplify
))
)
(def-theorem iterate-totality
"total_q{iterate,[[ind_1,ind_1],ind_1,[zz,ind_1]]}"
(theory generic-theory-1)
(usages d-r-convergence transportable-macete)
(proof
(
insistent-direct-inference
(unfold-single-defined-constant (0) iterate)
)))