Skip to content

Commit dc4a326

Browse files
committed
0.230.584 — Core/Agreement/Controller.lean (Corbett 2006 §6.6) + parameterize MorphCategory.agreement on Controller. Anderson Ch 5 §5.2 payoff theorems direct; Bybee/Karlsson source distinctions now round-trip losslessly. ~17 consumer migrations.
1 parent 1ddf945 commit dc4a326

19 files changed

Lines changed: 289 additions & 107 deletions

File tree

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,30 @@ The release clock (`v4.29.1`, ...) tracks Lean/mathlib compatibility and is what
44

55
## [Unreleased]
66

7+
### 0.230.584 — `Core/Agreement/Controller.lean` (Corbett 2006 §6.6) + parameterize `MorphCategory.agreement`
8+
9+
The substrate gap identified at 0.230.578 (subj/obj agreement collapse blocking Anderson Ch 5 §5.2 typology) is now closed.
10+
11+
**Substrate**:
12+
- `Core/Agreement/Controller.lean` — new file. `inductive Controller | subj | obj | iobj | poss | obl | defaultAgr` anchored on @cite{corbett-2006} §2.1 + §6.6. Cases derived from Hindi/Urdu rule (p. 195) + Upper Sorbian possessive controller (§2.1.4) + Italian *piove* defective controller (§2.1.3). Typological metalanguage; framework-specific projections (LFG SUBJ → Controller.subj etc.) belong in `Theories/Syntax/`.
13+
- `Core/Morphology/MorphRule.lean` — `MorphCategory.agreement` parameterized as `agreement (controller : Core.Agreement.Controller)`. Added `MorphCategory.IsAgreement : MorphCategory → Bool` for role-blind tests. `peripherality` updated to pattern-match `.agreement _ => 8` (Bybee bucket unchanged).
14+
15+
**Bib**: `corbett-2006` added (Cambridge UP, ISBN 978-0-521-00170-0, DOI 10.1017/cbo9781139164306).
16+
17+
**Anderson Ch 5 §5.2 payoff** in `Anderson2006.lean`: `doyayo_splitDoubled_subj_doubled_obj_lex_only` and `pipil_splitDoubled_subj_doubled_obj_lex_only` directly state Anderson's "subjects doubled, objects on LV only" generalization as `dist.onLex.contains (.agreement .obj) ∧ ¬ dist.onAux.contains (.agreement .obj)`. The 0.230.578 list-length workaround (fragile) is replaced. New `jakaltek_abs_on_aux_erg_on_lex` makes the abs/erg split a category-level distinction.
18+
19+
**Bybee 1985 round-trip** in `Phenomena/Morphology/Studies/Bybee1985.lean`: `personAgr → .agreement .subj`, `personAgrObj → .agreement .obj`, `genderAgr → .agreement .subj` — Bybee's source distinctions now project losslessly. Same restoration in `HahnDegenFutrell2021.lean` (Sesotho subject vs object agreement prefix slots).
20+
21+
**Karlsson 2017 round-trip**: Finnish possessive suffix is now `.agreement .poss` rather than collapsed onto `.agreement`.
22+
23+
**Consumer migrations** (~17 files, mostly mechanical `.agreement → .agreement .subj`): Doyayo, Pipil, Hemba, Gorum, Jakaltek (abs/erg → obj/subj), Japanese Negation, Finnish Negation, English Verbal predicates, Karlsson2017, Bybee1985, HalleMarantz1993, HahnDegenFutrell2021, Baker1985, Anderson2006, Core/Morphology/Exponence.
24+
25+
**Evaluated, NOT promoted** (per inspection):
26+
- `Fragments/Dargwa/Agreement.lean` `GenderController` (`absolutive | predicate | ergOrDat`) — case-label cases, not grammatical-relation. Genuinely a different concept; Corbett §6.6 confirms case ⊥ grammatical-relation.
27+
- `Fragments/Icelandic/Verbs.lean` local `AgreementTarget` (`nominativeArg | default3sg`) — case-based, not Corbett-1991 morphosyntactic-position. Name collides with `Core.AgreementTarget` only superficially.
28+
29+
**Build**: 5677/5677 jobs green.
30+
731
### 0.230.583 — Refactor `Core/AgreementTarget.lean` (mathlib-shaped) + dir move to `Core/Agreement/`
832

