Documentation

Linglib.Core.Scales.Scale

Scales #

@cite{fox-hackl-2006} @cite{holliday-icard-2013} @cite{kennedy-2007} @cite{krantz-1971} @cite{krifka-1989} @cite{rouillard-2026} @cite{link-1983} @cite{rett-2026} @cite{rullmann-1995}

Root algebraic infrastructure for all scale-based reasoning in linglib.

Categorical Structure #

The file defines a category of scales with two levels of enrichment:

                    ComparativeScale (α, ≤, boundedness)
                    ╱ ╲
          (+ join, ⊥, FA) (linear, μ, direction)
              ╱ ╲
      AdditiveScale DirectedMeasure
        ╱ ╲ │
MereoScale EpistemicScale (†) │
    │ │ │
    │ additive │ additive │ μ
    │ representation representation │
    ▼ ▼ ▼
                  (ℚ, ≤)

(†) See `Core/EpistemicScale.lean` for the epistemic arm.

Objects: ComparativeScale α — a preorder with boundedness classification.

Morphisms: Monotone (from Mathlib) — the categorical morphisms are just monotone maps between preorders. MereoDim (= StrictMono) is the injective subcategory.

Enriched subcategory: AdditiveScale α — comparative scale with join and finite additivity (FA). Two independent instances:

Linear specialization: DirectedMeasure — comparative scale with a linear order, measure function, and direction. Instances: Kennedy adjectives, Rouillard TIAs, epistemic vocabulary.

The commutative diagram: both additive arms (mereological, epistemic) land in (ℚ, ≤) via additive representation morphisms. The MIP arm also lands in (ℚ, ≤) via measure functions. All three paths factor through ComparativeScale.

Measurement Scales #

Below the root structures, the file provides measurement scale infrastructure shared by degree semantics and temporal measurement:

Kennedy (Adjectives)Rouillard (TIAs)
Degree scaleDuration measurement domain
Open scale (tall, expensive)Atelic VP / DIV predicate
→ "??completely tall"→ "*was sick in three days"
Closed scale (full, empty)Telic VP / QUA predicate
→ "completely full" ✓→ "wrote a paper in three days" ✓
Interpretive EconomyMIP

Both domains use Boundedness to classify scales, and Boundedness.isLicensed derives the licensing prediction. Actual scale types encode boundedness via Mathlib typeclasses (OrderTop, OrderBot, NoMaxOrder, NoMinOrder).

Classification of scale boundedness. @cite{kennedy-2007}: four scale types based on which endpoints exist. @cite{rouillard-2026}: temporal domains have similar boundary structure (closed intervals have both bounds, open intervals lack them).

This enum is the lexical data tag for classifying scales in fragment entries and phenomena files. The actual order-theoretic properties of concrete scale types are encoded via Mathlib typeclasses (OrderTop, OrderBot, NoMaxOrder, NoMinOrder).

