```
(def-theory monoids-with-index-set
(component-theories commutative-monoid-theory generic-theory-1))
```

```
(def-constant monoid%prod%unordered
"lambda(s:sets[ind_1], f:[ind_1,uu],
iota(a:uu, forsome(m,n:zz,phi:[zz,ind_1], injective_q{phi}
and
zz%interval(m,n) subseteq dom{phi}
and
image{phi,zz%interval(m,n)} = s
and
a=monoid%prod(m,n,f oo phi))))"
(theory monoids-with-index-set))
```

```
(def-theorem general-commutative-law-corollary-1
"forall(a,b,c,d:zz, phi:[zz,zz], f:[zz,uu],
zz%interval(c,d) subseteq dom{phi} and
injective_q{phi} and
image{phi,zz%interval(c,d)}=zz%interval(a,b)
implies
monoid%prod(c,d,f oo phi) == monoid%prod(a,b,f))"
lemma
(theory commutative-monoid-theory)
(usages transportable-macete)
(proof
(
direct-and-antecedent-inference-strategy
(case-split ("c<=d"))
(apply-macete-with-minor-premises general-commutative-law-corollary)
direct-and-antecedent-inference-strategy
(cut-with-single-formula "not(a<=b)")
unfold-defined-constants
simplify
(contrapose "with(d,c:zz,not(c<=d));")
(incorporate-antecedent "with(b,a:zz,phi:[zz,zz],d,c:zz,
image{phi,zz%interval(c,d)}=zz%interval(a,b));")
(apply-macete-with-minor-premises tr%subseteq-antisymmetry)
direct-and-antecedent-inference-strategy
(cut-with-single-formula "a in zz%interval(a,b)")
(cut-with-single-formula "a in image{phi,zz%interval(c,d)}")
(incorporate-antecedent "with(a:zz,phi:[zz,zz],d,c:zz,
a in image{phi,zz%interval(c,d)});")
(apply-macete-with-minor-premises indicator-facts-macete)
beta-reduce-repeatedly
(unfold-single-defined-constant (0) zz%interval)
(apply-macete-with-minor-premises indicator-facts-macete)
beta-reduce-repeatedly
direct-and-antecedent-inference-strategy
simplify
(backchain "with(phi:[zz,zz],d,c,b,a:zz,
zz%interval(a,b) subseteq image{phi,zz%interval(c,d)});")
(unfold-single-defined-constant (0) zz%interval)
(apply-macete-with-minor-premises indicator-facts-macete)
beta-reduce-repeatedly
simplify
(unfold-single-defined-constant (0) zz%interval)
)))
```