933
Mathlib-quality cleanup of the Corbett-1991/2000/Bickel-Nichols-2001 agreement substrate, prepping for the new `Controller` axis (Corbett 2006 §6.6) landing in 0.230.584.
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/-!
2+
# Agreement Controller — Grammatical Role of the Controlling NP
3+
@cite{corbett-2006} ch 2 §2.1, ch 6 §6.6
4+
5+
While `Core/Agreement/Target.lean` enumerates WHERE agreement morphology
6+
surfaces (Corbett 1991 Agreement Hierarchy), this file enumerates WHICH
7+
GRAMMATICAL ROLE the controlling NP plays. The two axes are orthogonal:
8+
a language can have subject-controlled verb agreement
9+
(`Controller.subj` × `AgreementTarget.verb`) and possessor-controlled
10+
attributive agreement (`Controller.poss` × `AgreementTarget.attributive`).
11+
12+
## Typological labels
13+
14+
The labels here are typological metalanguage — Comrie/Dixon S/A/P
15+
+ grammatical-relation labels used across frameworks. Different theories
16+
operationalize them differently (LFG SUBJ ≠ Minimalist external argument
17+
≠ RG 1), but at the level of CROSS-LINGUISTIC DESCRIPTION (which is what
18+
`Core.Morphology.MorphCategory.agreement` records), the labels are
19+
reasonably consensual. Framework-specific projections
20+
(LFG analysis → Controller, Minimalist analysis → Controller) live in
21+
`Theories/Syntax/`.
22+
23+
## Cases derived from Corbett 2006
24+
25+
@cite{corbett-2006} §2.1 surveys controller TYPES (canonical NPs,
26+
defective clauses §2.1.2, weather-verb absent controllers §2.1.3,
27+
possessive adjectives §2.1.4, qualitative adjectives §2.1.5). Within
28+
canonical NP controllers, the orthogonal GRAMMATICAL-ROLE dimension
29+
is treated in §6.6 — Hindi/Urdu (p. 195): "if the subject is in
30+
the nominative, the verb agrees with it; otherwise, if the object
31+
is in the nominative, the verb agrees with that; otherwise the verb
32+
shows default agreement". This 3-way subj/obj/default rule is the
33+
canonical Indo-Aryan pattern; other languages fold in indirect
34+
objects (recipients), possessors (Upper Sorbian §2.1.4), and rarely
35+
obliques.
36+
37+
## Anderson 2006 Ch 5 §5.2 motivation
38+
39+
The substrate gap that prompted this enum: Anderson's split/doubled
40+
AVC typology turns on "subjects on both AUX and LV; objects only on
41+
LV" — a generalization unstateable when `MorphCategory.agreement`
42+
collapses subj/obj. Parameterizing `agreement` on `Controller`
43+
makes the Anderson Ch 5 typology directly Lean-checkable:
44+
`dist.onLex.contains (.agreement .obj) ∧ ¬ dist.onAux.contains (.agreement .obj)`.
45+
46+
## Bybee 1985 motivation
47+
48+
`Phenomena/Morphology/Studies/Bybee1985.lean:255-257` already encodes
49+
Bybee's source distinction `personAgr / personAgrObj / genderAgr` but
50+
collapses all three onto flat `.agreement` in the substrate projection.
51+
With the parametric form, the projection round-trips:
52+
`personAgr → .agreement .subj`, `personAgrObj → .agreement .obj`.
53+
54+
## What's NOT here
55+
56+
- **Case** — case-marking (nom/erg/abs/dat/...) is orthogonal to
57+
grammatical role. Quirky-case subjects in Icelandic, ergative-case
58+
agents in Tsakhur, etc. are case phenomena, not controller-role
59+
phenomena. Case lives in `Core/Case/`.
60+
- **φ-features** (person, number, gender) — these are properties of
61+
the CONTROLLER NP that determine agreement values. Not encoded in
62+
the controller-role enum itself.
63+
- **Animacy / topicality / focus** — agreement *conditions* per
64+
@cite{corbett-2006} ch 6, not controller-role labels.
65+
-/
66+
67+
namespace Core.Agreement
68+
69+
/-- Grammatical role of the agreement controller. Cross-linguistically
70+
motivated typological labels per @cite{corbett-2006} §6.6. -/
71+
inductive Controller where
72+
/-- Subject (S in intransitive, A in transitive). The unmarked case
73+
cross-linguistically. Russian *kniga* controlling verb agreement;
74+
English *he* controlling *-s*. -/
75+
| subj
76+
/-- Direct object (P in transitive). In ergative-absolutive systems,
77+
the absolutive argument; cf. Dargwa gender-prefix agreement
78+
controlled by absolutive (@cite{corbett-2006} §6.5 ex. 21-26). -/
79+
| obj
80+
/-- Indirect object / recipient (G in ditransitive). Some Bantu and
81+
Romance dialects show recipient agreement on the verb. -/
82+
| iobj
83+
/-- Possessor. Hungarian possessive suffix; Upper Sorbian
84+
*moj-eho muž-ow-a sotr-a* where the possessive adjective
85+
controls the attributive (@cite{corbett-2006} §2.1.4). -/
86+
| poss
87+
/-- Oblique (rare; some Bantu locative agreement). Provided for
88+
typological completeness. -/
89+
| obl
90+
/-- No canonical controller. Weather verbs (Italian *piove*
91+
@cite{corbett-2006} §2.1.3), defective clausal/infinitival
92+
controllers (§2.1.2): the target shows default agreement
93+
(typically 3sg.M in IE languages). -/
94+
| defaultAgr
95+
deriving DecidableEq, Repr, Inhabited
96+
97+
end Core.Agreement