Instances For
    Equations
    • One or more equations did not get rendered due to their size.
    Instances For

      Licensing prediction: a bounded scale (any endpoint exists) admits a maximally informative element, licensing degree modifiers (Kennedy) or TIA numerals (Rouillard). An open scale does not. @cite{kennedy-2007}: Interpretive Economy requires non-trivial scale contribution. @cite{rouillard-2026}: MIP requires the numeral to be maximally informative.

      Equations
      Instances For
        @[reducible, inline]

        A rational number in the unit interval [0, 1].

        Wraps Mathlib's Set.Icc subtype for gradient linguistic properties (at-issueness, projectivity, etc.) and their contextual thresholds. Using Set.Icc gives us standard interval infrastructure from Mathlib (order, membership, etc.) without custom boilerplate.

        Access: r.val for the rational value, r.prop.1 for 0 ≤ r, r.prop.2 for r ≤ 1.

        Equations
        Instances For
          @[reducible, inline]

          The rational value.

          Equations
          Instances For
            theorem Core.Scale.Rat01.nonneg (r : Rat01) :
            0 r

            Proof that the value is non-negative.

            theorem Core.Scale.Rat01.le_one (r : Rat01) :
            r 1

            Proof that the value is at most 1.

            Equations

            The midpoint ½, the standard default threshold.

            Equations
            Instances For

              Does the value strictly exceed a threshold?

              Equations
              Instances For

                Closed-bounded: both 0 and 1 are attained.

                Equations
                Instances For

                  Binary mereological classification: the shared abstraction underlying all four licensing frameworks (Kennedy, Rouillard, Krifka, Zwarts).

                  Instances For
                    class Core.Scale.LicensingPipeline (α : Type u_1) :
                    Type u_1

                    A licensing pipeline: any type whose elements can be classified into scale boundedness. Kennedy, Rouillard, Krifka, and Zwarts all instantiate this with different source types but the same target.

                    Core instances (Boundedness, MereoTag) live here. Domain-specific instances (Telicity, VendlerClass, PathShape, BoundaryType) live in their respective theory/bridge files.

                    Instances

                      The universal licensing theorem: any two pipeline inputs that map to the same Boundedness yield the same licensing prediction, regardless of which framework they come.

                      structure Core.Scale.ComparativeScale (α : Type u_1) [Preorder α] :

                      A comparative scale: a boundedness classification on a preorder. This is the root object in the category of scales. All scale-based reasoning in linglib (degree semantics, mereological measurement, epistemic comparison) factors through this structure.

                      The ordering comes from the ambient [Preorder α] — no redundant le/le_refl/le_trans fields. Morphisms are Mathlib's Monotone.

                      @cite{krantz-1971}: a comparative scale is an ordered set with enough structure to support qualitative comparison.

                      • boundedness : Boundedness

                        Scale boundedness classification

                      Instances For

                        An additive scale: a comparative scale enriched with join and finite additivity (FA). Two independent instances exist in linglib:

                        • Mereological: ExtMeasure.additive
                        • Epistemic: probability FA

                        The FA axiom says disjoint augmentation preserves order: if z is disjoint from both x and y, then x ≤ y ↔ x ⊔ z ≤ y ⊔ z. This is the qualitative content of additive representation.

                        Instances For

                          Licensing prediction from the underlying boundedness.

                          Equations
                          Instances For

                            An additive scale is representable if there exists a monotone additive function into (ℚ, ≤).

                            Equations
                            Instances For

                              Intrinsic polarity of a scale dimension. positive: the unmarked direction (tall, hot, confident). negative: the marked/inverted direction (short, cold, doubtful).

                              Instances For
                                Equations
                                • One or more equations did not get rendered due to their size.
                                Instances For
                                  class Core.Scale.PositiveRegion (α : Type u_1) (θ : Type u_2) :
                                  Type (max u_1 u_2)

                                  A positive region on an ordered type: the abstract interface for "when does a gradable predicate hold?" Kennedy: compare to a threshold. CSW: qualitative background ordering. Both instantiate this.

                                  • inRegion : αθBool

                                    Is value x in the positive region given parameter p?

                                  Instances
                                    structure Core.Scale.ScaleRepresentation (S : Type u_1) [Preorder S] (D : Type u_2) [Preorder D] :
                                    Type (max u_1 u_2)

                                    A representation of a qualitative ordering by a quantitative measure. @cite{krantz-1971}: the fundamental bridge from comparative to numerical. Instances: AdditiveScale.IsRepresentable, Kennedy's μ, CSW's g(μ).

                                    Krantz, D. et al. (1971). Foundations of measurement, Vol. 1.

                                    • μ : SD

                                      The measure/representation function

                                    • monotone : Monotone self.μ

                                      Order-preservation

                                    Instances For
                                      structure Core.Scale.DirectedMeasure (D : Type u_1) [LinearOrder D] (E : Type u_2) extends Core.Scale.ComparativeScale D :
                                      Type (max u_1 u_2)

                                      A directed measurement on a bounded scale: the algebraic primitive underlying degree semantics, modal semantics, and epistemic scales.

                                      A DirectedMeasure D E packages:

                                      • A degree type D with a linear order (the scale)
                                      • An entity type E (what gets measured)
                                      • A measure function μ : E → D (the measurement)
                                      • Boundedness classification (from ComparativeScale)
                                      • A direction/polarity (positive or negative)

                                      This is the common algebraic core of GradablePredicate (degree semantics), MIP domain constructors (maximal informativity), and epistemicAsGradable (epistemic threshold semantics). Each of these extends or instantiates DirectedMeasure:

                                      The degree property (atLeastDeg for positive, atMostDeg for negative) is derived from direction, not stored. This captures the insight from @cite{lassiter-goodman-2017} that the binary direction choice (which side of the threshold counts as "satisfying the predicate") is the fundamental parameter, and the degree property follows.

                                      References:

                                      • Kennedy, C. (2007). Vagueness and grammar.
                                      • Lassiter, D. (2017). Graded modality. OUP.
                                      • Rouillard, V. (2026). Maximal informativity and temporal in-adverbials.
                                      • Krantz, D. et al. (1971). Foundations of measurement, Vol. 1.
                                      • μ : ED

                                        Measure function: maps entities to degrees on the scale

                                      • direction : ScalePolarity

                                        Scale direction: positive (μ(x) ≥ θ) or negative (μ(x) ≤ θ). Determines which side of a threshold counts as satisfying the predicate. Positive: tall, likely, full. Negative: short, unlikely, empty.

                                      Instances For
                                        def Core.Scale.DirectedMeasure.degProp {D : Type u_1} [LinearOrder D] {E : Type u_2} (dm : DirectedMeasure D E) :
                                        DEProp

                                        The degree property derived from direction:

                                        • positive → μ(x) ≥ d (upward: meets threshold)
                                        • negative → μ(x) ≤ d (downward: at most threshold)

                                        This replaces a stored degProp field with a derived one. The degree property is not independent data — it is determined by the direction choice. Definitionally equal to atLeastDeg dm.μ (positive) and atMostDeg dm.μ (negative), proved in §8b.

                                        Equations
                                        • One or more equations did not get rendered due to their size.
                                        Instances For

                                          Licensing: licensed iff the bounded scale admits an optimum.

                                          Equations
                                          Instances For

                                            Blocking: blocked iff open scale → information collapse.

                                            Equations
                                            Instances For
                                              theorem Core.Scale.DirectedMeasure.licensing_from_boundedness {D : Type u_1} [LinearOrder D] {E : Type u_2} (d₁ d₂ : DirectedMeasure D E) (h : d₁.boundedness = d₂.boundedness) :
                                              d₁.licensed = d₂.licensed

                                              Licensing is determined solely by boundedness, regardless of domain, measure function, or direction.

                                              Scale types as Mathlib typeclass combinations #

                                              A measurement scale is just a LinearOrder. Density is DenselyOrdered, and boundedness is OrderTop/OrderBot/NoMaxOrder/NoMinOrder. No wrapper classes needed — use Mathlib directly:

                                              Instances:

                                              @cite{fox-2007} UDM: all natural language scales satisfy DenselyOrdered. Use [DenselyOrdered α] when density matters for the derivation.

                                              def Core.Scale.IsUpwardMonotone {α : Type u_1} [LinearOrder α] {W : Type u_2} (P : αWProp) :

                                              A family of propositions indexed by scale values is upward monotone (entailments go from smaller to larger values). Kennedy: "tall" — if x is tall, x is tall-or-more. Rouillard: E-TIA with telic VP — if event fits in n days, it fits in m ≥ n days.

                                              Equations
                                              Instances For
                                                def Core.Scale.IsDownwardMonotone {α : Type u_1} [LinearOrder α] {W : Type u_2} (P : αWProp) :

                                                A family is downward monotone: entailments go from larger to smaller. Rouillard: E-TIA with atelic VP — if sick during n-day time, sick during m ≤ n day time.

                                                Equations
                                                Instances For
                                                  def Core.Scale.IsConstant {α : Type u_1} {W : Type u_2} (P : αWProp) :

                                                  A family is constant: every value yields the same proposition. This is information collapse — no value is more informative than another. Occurs when a family is both upward and downward monotone.

                                                  Equations
                                                  Instances For
                                                    theorem Core.Scale.bimonotone_constant {α : Type u_1} [LinearOrder α] {W : Type u_2} (P : αWProp) (hUp : IsUpwardMonotone P) (hDown : IsDownwardMonotone P) :

                                                    If P is both upward and downward monotone, it is constant.

                                                    def Core.Scale.AdmitsOptimum {α : Type u_1} {W : Type u_2} (P : αWProp) :

                                                    Informativity licensing: a scale admits a well-defined optimum iff it is NOT constant. When the family is constant (information collapse), no grammatical element operating on that scale is felicitous.

                                                    This is the abstract pattern shared by:

                                                    • Kennedy's Interpretive Economy: degree modifiers require non-trivial scale contribution
                                                    • Rouillard's MIP: TIA numerals require maximally informative values
                                                    Equations
                                                    Instances For
                                                      theorem Core.Scale.bimonotone_no_optimum {α : Type u_1} [LinearOrder α] {W : Type u_2} (P : αWProp) (hUp : IsUpwardMonotone P) (hDown : IsDownwardMonotone P) :

                                                      Bimonotone families do not admit an optimum: if a family is both upward and downward monotone, it collapses to a constant and no element is maximally informative. This is the abstract core of why open-scale degree modification and atelic-VP E-TIAs are both blocked.

                                                      def Core.Scale.IsMaxInf {α : Type u_1} {W : Type u_2} (P : αWProp) (x : α) (w : W) :

                                                      A scale value x is maximally informative in a degree property P at world w iff P x w is true and P x entails P y for every other true P y w.

                                                      @cite{fox-2007} §4: the unified exhaustivity requirement underlying implicatures (only), degree questions, and definite descriptions.

                                                      @cite{rouillard-2026} eq. (75): max⊨(w, P) specializes this to temporal domains. This definition is domain-general.

                                                      Equations
                                                      Instances For
                                                        def Core.Scale.HasMaxInf {α : Type u_1} {W : Type u_2} (P : αWProp) (w : W) :

                                                        A degree property has a maximally informative element at world w.

                                                        Equations
                                                        Instances For
                                                          def Core.Scale.InformationCollapse {α : Type u_1} {W : Type u_2} (P : αWProp) :

                                                          Information collapse: no element is maximally informative at any world. Fox & Hackl: this is why degree questions fail over dense complements, why only + "more than n" is contradictory, and why definite descriptions over dense open sets lack a presupposition-satisfying referent.

                                                          Equations
                                                          Instances For
                                                            theorem Core.Scale.open_no_upward_ceiling {α : Type u_1} [LinearOrder α] [NoMaxOrder α] (P : αProp) (hMono : ∀ (x y : α), x yP xP y) (x : α) (hx : P x) :
                                                            ∃ (y : α), x < y P y

                                                            On a scale with no maximum (NoMaxOrder), any upward monotone family that is nontrivial (i.e., some value yields a different set of worlds than another) cannot have a ceiling: for any candidate optimum, a strictly larger value exists.

                                                            This is the typeclass-level counterpart of the data-level prediction Boundedness.open_.isLicensed = false: open scales block degree modification and TIA licensing because no element is maximal.

                                                            Proof sketch: For any x, NoMaxOrder gives y > x. If P is upward monotone, P x w → P y w, so x is never the unique optimum.

                                                            theorem Core.Scale.upperBound_admits_optimum {α : Type u_1} [LinearOrder α] [OrderTop α] (h_nontrivial : ∃ (x : α), x ) :
                                                            ∃ (P : αProp), (∀ (x y : α), x yP xP y) ¬∀ (x y : α), P x P y

                                                            On a scale with a top element (OrderTop), the predicate · = ⊤ is upward monotone (vacuously — only ⊤ satisfies it) and nonconstant (on nontrivial types). This witnesses that upper-bounded scales admit an optimum.

                                                            Proof sketch: satisfies · = ⊤, and for any x < ⊤, x does not. So the family is not constant → AdmitsOptimum holds.

                                                            theorem Core.Scale.lowerBound_admits_optimum {α : Type u_1} [LinearOrder α] [OrderBot α] (h_nontrivial : ∃ (x : α), x ) :
                                                            ∃ (P : αProp), (∀ (x y : α), x yP yP x) ¬∀ (x y : α), P x P y

                                                            On a scale with a bottom element (OrderBot), the predicate · = ⊥ is downward monotone and nonconstant (on nontrivial types). This witnesses that lower-bounded scales admit an optimum.

                                                            theorem Core.Scale.open_scale_unlicensable {α : Type u_1} [LinearOrder α] [NoMaxOrder α] [NoMinOrder α] (h : ∃ (x : α) (y : α), x y) :
                                                            ∃ (P : αProp), (∀ (x y : α), x yP xP y) (¬∀ (x y : α), P x P y) ∀ (x : α), P x∃ (y : α), x < y P y

                                                            Boundedness is necessary for licensing: on a scale with no upper bound and no lower bound, there exists a monotone family with no optimum. Contrapositive: if every monotone family admits an optimum, the scale has a bound.

                                                            Closed scales predict licensing (Kennedy: "completely full" ✓; Rouillard: telic VP E-TIA ✓).

                                                            Open scales predict blocking (Kennedy: "??completely tall"; Rouillard: atelic VP E-TIA ✗).

                                                            Degree properties for comparison relations #

                                                            Five degree properties covering all comparison relations, parameterized by a measure function μ : W → α. These are the building blocks for numeral semantics (Numeral.Semantics.maxMeaning) and degree questions (DegreeQuestion).

                                                            The key divergence: on ℕ, > collapses to with successor, so both have HasMaxInf. On dense scales, > yields an open set with no max⊨. This is the UDM prediction (@cite{fox-2007} §2).

                                                            def Core.Scale.eqDeg {α : Type u_1} {W : Type u_2} (μ : Wα) :
                                                            αWProp

                                                            Degree property for "exactly d": the measure at w equals d.

                                                            Equations
                                                            Instances For
                                                              def Core.Scale.atLeastDeg {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) :
                                                              αWProp

                                                              Degree property for "at least d": the measure at w meets or exceeds d.

                                                              Equations
                                                              Instances For
                                                                def Core.Scale.moreThanDeg {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) :
                                                                αWProp

                                                                Degree property for "more than d": the measure strictly exceeds d.

                                                                Equations
                                                                Instances For
                                                                  def Core.Scale.atMostDeg {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) :
                                                                  αWProp

                                                                  Degree property for "at most d": the measure at w is at most d.

                                                                  Equations
                                                                  Instances For
                                                                    def Core.Scale.lessThanDeg {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) :
                                                                    αWProp

                                                                    Degree property for "less than d": the measure is strictly less than d.

                                                                    Equations
                                                                    Instances For
                                                                      theorem Core.Scale.atLeastDeg_downMono {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) :

                                                                      "At least" is downward monotone: weaker thresholds are easier to satisfy.

                                                                      theorem Core.Scale.moreThanDeg_downMono {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) :

                                                                      "More than" is downward monotone: weaker thresholds are easier to satisfy.

                                                                      theorem Core.Scale.atLeast_hasMaxInf {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) (w : W) :

                                                                      "At least d" always has a maximally informative element: d₀ = μ(w).

                                                                      This holds on ANY scale — dense or discrete — because the actual value μ(w) is always in the domain and "at least μ(w)" entails "at least d" for all d ≤ μ(w) by transitivity.

                                                                      This is why bare numerals generate scalar implicatures regardless of scale density: the relation creates a closed set with a natural maximum at the true value.

                                                                      theorem Core.Scale.moreThan_noMaxInf {α : Type u_1} [LinearOrder α] {W : Type u_2} [DenselyOrdered α] (μ : Wα) (hSurj : Function.Surjective μ) (w : W) :

                                                                      Implicature asymmetry (@cite{fox-2007} §2): on a dense scale, "more than n" has NO maximally informative element.

                                                                      For any candidate d₀ < μ(w), density gives d' ∈ (d₀, μ(w)). A witness world w₁ with μ(w₁) ∈ (d₀, d') has "more than d₀" true but "more than d'" false — so d₀ does not entail d'.

                                                                      The hSurj hypothesis says every degree value is realized by some possible world.

                                                                      theorem Core.Scale.isMaxInf_atLeast_iff_eq {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) (m : α) (w : W) (hSurj : Function.Surjective μ) :
                                                                      IsMaxInf (atLeastDeg μ) m w μ w = m

                                                                      Kennedy–F&H bridge: IsMaxInf of the "at least" degree property at value m and world w holds iff the measure at w equals m.

                                                                      theorem Core.Scale.moreThan_eq_atLeast_succ {W : Type u_2} (μ : W) (m : ) (w : W) :
                                                                      moreThanDeg μ m w atLeastDeg μ (m + 1) w

                                                                      On ℕ, > collapses to with successor: "more than m" ↔ "at least m+1". This is the discrete equivalence that density breaks.

                                                                      theorem Core.Scale.moreThan_nat_hasMaxInf {W : Type u_2} (μ : W) (w : W) (hw : moreThanDeg μ 0 w) :

                                                                      On ℕ, "more than m" has HasMaxInf: the discrete collapse rescues maximality. Contrast with moreThan_noMaxInf: on dense scales, HasMaxInf fails.

                                                                      Scale-sensitive maximality operator #

                                                                      @cite{rett-2026}: MAX_R(X) picks the element(s) of X that R-dominate all other members. For the < scale this is the GLB (earliest / smallest), for > the LUB (latest / largest). The same operator underlies both temporal connectives (before/after) and degree comparatives.

                                                                      def Core.Scale.maxOnScale {α : Type u_2} (R : ααProp) (X : Set α) :
                                                                      Set α

                                                                      Order-sensitive maximality (@cite{rett-2026}, def. 1): MAX_R(X) = { x ∈ X | ∀ x' ∈ X, x' ≠ x → R x x' }. Domain-general over any relation R and set X.

                                                                      Equations
                                                                      Instances For
                                                                        theorem Core.Scale.maxOnScale_singleton {α : Type u_2} (R : ααProp) (x : α) :

                                                                        MAX on a singleton is that singleton: MAX_R({x}) = {x}. The universal quantifier is vacuously satisfied.

                                                                        theorem Core.Scale.maxOnScale_lt_closedInterval {α : Type u_2} [LinearOrder α] (s f : α) (hsf : s f) :
                                                                        maxOnScale (fun (x1 x2 : α) => x1 < x2) {x : α | s x x f} = {s}

                                                                        MAX₍<₎ on a closed interval {x | s ≤ x ∧ x ≤ f} is the singleton {s}. The minimum element s R-dominates all others on the < scale. Dual: MAX₍>₎ on the same interval is {f}.

                                                                        theorem Core.Scale.maxOnScale_gt_closedInterval {α : Type u_2} [LinearOrder α] (s f : α) (hsf : s f) :
                                                                        maxOnScale (fun (x1 x2 : α) => x1 > x2) {x : α | s x x f} = {f}

                                                                        MAX₍>₎ on a closed interval {x | s ≤ x ∧ x ≤ f} is the singleton {f}. The maximum element R-dominates all others on the > scale.

                                                                        def Core.Scale.isAmbidirectional {α : Type u_2} (f : Set αProp) (B : Set α) :

                                                                        A scalar construction f is ambidirectional iff applying f to a set B and to its complement Bᶜ yields the same result, because MAX picks the same informative boundary from both. This is the mechanism behind expletive negation licensing: when f(B) ↔ f(Bᶜ), negating B is truth-conditionally vacuous.

                                                                        Equations
                                                                        Instances For
                                                                          theorem Core.Scale.maxOnScale_atLeast_singleton {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) (w : W) :
                                                                          maxOnScale (fun (x1 x2 : α) => x1 x2) {d : α | d μ w} = {μ w}

                                                                          Bridge: maxOnScale (· ≥ ·) applied to the "at least" degree set {d | d ≤ μ(w)} yields {μ(w)} — the singleton containing the true value. This connects the relational MAX to IsMaxInf.

                                                                          The convention: maxOnScale R X picks elements x ∈ X with R x x' for all other x'. With R = (· ≥ ·), this picks elements ≥ all others, i.e., the maximum.

                                                                          theorem Core.Scale.maxOnScale_ge_atMost {α : Type u_1} [LinearOrder α] (b : α) :
                                                                          maxOnScale (fun (x1 x2 : α) => x1 x2) {d : α | d b} = {b}

                                                                          MAX₍≥₎ on {d | d ≤ b} is {b}. Corollary of maxOnScale_atLeast_singleton with μ = id. Used by the comparative boundary theorems.

                                                                          theorem Core.Scale.atMostDeg_upMono {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) :

                                                                          "At most" is upward monotone: larger thresholds are easier to satisfy.

                                                                          theorem Core.Scale.atMost_hasMaxInf {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) (w : W) :

                                                                          "At most d" always has a maximally informative element: d₀ = μ(w). Symmetric to atLeast_hasMaxInf.

                                                                          theorem Core.Scale.isMaxInf_atMost_iff_eq {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) (m : α) (w : W) (hSurj : Function.Surjective μ) :
                                                                          IsMaxInf (atMostDeg μ) m w μ w = m

                                                                          Kennedy–Rouillard bridge: IsMaxInf of "at most d" at value m and world w holds iff the measure at w equals m. Symmetric to isMaxInf_atLeast_iff_eq: the MIP derives exact meaning from "at most" just as it does from "at least".

                                                                          The Maximal Informativity Principle as a universal mechanism #

                                                                          @cite{kennedy-2015} proposes a de-Fregean type-shift that maps lower-bound numeral meanings to exact meanings for Class B items (closed scales). @cite{rouillard-2026} proposes the MIP as the licensing condition for temporal in-adverbials.

                                                                          These are the SAME mechanism: given a measure function μ and a monotone degree property P, the maximally informative value is always μ(w) — the true value. The MIP derives exactness from monotone degree properties regardless of domain:

                                                                          DomainμDegree propDirectionMIP result
                                                                          Kennedy numeralscardinalityatLeastDegdown monomax⊨ = μ(w)
                                                                          Kennedy adjectivesdegreeatLeastDegdown monomax⊨ = μ(w)
                                                                          Rouillard E-TIAsruntimeatMostDegup monomax⊨ = μ(w)

                                                                          The isMaxInf_atLeast_iff_eq and isMaxInf_atMost_iff_eq theorems prove this for both monotonicity directions. The Kennedy type-shift is not a separate mechanism — it IS the MIP applied to "at least n".

                                                                          def Core.Scale.DirectedMeasure.kennedyNumeral {α : Type u_2} [LinearOrder α] {W : Type u_3} (μ : Wα) :

                                                                          @cite{kennedy-2015} numeral domain: "at least n" over cardinality. Closed scale (ℕ well-ordered) → always licensed. Type-shift to exact = MIP applied to atLeastDeg.

                                                                          Equations
                                                                          Instances For
                                                                            def Core.Scale.DirectedMeasure.kennedyAdjective {α : Type u_2} [LinearOrder α] {W : Type u_3} (μ : Wα) (b : Boundedness) :

                                                                            @cite{kennedy-2007} gradable adjective domain. Boundedness varies by adjective class (tall: open, full: closed).

                                                                            Equations
                                                                            Instances For
                                                                              def Core.Scale.DirectedMeasure.rouillardETIA {α : Type u_2} [LinearOrder α] {W : Type u_3} (μ : Wα) (b : Boundedness) :

                                                                              @cite{rouillard-2026} E-TIA domain: event runtime ≤ interval size. Boundedness determined by Vendler class (telic → closed, atelic → open).

                                                                              Equations
                                                                              Instances For
                                                                                def Core.Scale.DirectedMeasure.rouillardGTIA {α : Type u_2} [LinearOrder α] {W : Type u_3} (μ : Wα) :

                                                                                @cite{rouillard-2026} G-TIA domain: PTS extent on open intervals. Always open → always blocked (information collapse).

                                                                                Equations
                                                                                Instances For

                                                                                  Kennedy numeral domains are always licensed (closed scale).

                                                                                  Kennedy Class B adjectives (closed scale) are licensed.

                                                                                  Kennedy Class A adjectives (open scale) are blocked.

                                                                                  Rouillard telic E-TIAs are licensed (closed runtime scale).

                                                                                  Rouillard atelic E-TIAs are blocked (open runtime scale).

                                                                                  theorem Core.Scale.DirectedMeasure.gTIA_blocked {α : Type u_2} [LinearOrder α] {W : Type u_3} (μ : Wα) :

                                                                                  Rouillard G-TIAs are always blocked (open PTS).

                                                                                  The deep isomorphism: a Kennedy numeral domain and a Rouillard E-TIA domain on a closed scale have identical licensing, despite using opposite directions (positive vs negative).

                                                                                  theorem Core.Scale.DirectedMeasure.four_frameworks_agree {α : Type u_2} [LinearOrder α] (b : Boundedness) {W : Type u_4} (μ₁ μ₂ : Wα) :

                                                                                  All four frameworks agree: licensing depends solely on boundedness. @cite{kennedy-2007}: closed-scale adjectives license degree modifiers. @cite{rouillard-2026}: closed-runtime VPs license E-TIAs. @cite{krifka-1989}: QUA predicates yield telic (bounded) VPs. @cite{zwarts-2005}: bounded paths yield telic VPs. All four route through Boundedness.isLicensed.

                                                                                  The punchline: Kennedy's de-Fregean type-shift is not a separate mechanism. It IS the MIP applied to a monotone degree property. For both "at least" (Kennedy) and "at most" (Rouillard), max⊨ at world w = μ(w), the true value. So the MIP universally derives exact meaning from monotone degree properties, regardless of monotonicity direction.

                                                                                  `isMaxInf_atLeast_iff_eq`: max⊨(atLeastDeg μ, m, w) ↔ μ(w) = m
                                                                                  `isMaxInf_atMost_iff_eq`: max⊨(atMostDeg μ, m, w) ↔ μ(w) = m
                                                                                  
                                                                                  Both directions yield `eqDeg μ m w` — exact meaning. 
                                                                                  
                                                                                  theorem Core.Scale.mip_atLeast_is_exact {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) (m : α) (w : W) (hSurj : Function.Surjective μ) :
                                                                                  IsMaxInf (atLeastDeg μ) m w eqDeg μ m w

                                                                                  MIP derives exact meaning from "at least" (Kennedy's direction).

                                                                                  theorem Core.Scale.mip_atMost_is_exact {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) (m : α) (w : W) (hSurj : Function.Surjective μ) :
                                                                                  IsMaxInf (atMostDeg μ) m w eqDeg μ m w

                                                                                  MIP derives exact meaning from "at most" (Rouillard's direction).

                                                                                  theorem Core.Scale.mip_direction_invariant {α : Type u_1} [LinearOrder α] {W : Type u_2} (μ : Wα) (m : α) (w : W) (hSurj : Function.Surjective μ) :

                                                                                  The MIP is direction-invariant: "at least" and "at most" yield the same exact meaning under maximal informativity. Kennedy's type-shift and Rouillard's MIP are literally the same operation.

                                                                                  Degree and Threshold types for finite scales #

                                                                                  Discretized scale types for gradable adjective RSA computations. Degree max wraps Fin (max + 1) with LinearOrder, BoundedOrder, Fintype. Threshold max wraps Fin max with coercion to Degree max.

                                                                                  These participate in the abstract DirectedMeasure infrastructure above via their LinearOrder and BoundedOrder instances.

                                                                                  structure Core.Scale.Degree (max : ) :

                                                                                  A degree on a scale from 0 to max. Represents discretized continuous values like height, temperature, etc.

                                                                                  • value : Fin (max + 1)
                                                                                  Instances For
                                                                                    def Core.Scale.instDecidableEqDegree.decEq {max✝ : } (x✝ x✝¹ : Degree max✝) :
                                                                                    Decidable (x✝ = x✝¹)
                                                                                    Equations
                                                                                    Instances For
                                                                                      def Core.Scale.instBEqDegree.beq {max✝ : } :
                                                                                      Degree max✝Degree max✝Bool
                                                                                      Equations
                                                                                      Instances For
                                                                                        Equations

                                                                                        Degree max is bounded: 0 is the minimum, max is the maximum.

                                                                                        Equations

                                                                                        All degrees from 0 to max

                                                                                        Equations
                                                                                        Instances For

                                                                                          Degree from Nat (clamped)

                                                                                          Equations
                                                                                          Instances For
                                                                                            def Core.Scale.Degree.toNat {max : } (d : Degree max) :

                                                                                            Get numeric value

                                                                                            Equations
                                                                                            Instances For
                                                                                              structure Core.Scale.Threshold (max : ) :

                                                                                              A threshold for a gradable adjective. x is "tall" iff degree(x) > threshold.

                                                                                              • value : Fin max
                                                                                              Instances For
                                                                                                def Core.Scale.instDecidableEqThreshold.decEq {max✝ : } (x✝ x✝¹ : Threshold max✝) :
                                                                                                Decidable (x✝ = x✝¹)
                                                                                                Equations
                                                                                                Instances For
                                                                                                  def Core.Scale.instBEqThreshold.beq {max✝ : } :
                                                                                                  Threshold max✝Threshold max✝Bool
                                                                                                  Equations
                                                                                                  Instances For

                                                                                                    All thresholds from 0 to max-1

                                                                                                    Equations
                                                                                                    Instances For

                                                                                                      Get numeric value

                                                                                                      Equations
                                                                                                      Instances For
                                                                                                        Equations

                                                                                                        Coercion: Threshold embeds into Degree via Fin.castSucc

                                                                                                        Equations
                                                                                                        @[reducible, inline]
                                                                                                        abbrev Core.Scale.deg (n : ) {max : } (h : n max := by omega) :
                                                                                                        Degree max

                                                                                                        Construct a degree by literal: deg 5 : Degree 10.

                                                                                                        Equations
                                                                                                        Instances For
                                                                                                          @[reducible, inline]
                                                                                                          abbrev Core.Scale.thr (n : ) {max : } (h : n < max := by omega) :

                                                                                                          Construct a threshold by literal: thr 5 : Threshold 10.

                                                                                                          Equations
                                                                                                          Instances For

                                                                                                            Kennedy positive region: degree d is in the positive region given threshold θ iff θ < d (i.e., the degree exceeds the threshold).

                                                                                                            Equations

                                                                                                            Typeclass for entities that have a degree/magnitude on some scale. This is the formal semantics "measure function" μ : Entity → Degree.

                                                                                                            • degree : E
                                                                                                            Instances