Documentation

Linglib.Semantics.Intensional.Rigidity

Intensional Properties: Rigidity, Reference, and Variable Interpretation #

[Gal75] [Kri80] [Kap89]

Framework-agnostic types for intensional semantics: intensions as functions from indices (possible worlds) to extensions, rigid designators, evaluation, and referential interpretation modes.

These primitives are shared by Intensional.Defs, Semantics.Reference/, Semantics.Attitudes/, and RSA/ — any module that needs world-parameterized meanings.

Relationship to Denot #

Denot E W (.intens a) = W → Denot E W a is an Intension W (Denot E W a). The up/down operators in Frame.lean are definitionally equal to rigid/evalAt here. This file provides the framework-agnostic versions; Frame.lean provides the IL-typed versions.

Key definitions #

@[reducible, inline]
abbrev Intensional.Intension (W : Type u_1) (τ : Type u_2) :
Type (max u_1 u_2)

An intension of type τ over indices W: a function from worlds to extensions. [Gal75]'s Ty2 type system: every type τ has an intensional counterpart (s,τ) interpreted as W → ⟦τ⟧.

Equations
Instances For
    def Intensional.Intension.rigid {W : Type u_1} {τ : Type u_2} (x : τ) :

    A rigid designator: an intension that returns the same value at every world.

    Equations
    Instances For
      def Intensional.Intension.evalAt {W : Type u_1} {τ : Type u_2} (f : Intension W τ) (w : W) :
      τ

      Evaluate an intension at a world to get its extension.

      Equations
      Instances For
        def Intensional.Intension.IsRigid {W : Type u_1} {τ : Type u_2} (f : Intension W τ) :

        An intension is rigid iff it assigns the same extension at every world.

        Equations
        • f.IsRigid = ∀ (w₁ w₂ : W), f w₁ = f w₂
        Instances For
          def Intensional.Intension.IsRigidOn {W : Type u_1} {τ : Type u_2} (f : Intension W τ) (S : Set W) :

          An intension is rigid on a set S iff it assigns the same extension at every world in S. The set-relativized analog of IsRigid — used when only constancy across some restricted alternative set is required (e.g., a believer's doxastic alternatives, or a metaphysical-history slice).

          IsRigid f is the special case S = Set.univ.

          Equations
          • f.IsRigidOn S = ∀ (w₁ : W), w₁ S∀ (w₂ : W), w₂ Sf w₁ = f w₂
          Instances For
            theorem Intensional.Intension.rigid_isRigid {W : Type u_1} {τ : Type u_2} (x : τ) :

            A rigid designator is rigid.

            theorem Intensional.Intension.IsRigid.isRigidOn {W : Type u_1} {τ : Type u_2} {f : Intension W τ} (h : f.IsRigid) (S : Set W) :

            A rigid intension is rigid on every set.

            theorem Intensional.Intension.rigid_isRigidOn {W : Type u_1} {τ : Type u_2} (x : τ) (S : Set W) :

            A rigid designator is rigid on every set.

            theorem Intensional.Intension.isRigid_iff_isRigidOn_univ {W : Type u_1} {τ : Type u_2} (f : Intension W τ) :
            f.IsRigid f.IsRigidOn Set.univ

            Full rigidity is rigidity on the universal set.

            theorem Intensional.Intension.IsRigid.map {W : Type u_1} {τ₁ : Type u_2} {τ₂ : Type u_3} {f : Intension W τ₁} (h : f.IsRigid) (g : τ₁τ₂) :
            IsRigid fun (w : W) => g (f w)

            Post-composition closure (Intension W is covariantly functorial in its target type, and rigidity is preserved by the functorial action). Given any g : τ₁ → τ₂, the post-composed intension g ∘ f : Intension W τ₂ is rigid whenever f is.

            This is what makes the substrate's polymorphism in Res non-trivial: a rigid EntityConcept (Res = Agent) yields a rigid TimeConcept (Res = T) for any Agent → T function — the parallel between individual de re (Anand-Nevins shifty operators) and temporal de re (Abusch wide-scope tenses) is functorial.

            def Intensional.Intension.precomp {W₁ : Type u_1} {W₂ : Type u_2} {τ : Type u_3} (g : W₂W₁) (f : Intension W₁ τ) :
            Intension W₂ τ

            Pre-composition operator for intensions: given any g : W₂ → W₁, send f : Intension W₁ τ to f ∘ g : Intension W₂ τ. Equivalently Function.comp f g; named here to give the contravariant-functor action a domain-specific handle.

            Equations
            Instances For
              @[simp]
              theorem Intensional.Intension.precomp_apply {W₁ : Type u_1} {W₂ : Type u_2} {τ : Type u_3} (g : W₂W₁) (f : Intension W₁ τ) (w : W₂) :
              precomp g f w = f (g w)
              theorem Intensional.Intension.IsRigid.precomp {W₁ : Type u_1} {W₂ : Type u_2} {τ : Type u_3} {f : Intension W₁ τ} (h : f.IsRigid) (g : W₂W₁) :

              Pre-composition closure (Intension W is contravariantly functorial in its index type). Given any g : W₂ → W₁, the pre-composed intension f ∘ g : Intension W₂ τ is rigid whenever f is — constancy survives any relabeling of the input space.

              Used by Semantics/Tense/DeRe.lean to lift a rigid TimeConcept over KContext to a rigid intension over the holder's WorldTimeIndex alternative-shift.

              theorem Intensional.Intension.IsRigidOn.map {W : Type u_1} {τ₁ : Type u_2} {τ₂ : Type u_3} {f : Intension W τ₁} {S : Set W} (h : f.IsRigidOn S) (g : τ₁τ₂) :
              IsRigidOn (fun (w : W) => g (f w)) S

              Set-relativized version of IsRigid.map: rigidity-on-a-set is preserved by post-composition with any function.

              theorem Intensional.Intension.IsRigidOn.precomp {W₁ : Type u_1} {W₂ : Type u_2} {τ : Type u_3} {f : Intension W₁ τ} {S : Set W₁} (h : f.IsRigidOn S) (g : W₂W₁) :
              (Intension.precomp g f).IsRigidOn (g ⁻¹' S)

              Set-relativized version of IsRigid.precomp: rigidity-on-S is preserved by pre-composition with g : W₂ → W₁, with the resulting intension rigid on the preimage Set.preimage g S. Mathlib idiom: precomp pulls back the constancy-set along g.

              theorem Intensional.Intension.IsRigid.of_map_injective {W : Type u_1} {τ₁ : Type u_2} {τ₂ : Type u_3} {f : Intension W τ₁} {g : τ₁τ₂} (hg : Function.Injective g) (h : IsRigid fun (w : W) => g (f w)) :

              Reflection along injective post-composition: if g ∘ f is rigid and g is injective, then f was already rigid. Together with IsRigid.map, this establishes that IsRigid is preserved AND reflected by injective post-composition — i.e., injective g makes the lifting Intension W τ₁ → Intension W τ₂ rigidity-preserving in both directions.

              theorem Intensional.Intension.IsRigid_iff_eq_const {W : Type u_1} {τ : Type u_2} [Nonempty W] (f : Intension W τ) :
              f.IsRigid (x : τ), f = Function.const W x

              Mathlib-style characterization: over a nonempty index space, IsRigid is exactly "equals a constant function" via Function.const. The forward direction picks any witness w₀ : W and uses f w₀ as the constant value; the reverse is rfl-trivial.

              The Nonempty W hypothesis is needed because without it IsRigid f is vacuously true (no two w₁ w₂ to compare), while ∃ x, f = Function.const W x requires some x : τ to exist as a witness — which fails when τ is also empty.

              theorem Intensional.Intension.rigid_eq_const {W : Type u_1} {τ : Type u_2} (x : τ) :
              rigid x = Function.const W x

              rigid x IS Function.const W x definitionally; this is the rigid-named bridge to mathlib's Function.const API.

              theorem Intensional.Intension.evalAt_rigid {W : Type u_1} {τ : Type u_2} (x : τ) (w : W) :
              (rigid x).evalAt w = x

              evalAt of rigid returns the original value.

              theorem Intensional.Intension.rigid_section {W : Type u_1} {τ : Type u_2} (w : W) :
              (fun (x : τ) => (rigid x).evalAt w) = id

              rigid is a section (right inverse) of world-evaluation: embedding an entity as a rigid intension and then evaluating recovers the entity.

              Function-level formulation of evalAt_rigid. Together with rigid_evalAt_lossy, this establishes τ as a retract of Intension W τ via the section-retraction pair (rigid, evalAt · w).

              theorem Intensional.Intension.rigid_evalAt_lossy {W : Type u_1} {τ : Type u_2} (f : Intension W τ) (w : W) (hNonRigid : ¬f.IsRigid) :
              rigid (f w) f

              The reverse composition — evaluating and re-embedding — is lossy: it collapses non-rigid intensions to their value at w.

              If f is non-rigid, rigid (f w) ≠ f because rigid (f w) is the constant function at f w, which disagrees with f at the worlds where f varies. Together with rigid_section, this shows that τ is a proper retract of Intension W τ: the round-trip rigidevalAt · w is the identity on the image of rigid but collapses everything else.

              theorem Intensional.Intension.rigid_injective {W : Type u_1} {τ : Type u_2} [Inhabited W] :
              Function.Injective rigid

              rigid is injective: different values give different intensions.

              def Intensional.Intension.CoRefer {W : Type u_1} {τ : Type u_2} (f g : Intension W τ) (w : W) :

              Two intensions co-refer at world w.

              Equations
              Instances For
                def Intensional.Intension.CoExtensional {W : Type u_1} {τ : Type u_2} (f g : Intension W τ) :

                Two intensions are co-extensional (agree at every world).

                Equations
                Instances For
                  theorem Intensional.Intension.rigid_identity_necessary {W : Type u_1} {τ : Type u_2} (f g : Intension W τ) (hf : f.IsRigid) (hg : g.IsRigid) (w : W) (h : f.CoRefer g w) :

                  Kripke's necessity of identity: if two rigid designators co-refer at any world, they are co-extensional (and hence the same intension).

                  This is the formal kernel of the [Kri80] argument: "Hesperus" and "Phosphorus" are both rigid; if they co-refer at the actual world then they pick out the same object at every world, so "Hesperus = Phosphorus" is necessary if true.

                  theorem Intensional.Intension.rigid_allOrNothing {W : Type u_1} {τ : Type u_2} (f g : Intension W τ) (hf : f.IsRigid) (hg : g.IsRigid) (w₁ w₂ : W) :
                  f w₁ = g w₁ f w₂ = g w₂

                  Iff version of the necessity of identity: for rigid designators, co-reference at ANY world is equivalent to co-reference at EVERY world. Identity between rigid designators is never contingent — all or nothing.

                  theorem Intensional.Intension.varying_not_rigid {W : Type u_1} {τ : Type u_2} (f : Intension W τ) (w₁ w₂ : W) (h : f w₁ f w₂) :

                  An intension that takes different values at two worlds is not rigid. Contrapositive of IsRigid.

                  theorem Intensional.Intension.rigid_neq_nonrigid {W : Type u_1} {τ : Type u_2} (f g : Intension W τ) (hf : f.IsRigid) (hg : ¬g.IsRigid) :
                  f g

                  A rigid intension is never equal to a non-rigid intension.

                  def Intensional.Intension.StableCharacter {C : Type u_1} {W : Type u_2} {τ : Type u_3} (char : CIntension W τ) :

                  A character is stable iff it assigns the same content at every context.

                  [Kap89] [vFH11] Remark 5: non-indexical expressions have stable character — their content does not depend on the context of utterance. This generalizes constantCharacter from Reference/Basic.lean to the framework-agnostic level.

                  Equations
                  Instances For

                    [Par73]'s three-way interpretive classification for referential expressions. Applies uniformly to pronouns (entity variables) and tenses (temporal variables).

                    ModePronounsTenses
                    indexical"I" → agent of contextpresent → speech time
                    anaphoric"he" → salient individualpast → salient narrative time
                    bound"his" in ∀x...his...tense in "whenever...is..."

                    [Elb13] collapses this to a two-way free/bound distinction (SitVarStatus); isFree provides the coarsening.

                    • indexical : ReferentialMode

                      Anchored to utterance context (Kaplan's "I", Partee's deictic tense)

                    • anaphoric : ReferentialMode

                      Resolved by discourse salience (3rd-person "he", narrative past)

                    • bound : ReferentialMode

                      Bound by a c-commanding operator (∀x...his..., whenever...is...)

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

                        Coarsen to a two-way free/bound classification. Indexical and anaphoric are both "free" — they differ only in how the free variable is pragmatically resolved (utterance context vs. discourse salience).

                        Equations
                        Instances For

                          [Elb13]'s two-way classification of situation variables. Coarsens ReferentialMode's three-way distinction: indexical and anaphoric both map to free.

                          • free : SitVarStatus

                            Free: mapped to a contextually salient situation (→ de re)

                          • bound : SitVarStatus

                            Bound: bound by an intensional operator (→ de dicto)

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

                              Round-trip: collapsing then expanding recovers the original status (as a member of the expanded list).

                              Operator extensionality #

                              The operator-side dual of IsRigid: an operator on intensions is extensional at w when its value at w depends on its argument only through the argument's extension at w (local truth-functionality at β = Prop). Negation and the other pointwise connectives are extensional everywhere; quantifiers over indices (Core.Logic.Modal.box) are not. Semantics.Gradability.Classification.isExtensional (Kamp 1975's extensional adjective operators) is the entity-indexed ∀ w-closure of this notion.

                              def Intensional.IsExtensionalAt {W : Type u_1} {α : Type u_2} {β : Type u_3} (O : (Wα)Wβ) (w : W) :

                              O is extensional at w: its value at w depends on the argument intension only through the argument's extension at w. Equivalently, O · w factors through evaluation at w (isExtensionalAt_iff_factorsThrough).

                              Equations
                              Instances For
                                def Intensional.IsExtensional {W : Type u_1} {α : Type u_2} {β : Type u_3} (O : (Wα)Wβ) :

                                O is extensional: extensional at every index.

                                Equations
                                Instances For
                                  theorem Intensional.isExtensionalAt_iff_factorsThrough {W : Type u_1} {α : Type u_2} {β : Type u_3} (O : (Wα)Wβ) (w : W) :
                                  IsExtensionalAt O w Function.FactorsThrough (fun (x : Wα) => O x w) fun (x : Wα) => x w

                                  Extensionality at w is O · w factoring through evaluation at w.

                                  theorem Intensional.isExtensionalAt_iff {W : Type u_1} {α : Type u_2} (O : (Wα)WProp) (w : W) :
                                  IsExtensionalAt O w ∀ (p q : Wα), p w = q w(O p w O q w)

                                  The iff form at β = Prop, the shape semantic theorems consume.

                                  theorem Intensional.not_isExtensionalAt_iff_exists_witness {W : Type u_1} {α : Type u_2} {β : Type u_3} {O : (Wα)Wβ} {w : W} :
                                  ¬IsExtensionalAt O w (p : Wα), (q : Wα), p w = q w O p w O q w

                                  Refutation by witness: a pair agreeing at w on which O differs.

                                  theorem Intensional.IsExtensionalAt.eval {W : Type u_1} {w : W} {α : Type u_2} :
                                  IsExtensionalAt (fun (p : Wα) (w' : W) => p w') w

                                  Evaluation itself is extensional.

                                  theorem Intensional.IsExtensionalAt.const {W : Type u_1} {w : W} {α : Type u_2} (P : WProp) :
                                  IsExtensionalAt (fun (x : Wα) (w' : W) => P w') w

                                  Constant operators are extensional.

                                  theorem Intensional.IsExtensionalAt.neg {W : Type u_1} {w : W} :
                                  IsExtensionalAt (fun (p : WProp) (w' : W) => ¬p w') w

                                  Pointwise negation is extensional — "negation is not an intensional operator".

                                  theorem Intensional.IsExtensionalAt.and {W : Type u_1} {w : W} {α : Type u_2} {O₁ O₂ : (Wα)WProp} (h₁ : IsExtensionalAt O₁ w) (h₂ : IsExtensionalAt O₂ w) :
                                  IsExtensionalAt (fun (p : Wα) (w' : W) => O₁ p w' O₂ p w') w

                                  Extensional operators are closed under pointwise conjunction.

                                  theorem Intensional.IsExtensionalAt.or {W : Type u_1} {w : W} {α : Type u_2} {O₁ O₂ : (Wα)WProp} (h₁ : IsExtensionalAt O₁ w) (h₂ : IsExtensionalAt O₂ w) :
                                  IsExtensionalAt (fun (p : Wα) (w' : W) => O₁ p w' O₂ p w') w

                                  Extensional operators are closed under pointwise disjunction.

                                  theorem Intensional.IsExtensionalAt.not {W : Type u_1} {w : W} {α : Type u_2} {O : (Wα)WProp} (h : IsExtensionalAt O w) :
                                  IsExtensionalAt (fun (p : Wα) (w' : W) => ¬O p w') w

                                  Extensional operators are closed under pointwise negation.

                                  theorem Intensional.IsExtensionalAt.comp {W : Type u_1} {w : W} {α : Type u_2} {β : Type u_3} {O₁ : (Wα)Wβ} {O₂ : (Wβ)WProp} (h₂ : IsExtensionalAt O₂ w) (h₁ : IsExtensionalAt O₁ w) :
                                  IsExtensionalAt (fun (p : Wα) (w' : W) => O₂ (fun (s : W) => O₁ p s) w') w

                                  Towers of extensional operators are extensional: if O₁, O₂ are extensional at w, so is O₂ applied over O₁'s output intension. Scope-inertness lifts through whole stacks of extensional operators.