Linglib/Core/Morphology/Exponence.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ def pluralNounRuleFlat {α : Type}
189189

190190
/-- Verb agreement -s: formal change only, semantically vacuous. -/
191191
def verbAgreement3sg (σ : Type) : MorphRule σ :=
192-
{ category := .agreement
192+
{ category := .agreement .subj
193193
, value := "3sg"
194194
, formRule := λ lemma_ => lemma_ ++ "s"
195195
, featureRule := λ f => { f with number := some .Sing, person := some .third }

Linglib/Core/Morphology/MorphRule.lean

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Linglib.Core.Word
2+
import Linglib.Core.Agreement.Controller
23

34
/-!
45
# Morphological Infrastructure
@@ -204,12 +205,28 @@ inductive MorphCategory where
204205
| tense -- past, future, present
205206
| mood -- desiderative, subjunctive, imperative
206207
| negation -- negation markers
207-
| agreement -- subject/object agreement, politeness
208+
/-- Agreement morphology, parameterized by the grammatical role of
209+
the controlling NP (`Core.Agreement.Controller`). The role
210+
distinction (subj vs obj vs poss vs ...) is what allows Anderson
211+
Ch 5 §5.2 split/doubled AVC typology to be Lean-checkable;
212+
Bybee 1985's `personAgr / personAgrObj / genderAgr` source
213+
distinctions also round-trip cleanly. See
214+
`scratch/morphcategory_agreement_split_plan.md` for the design
215+
rationale (0.230.578-0.230.584). -/
216+
| agreement (controller : Core.Agreement.Controller)
208217
| nonfinite -- nonfinite markers, interrogative/relative
209218
| number -- number marking on nouns (not verb agreement)
210219
| degree -- comparative/superlative on adjectives
211220
deriving Repr, DecidableEq
212221

222+
/-- Predicate testing whether a `MorphCategory` is an agreement category,
223+
independent of which `Controller` role parameterizes it. Used for
224+
Bybee-style relevance-hierarchy code that doesn't care which role
225+
triggers the agreement, only that agreement IS the category. -/
226+
def MorphCategory.IsAgreement : MorphCategory → Bool
227+
| .agreement _ => true
228+
| _ => false
229+
213230
/-- Peripherality: numerical embedding of Bybee's relevance hierarchy
214231
where **higher = farther from stem = less semantically relevant**.
215232
@@ -245,18 +262,18 @@ that reads these ranks):
245262
morphology often changes syntactic category, outside the scope
246263
of inflectional categories proper). -/
247264
def MorphCategory.peripherality : MorphCategory → Nat
248-
| .stem => 0
249-
| .derivation => 1
250-
| .valence => 2
251-
| .number => 3
252-
| .voice => 3
253-
| .aspect => 4
254-
| .degree => 5
255-
| .tense => 5
256-
| .mood => 6
257-
| .negation => 7
258-
| .agreement => 8
259-
| .nonfinite => 9
265+
| .stem => 0
266+
| .derivation => 1
267+
| .valence => 2
268+
| .number => 3
269+
| .voice => 3
270+
| .aspect => 4
271+
| .degree => 5
272+
| .tense => 5
273+
| .mood => 6
274+
| .negation => 7
275+
| .agreement _ => 8 -- any controller role lands at Bybee rank 8
276+
| .nonfinite => 9
260277

