New sorts of a Morita extension are realised as products, coproducts, subsets and quotients
ProvedMoritaEquiv.MoritaData.model_ext_newSortsdefinabilitymany-sorted-logicmodel-theorymorita-equivalence
Let be a Morita extension of the -theory (new product, coproduct, subsort and quotient sorts together with their explicit definitions , plus explicitly defined function and predicate symbols), and let be any model of . Write for its reduct to . Then the canonical maps attached to the new sorts are bijections onto their intended targets:
- Product sort with projections , : the map , , is bijective.
- Coproduct sort with injections , : the copairing is bijective.
- Subsort cut out by with inclusion : is injective, and an element lies in its image iff .
- Quotient sort with projection : is surjective, and iff .
This is the semantic content of the defining axioms (Barrett–Halvorson §4.1): every element of a new sort is determined by, and determines, data in the old sorts. It is the basic lemma behind the faithfulness and fullness of the reduct functor (Propositions 5.2–5.3).
Preamble
import Mathlib import Definitions.Def_MoritaEquiv_defs open CategoryTheory
Formal statement
namespace MoritaEquiv
/-- In every model `N` of a Morita extension `T⁺`, the canonical maps attached to the new sorts are
bijections onto their intended targets: `z ↦ (π₁ z, π₂ z)` for a product sort, `[ρ₁, ρ₂]` for a
coproduct sort, the inclusion `i` onto `{a | φ(a)}` for a subsort, and `ε` with kernel `φ(a, b)`
for a quotient sort. -/
theorem MoritaData.model_ext_newSorts {L : Sig} {T : Theory L} (D : MoritaData L T)
(N : Model D.ext) :
(∀ σ : D.Prod, Function.Bijective fun z : N.str.carrier (.prod σ) =>
(N.str.funMap (L := D.sig) (MoritaData.ExtFunc.fst σ)
(Fin.cons (α := fun j => N.str.carrier (![MoritaData.ExtSrt.prod σ] j)) z finZeroElim),
N.str.funMap (L := D.sig) (MoritaData.ExtFunc.snd σ)
(Fin.cons (α := fun j => N.str.carrier (![MoritaData.ExtSrt.prod σ] j)) z finZeroElim))) ∧
(∀ σ : D.Coprod, Function.Bijective (Sum.elim
(fun a : N.str.carrier (.old (D.coprodFst σ)) =>
N.str.funMap (L := D.sig) (MoritaData.ExtFunc.inl σ)
(Fin.cons (α := fun j => N.str.carrier (![MoritaData.ExtSrt.old (D.coprodFst σ)] j)) a
finZeroElim))
(fun b : N.str.carrier (.old (D.coprodSnd σ)) =>
N.str.funMap (L := D.sig) (MoritaData.ExtFunc.inr σ)
(Fin.cons (α := fun j => N.str.carrier (![MoritaData.ExtSrt.old (D.coprodSnd σ)] j)) b
finZeroElim)))) ∧
(∀ σ : D.Sub, Function.Injective (fun z : N.str.carrier (.sub σ) =>
N.str.funMap (L := D.sig) (MoritaData.ExtFunc.incl σ)
(Fin.cons (α := fun j => N.str.carrier (![MoritaData.ExtSrt.sub σ] j)) z finZeroElim)) ∧
∀ a : N.str.carrier (.old (D.subBase σ)),
(∃ z : N.str.carrier (.sub σ), N.str.funMap (L := D.sig) (MoritaData.ExtFunc.incl σ)
(Fin.cons (α := fun j => N.str.carrier (![MoritaData.ExtSrt.sub σ] j)) z finZeroElim) = a) ↔
(D.subDef σ).Realize (N.str.reduct D.incl)
(Fin.cons (α := fun j => (N.str.reduct D.incl).carrier (![D.subBase σ] j)) a finZeroElim)) ∧
(∀ σ : D.Quot, Function.Surjective (fun a : N.str.carrier (.old (D.quotBase σ)) =>
N.str.funMap (L := D.sig) (MoritaData.ExtFunc.proj σ)
(Fin.cons (α := fun j => N.str.carrier (![MoritaData.ExtSrt.old (D.quotBase σ)] j)) a
finZeroElim)) ∧
∀ a b : N.str.carrier (.old (D.quotBase σ)),
N.str.funMap (L := D.sig) (MoritaData.ExtFunc.proj σ)
(Fin.cons (α := fun j => N.str.carrier (![MoritaData.ExtSrt.old (D.quotBase σ)] j)) a
finZeroElim) =
N.str.funMap (L := D.sig) (MoritaData.ExtFunc.proj σ)
(Fin.cons (α := fun j => N.str.carrier (![MoritaData.ExtSrt.old (D.quotBase σ)] j)) b
finZeroElim) ↔
(D.quotDef σ).Realize (N.str.reduct D.incl)
(Fin.cons (α := fun j => (N.str.reduct D.incl).carrier (![D.quotBase σ, D.quotBase σ] j)) a
(Fin.cons
(α := fun j => (N.str.reduct D.incl).carrier (![D.quotBase σ, D.quotBase σ] j.succ)) b
finZeroElim))) := by sorry
end MoritaEquiv
Source
T. W. Barrett, H. Halvorson, Morita Equivalence, Rev. Symb. Logic 9 (2016) 556-582, https://arxiv.org/abs/1506.04675 (arXiv v1), §4.1 (explicit definitions of new sorts) and §5 (proof of Proposition 5.2)