(def-language bird-language (base-types elem value))
(def-theory bird (language bird-language) (component-theories h-o-real-arithmetic))
(def-translation seq->bird (source sequences) (target bird) (fixed-theories h-o-real-arithmetic) (sort-pairs (ind_1 elem)) (theory-interpretation-check using-simplification))
(def-constant map "lambda(f:[elem_0,elem_1], lambda(s:[nn,elem_0], lambda(m:nn, f(s(m)))))" (theory bird-2-tuples))
(def-theorem map-means-compose "forall(f:[elem_0,elem_1], s:[nn,elem_0], map(f)(s)=f oo s)" (theory bird-2-tuples) (usages transportable-macete) )
(def-theorem domain-of-total-map "forall(f:[elem_0,elem_1], s:[nn,elem_0], total_q{f,[elem_0,elem_1]} implies dom{map(f)(s)}=dom{s})" (theory bird-2-tuples) (usages transportable-macete) )
(def-theorem map-f-is-total "forall(y:[nn,elem_0],f:[elem_0,elem_1], #(map(f)(y)))" (theory bird-2-tuples) (usages rewrite transportable-rewrite) )
(def-theorem domain-of-almost-total-map "forall(f:[elem_0,elem_1], s:[nn,elem_0], forall(x:elem_0, x in ran{s} implies #(f(x))) implies dom{map(f)(s)}=dom{s})" (theory bird-2-tuples) (usages transportable-macete) (proof "$theories/bird/proofs/domain-of-almost-total-map.t"))
(def-theorem map-through-nil "forall(f:[elem_0,elem_1], map(f)(nil{elem_0})=nil{elem_1})" (theory bird-2-tuples) (usages transportable-macete transportable-rewrite rewrite) )
(def-theorem map-totality "total_q{map,[[elem_0,elem_1],[[nn,elem_0],[nn,elem_1]]]}" (theory bird-2-tuples) (usages d-r-convergence) )
(def-theorem map-cons "forall(f:[elem_0,elem_1], s:[nn,elem_0], a:elem_0, map(f)(cons{a,s})=cons{f(a),map(f)(s)})" (theory bird-2-tuples) (usages rewrite transportable-rewrite) (proof "$theories/bird/proofs/map-cons.t"))
(def-inductor elem-sequence-inductor sequence-induction (theory bird) (translation seq->bird) (base-case-hook simplify))
(def-inductor elem_0-sequence-inductor sequence-induction-for-elem-sequence-inductor (theory bird-0) (translation bird-to-bird-0) (base-case-hook simplify))
(def-theorem map-append "forall(f:[elem_0,elem_1],x,y:[nn,elem_0], f_seq_q{x} and total_q{f,[elem_0,elem_1]} implies map(f)(append{x,y})=append{map(f)(x), map(f)(y)})" (theory bird-2-tuples) (usages transportable-macete) (proof "$theories/bird/proofs/map-append.t"))
(def-theory-ensemble-instances bird (multiples 2) (target-multiple 3)) (theory-ensemble-install-overloadings-for-defined-constants bird-ensemble 3)
(def-theorem map-distributes-over-composition "forall(f:[elem_0,elem_1], g:[elem_1,elem_2], map(g oo f) = (map(g)) oo (map(f)))" (theory bird-3-tuples) (usages transportable-macete) (proof "$theories/bird/proofs/map-comp-distributes.t"))
(def-theorem map-inverse "forall(f:[elem_0,elem_1], injective_q{f} and surjective_q{f} implies inverse{map(inverse{f})} = map(f) )" (theory bird-3-tuples) (usages transportable-macete) (proof "$theories/bird/proofs/map-inverse.t"))
(def-theorem map-inverse-1 "forall(f:[elem_0,elem_1], injective_q{f} and surjective_q{f} implies inverse{map(f)} = map(inverse{f}))" (theory bird-3-tuples) (usages transportable-macete) (proof "$theories/bird/proofs/map-inverse-1.t")) (pop-current-syntax) (pop-current-theory)