261278
/-- A morpheme ordering respects the relevance hierarchy if peripherality
262279
is non-decreasing from stem outward (stem-adjacent first). -/

Linglib/Fragments/Doyayo/AuxiliaryVerbs.lean

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def lexHeadedGloss : String := "I AUX pour-PROX 'I'm going to pour'"
5353
p. 120: "partially encodes person of the subject through the tone");
5454
LV carries TAM. -/
5555
def lexHeadedDistribution : InflDistribution :=
56-
{ onAux := [.agreement], onLex := [.tense] }
56+
{ onAux := [.agreement .subj], onLex := [.tense] }
5757

5858
/-! ## Split/doubled pattern (Anderson 2006, Ch 5 ex. 128-129, pp. 222-223) -/
5959

@@ -75,20 +75,13 @@ def splitDoubledGloss : String :=
7575
"3PL-POT 3PL-come 3PL-bite-2 'they might come bite you'"
7676

7777
/-- Split/doubled inflection: subject agreement doubled on both
78-
elements (subject category appears on AUX *and* LV); object
79-
agreement appears only on LV (encoded as a second `.agreement`
80-
on `onLex`). The doubled subject is what makes this split/doubled
81-
rather than plain split.
82-
83-
Substrate gap: `MorphCategory.agreement` does not distinguish
84-
subject vs object agreement — both `1` (subject) and `-mɔ`
85-
(object) collapse to the same `.agreement` constructor. The
86-
object-on-LV-only generalization that Anderson Ch 5 §5.2 turns
87-
on can therefore not be stated at the substrate level today.
88-
See `scratch/morphcategory_agreement_split_plan.md` for the
89-
proposed parameterized `agreement (target : ArgRole)` extension. -/
78+
elements; object agreement appears only on LV. The role-typed
79+
encoding (subj vs obj) makes the Anderson Ch 5 §5.2 "objects on
80+
LV only" generalization directly Lean-checkable: see
81+
`Phenomena/AuxiliaryVerbs/Studies/Anderson2006.lean`. -/
9082
def splitDoubledDistribution : InflDistribution :=
91-
{ onAux := [.agreement], onLex := [.agreement, .agreement] }
83+
{ onAux := [.agreement .subj]
84+
, onLex := [.agreement .subj, .agreement .obj] }
9285

9386
/-! ## Primary pattern alias
9487

