Pronoun capabilities — a mixin tower over pronoun carriers #
Pronoun entries (Pronoun, PersonalPronoun, IndefinitePronoun, …) are bundled structure
values — many per language, like mathlib's MonoidHom. This file gives the capabilities a
carrier α can have, as typeclass mixins abstracting over the representation — the
MonoidHomClass/ContinuousMul-over-MonoidHom/Mul relationship, applied to pronouns. A
consumer (binding engine, agreement module, …) then requires exactly the axes it touches:
[Proform α] for form/φ, [Bound α] for the Principle A/B/C role, and so on — composed by
instance parameters with no extends-diamond. The carrier may be a record (Pronoun), a syntactic
object (Word), or a future theory representation; each supplies its own instances.
Main declarations #
Proform— the spine: a carrier exposes a surfaceformand agreementphi-features.instance Bound Pronoun/Bound PersonalPronoun— the pronoun carriers' binding-axis instances. TheBoundclass (withAnaphoric/Pronominal/Referringand theBound.Is*element predicates) is theory-neutral and lives beside its partial companionFeatures.BindingSourceinFeatures/CoreferenceStatus.lean.bindingClassOf_toWord— the faithfulness certificate: the binding engine's canonical morphology source (Binding.bindingClassOf) agrees with theBoundmixin on every projected pro-form, so the surface engine and the carrier capability never diverge.Deictic— orthogonal data-mixin (register / referential person).
Implementation notes #
Capabilities live near their domain (mathlib-style: ContinuousMul is in Topology, not
Algebra). The word-class-neutral Indefinite capability ([Indefinite α], Haspelmath
function-coverage) therefore lives in Features/Indefinite.lean, and the binding axis Bound
lives in Features/CoreferenceStatus.lean — neither is pronoun-specific. Two further axes are deferred, each for a principled reason. Deficiency
([CS99a] Pronoun.Strength) is per-series, not per-element: every carrier's
strength is carrier-uniform (Italian clitics are all .clitic; the Mixtec clitic/nonclitic fields
have fixed strengths), so an α → Strength accessor would be constant on every carrier — a
per-type fact, not a per-element capability. It is served by the Pronoun.strength field
(series-level, none when not homogeneous) and the Strength linear order, not by a class.
The finer lexical-kind axis (personal vs relative vs interrogative vs
demonstrative) is Pronoun.pronType — real UD morphology on the carrier (no invented enum),
threaded onto the projected word by toWord.
A pronoun-like carrier exposes a surface form and agreement phi-features — everything true
of every pronoun, the base every other capability builds over (cf. Mul/Semigroup as the base
operation class).
- form : α → String
Surface form (romanization or orthographic).
- phi : α → UD.MorphFeatures
Agreement φ-features (person/number/gender).
Instances
Equations
- instProformWord = { form := Word.form, phi := Word.phi }
Equations
- instProformPronoun = { form := Pronoun.form, phi := fun (p : Pronoun) => p.toWord.phi }
Equations
- instProformPersonalPronoun = { form := fun (p : PersonalPronoun) => p.form, phi := fun (p : PersonalPronoun) => p.toWord.phi }
A bare Pronoun's declared class, defaulting an undeclared φ-shell to Principle-B .pronoun
([Cho81]'s elsewhere case for a pro-form).
Equations
- instBoundPronoun = { bindingClass := fun (p : Pronoun) => p.bindingClass.getD Features.BindingClass.pronoun }
Equations
- instBoundPersonalPronoun = { bindingClass := fun (p : PersonalPronoun) => p.bindingClass.getD Features.BindingClass.pronoun }
The canonical morphology source agrees with the mixin: a pro-form's projected word
classifies (Binding.bindingClassOf, reading Reflex/PronType/category) exactly as the
carrier's Bound class — Pronoun.toWord threads the binding morphology faithfully, so the
surface engine and the capability never diverge. Two coherence premises, both vacuous for
every actual entry: the pronoun is not lexically declared an R-expression (its surface
category .PRON would win), and it does not store PronType=Rcp (reciprocal is derived
by toWord from bindingClass = .reciprocal, never stored).
Equations
- instHasNumberPersonalPronoun = { numberOf := fun (p : PersonalPronoun) => HasNumber.numberOf p.toPronoun }
Projecting a pronoun to a Word realizes its number through UD: the
round-trip is identity exactly on UD-expressible values — the
minimal/augmented values are lost to realization (Number.toUD is
partial), the number analogue of personOf_toWord's coarsening.
Equations
- instHasPersonPersonalPronoun = { personOf := fun (p : PersonalPronoun) => personOf p.toPronoun }
Equations
- instHasCasePersonalPronoun = { caseOf := fun (p : PersonalPronoun) => caseOf p.toPronoun }
Projecting a pronoun to a Word realizes its case through UD
losslessly: Case.toUD is currently a bijection, so — unlike person
(clusivity lost) and number (minimal/augmented lost) — the round-trip is
the identity. This is the theorem that degrades when an analytical
refinement splits a UD cell (Case.fromUD_toUD).
A deictic carrier exposes register and — when it diverges from agreement person — referential person, the features specific to personal/referential pronouns ([AZ25a]).
- register : α → Features.Register.Level
Register level (T/V, honorific tiers).
- referentialPerson : α → Option Person
Referential person when it diverges from formal/agreement person;
noneotherwise.
Instances
Equations
- instDeicticPersonalPronoun = { register := PersonalPronoun.register, referentialPerson := PersonalPronoun.referentialPerson }