```
(def-theorem general-commutative-law-corollary-2
"forall(a,b,c,d:zz, phi:[zz,ind_1], psi:[zz,ind_1], f:[ind_1,uu],s:sets[ind_1],
zz%interval(c,d) = dom{phi} and
injective_q{phi} and
image{phi,zz%interval(c,d)}=s and
zz%interval(a,b) = dom{psi} and
injective_q{psi} and
image{psi,zz%interval(a,b)}=s
implies
monoid%prod(c,d,f oo phi) == monoid%prod(a,b,f oo psi))"
lemma
(theory monoids-with-index-set)
(usages transportable-macete)
(proof
(
direct-and-antecedent-inference-strategy
(force-substitution "f oo phi" "(f oo psi) oo (inverse{psi}  oo phi)" (0))
(block
(script-comment "`force-substitution' at (0)")
(apply-macete-with-minor-premises general-commutative-law-corollary-1)
direct-and-antecedent-inference-strategy
(block
(script-comment "`direct-and-antecedent-inference-strategy' at (0)")
(backchain "with(phi:[zz,ind_1],d,c:zz,zz%interval(c,d)=dom{phi});")
(apply-macete-with-minor-premises tr%domain-composition)
(cut-with-single-formula "ran{phi}=ran{psi}")
(block
(script-comment "`cut-with-single-formula' at (0)")
(backchain "with(psi,phi:[zz,ind_1],ran{phi}=ran{psi});")
(apply-macete-with-minor-premises tr%inverse-defined-within-range)
)
(block
(script-comment "`cut-with-single-formula' at (1)") (weaken (0 2 5))
(cut-with-single-formula
"forall(psi:[zz,ind_1],image{psi,dom{psi}}=ran{psi})"
)
(block
(script-comment "`cut-with-single-formula' at (0)")
(backchain-backwards "with(p:prop,forall(psi:[zz,ind_1],p));")
(backchain-backwards "with(p:prop,forall(psi:[zz,ind_1],p));")
(backchain-backwards
"with(phi:[zz,ind_1],d,c:zz,zz%interval(c,d)=dom{phi});"
)
(backchain-backwards
"with(psi:[zz,ind_1],b,a:zz,zz%interval(a,b)=dom{psi});"
)
simplify
)
(apply-macete-with-minor-premises tr%image-of-domain-is-range)
) )
(block
(script-comment "`direct-and-antecedent-inference-strategy' at (1)")
(apply-macete-with-minor-premises tr%injective-composition)
direct-and-antecedent-inference-strategy
(apply-macete-with-minor-premises tr%injective-implies-injective-on)
(apply-macete-with-minor-premises tr%inverse-is-injective)
)
(block
(script-comment "`direct-and-antecedent-inference-strategy' at (2)")
(backchain "with(phi:[zz,ind_1],d,c:zz,zz%interval(c,d)=dom{phi});")
(backchain "with(psi:[zz,ind_1],b,a:zz,zz%interval(a,b)=dom{psi});")
(apply-macete-with-minor-premises tr%inverse-composition-image-lemma)
(weaken (0 1 3 6))
(cut-with-single-formula
"forall(psi:[zz,ind_1],image{psi,dom{psi}}=ran{psi})"
)
(backchain-backwards "with(p:prop,forall(psi:[zz,ind_1],p));")
(backchain-backwards "with(p:prop,forall(psi:[zz,ind_1],p));")
(backchain-backwards
"with(phi:[zz,ind_1],d,c:zz,zz%interval(c,d)=dom{phi});"
)
(backchain-backwards
"with(psi:[zz,ind_1],b,a:zz,zz%interval(a,b)=dom{psi});"
)
simplify
) )
(block
(script-comment "`force-substitution' at (1)")
(force-substitution "f oo psi oo ((inverse{psi}) oo phi)"
"f oo (psi oo (inverse{psi})) oo phi" (0)
)
(block
(script-comment "`force-substitution' at (0)")
(apply-macete-with-minor-premises tr%inverse-is-a-right-inverse)
(apply-macete-with-minor-premises tr%composition-with-id-right)
(cut-with-single-formula "ran{psi}=ran{phi}")
(block
(script-comment "`cut-with-single-formula' at (0)")
(backchain "with(phi,psi:[zz,ind_1],ran{psi}=ran{phi});")
(apply-macete-locally tr%restricted-to-range-composition-lemma (0)
" f oo phi"
) )
(weaken (1 4))
)
(block
(script-comment "`force-substitution' at (1)")
(apply-macete-with-minor-premises tr%associativity-of-composition)
(apply-macete-with-minor-premises tr%associativity-of-composition)
) )
)))
```

```
(def-theorem monoid-permutation-theorem
"forall(a,b,c,d:zz, phi:[zz,ind_1], psi:[zz,ind_1], f:[ind_1,uu],s:sets[ind_1],
zz%interval(c,d) subseteq dom{phi} and
injective_q{phi} and
image{phi,zz%interval(c,d)}=s and
zz%interval(a,b) subseteq dom{psi} and
injective_q{psi} and
image{psi,zz%interval(a,b)}=s
implies
monoid%prod(c,d,f oo phi) == monoid%prod(a,b,f oo psi))"
(theory monoids-with-index-set)
(usages transportable-macete)
(proof
(
direct-and-antecedent-inference-strategy
(force-substitution "monoid%prod(c,d,f oo phi)"
"monoid%prod(c,d,f oo restrict{phi,zz%interval(c,d)})"
(0))
(block
(script-comment "node added by `force-substitution' at (0)")
(force-substitution "monoid%prod(a,b,f oo psi)"
"monoid%prod(a,b,f oo restrict{psi,zz%interval(a,b)})"
(0))
(block
(script-comment "node added by `force-substitution' at (0)")
(apply-macete-with-minor-premises general-commutative-law-corollary-2)
(instantiate-existential ("s"))
(block
(script-comment "node added by `instantiate-existential' at (0 0)")
(apply-macete-with-minor-premises tr%domain-of-a-restriction)
simplify
unfold-defined-constants)
(apply-macete-with-minor-premises tr%injectivity-of-a-restriction)
(apply-macete-with-minor-premises tr%image-of-a-restriction)
(block
(script-comment "node added by `instantiate-existential' at (0 3)")
(apply-macete-with-minor-premises tr%domain-of-a-restriction)
simplify
unfold-defined-constants)
(apply-macete-with-minor-premises tr%injectivity-of-a-restriction)
(apply-macete-with-minor-premises tr%image-of-a-restriction))
(block
(script-comment "node added by `force-substitution' at (1)")
(apply-macete-with-minor-premises locality-for-monoid-prod)
direct-and-antecedent-inference-strategy
unfold-defined-constants
(apply-macete-with-minor-premises indicator-facts-macete)
beta-reduce-repeatedly
simplify))
(block
(script-comment "node added by `force-substitution' at (1)")
(apply-macete-with-minor-premises locality-for-monoid-prod)
direct-and-antecedent-inference-strategy
unfold-defined-constants
(apply-macete-with-minor-premises indicator-facts-macete)
beta-reduce-repeatedly
simplify)
)))
```

```
(def-theorem characterization-of-monoid%prod%unordered
"forall(s:sets[ind_1], f:[ind_1,uu],a:uu,
monoid%prod%unordered(s,f) = a iff
forsome(m,n:zz,phi:[zz,ind_1],
injective_q{phi}
and
zz%interval(m,n) subseteq dom{phi}
and
image{phi,zz%interval(m,n)} = s
and
a=monoid%prod(m,n,f oo phi)))"
(theory monoids-with-index-set)
(proof
(
(unfold-single-defined-constant (0) monoid%prod%unordered)
direct-and-antecedent-inference-strategy
(contrapose "with(a:uu,p:prop,  iota(a:uu,p)=a)")
(eliminate-defined-iota-expression 0 w)
(contrapose "with(f:[ind_1,uu],a:uu,s:sets[ind_1],
forall(m,n:zz,phi:[zz,ind_1],
forsome(x_1,x_2:zz,phi(x_1)=phi(x_2) and not(x_1=x_2))
or
forsome(x_\$0:zz,
x_\$0 in zz%interval(m,n) and not(x_\$0 in dom{phi}))
or
not(image{phi,zz%interval(m,n)}=s)
or
not(a=monoid%prod(m,n,f oo phi))));")
(backchain-backwards "with(a,w:uu,w=a);")
(apply-macete-with-minor-premises eliminate-iota-macete)
direct-and-antecedent-inference-strategy
(instantiate-existential ("m" "n" "phi"))
(cut-with-single-formula "b_\$0==a")
(backchain "with(phi:[zz,ind_1],f:[ind_1,uu],n,m:zz,a:uu,
a=monoid%prod(m,n,f oo phi));")
(backchain "with(phi_\$0:[zz,ind_1],f:[ind_1,uu],n_\$0,m_\$0:zz,b_\$0:uu,
b_\$0=monoid%prod(m_\$0,n_\$0,f oo phi_\$0));")
(apply-macete-with-minor-premises monoid-permutation-theorem)
(instantiate-existential ("s"))

)))
```

```
(def-theorem value-of-monoid%prod%unordered
"forall(s:sets[ind_1], f:[ind_1,uu],a:uu,
monoid%prod%unordered(s,f) = a implies
forall(m,n:zz,phi:[zz,ind_1],
injective_q{phi}
and
zz%interval(m,n) subseteq dom{phi}
and
image{phi,zz%interval(m,n)} = s
implies
monoid%prod(m,n,f oo phi)=a))"
(theory monoids-with-index-set)
(proof
(
(apply-macete-with-minor-premises characterization-of-monoid%prod%unordered)
direct-and-antecedent-inference-strategy
(backchain "with(u,a:uu,a=u);")
(cut-with-single-formula
"monoid%prod(m_\$0,n_\$0,f oo phi_\$0)==monoid%prod(m,n,f oo phi)")
(apply-macete-with-minor-premises monoid-permutation-theorem)
(instantiate-existential ("s"))
)))
```