Linglib/Fragments/English/Predicates/Verbal.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3518,7 +3518,7 @@ def VerbEntry.toStem {σ : Type} (v : VerbEntry) : Core.Morphology.Stem σ :=
35183518
, baseFeatures := { valence := some (complementToValence v.complementType)
35193519
, vform := some .infinitive }
35203520
, paradigm :=
3521-
[ { category := .agreement, value := "3sg"
3521+
[ { category := .agreement .subj, value := "3sg"
35223522
, formRule := λ _ => v.form3sg
35233523
, featureRule := λ f => { f with number := some .Sing
35243524
, person := some .third

Linglib/Fragments/Finnish/Negation.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ def connegativeRule : MorphRule Bool :=
100100
/-- The negative auxiliary's agreement rule: semantically vacuous,
101101
carries person/number agreement that would otherwise be on the main verb. -/
102102
def negAgreementRule (person : Nat) (number : String) : MorphRule Bool :=
103-
{ category := .agreement
103+
{ category := .agreement .subj
104104
, value := s!"{person}{number}"
105105
, formRule := fun _ =>
106106
match person, number with
@@ -123,7 +123,7 @@ def negAgreementRule (person : Nat) (number : String) : MorphRule Bool :=
123123
Uses the shared `InflDistribution` from `Core.Morphology`:
124124
`onAux` = negative auxiliary, `onLex` = main verb. -/
125125
def finnishNegDistribution : InflDistribution :=
126-
{ onAux := [.negation, .tense, .agreement]
126+
{ onAux := [.negation, .tense, .agreement .subj]
127127
, onLex := [.stem, .aspect] }
128128

129129
-- ============================================================================
@@ -150,7 +150,7 @@ theorem connegative_negates : connegativeRule.semEffect true = false := rfl
150150
respecting Bybee's hierarchy within the neg aux word. -/
151151
theorem neg_aux_respects_bybee :
152152
MorphCategory.peripherality .negation <
153-
MorphCategory.peripherality .agreement := by decide
153+
MorphCategory.peripherality (.agreement .subj) := by decide
154154

155155

156156
-- ============================================================================

Linglib/Fragments/Gorum/AuxiliaryVerbs.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def location : String := "India"
3838
/-- Doubled inflection distribution: both AUX and LV are marked for
3939
subject agreement, tense, and affectedness (version/voice). -/
4040
def inflDistribution : InflDistribution :=
41-
{ onAux := [.agreement, .tense, .voice]
42-
, onLex := [.agreement, .tense, .voice] }
41+
{ onAux := [.agreement .subj, .tense, .voice]
42+
, onLex := [.agreement .subj, .tense, .voice] }
4343

4444
end Fragments.Gorum.AuxiliaryVerbs

Linglib/Fragments/Hemba/AuxiliaryVerbs.lean

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,17 @@ def gloss : String := "1PL-PST-AUX 1PL-cut-FV/IND tree"
4040

4141
/-- Inflectional distribution: agreement doubled, tense on AUX, mood on LV. -/
4242
def inflDistribution : InflDistribution :=
43-
{ onAux := [.agreement, .tense]
44-
, onLex := [.agreement, .mood] }
43+
{ onAux := [.agreement .subj, .tense]
44+
, onLex := [.agreement .subj, .mood] }
4545

4646
/-! ## Verification -/
4747

4848
theorem form_nonempty : form ≠ "" := by decide
4949

50-
/-- Agreement is doubled: it appears on both AUX and LV. -/
50+
/-- Agreement is doubled: subject agreement appears on both AUX and LV. -/
5151
theorem agreement_doubled :
52-
inflDistribution.onAux.contains .agreement = true
53-
inflDistribution.onLex.contains .agreement = true := by
52+
inflDistribution.onAux.contains (.agreement .subj) = true
53+
inflDistribution.onLex.contains (.agreement .subj) = true := by
5454
exact ⟨by decide, by decide⟩
5555

5656
/-- Tense is split to AUX only. -/

Linglib/Fragments/Jakaltek/AuxiliaryVerbs.lean

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ def gloss : String := "COMPL-ABS2 ERG1-see 'I saw you'"
2929
def family : String := "Mayan"
3030
def location : String := "Guatemala"
3131

32-
/-- Split inflection distribution: AUX hosts aspect and absolutive agreement
33-
(= object in transitive); LV hosts ergative agreement (= subject in
34-
transitive). Both absolutive and ergative cross-referencing are
35-
`.agreement` at the `MorphCategory` level; the split is within the
36-
agreement system (absolutive vs. ergative), not between category types. -/
32+
/-- Split inflection distribution: AUX hosts aspect and absolutive
33+
agreement (= object in a transitive clause); LV hosts ergative
34+
agreement (= subject in a transitive clause). The role-typed
35+
`.agreement` constructor surfaces the abs/erg distinction at the
36+
substrate level: `.obj` on AUX, `.subj` on LV. -/
3737
def inflDistribution : InflDistribution :=
38-
{ onAux := [.aspect, .agreement]
39-
, onLex := [.agreement] }
38+
{ onAux := [.aspect, .agreement .obj]
39+
, onLex := [.agreement .subj] }
4040

4141
end Fragments.Jakaltek.AuxiliaryVerbs

0 commit comments

Comments
 (0)