Variable Assignments #
Framework-neutral variable assignment infrastructure shared by static semantics (Montague/Heim & Kratzer), dynamic semantics (DRT, DPL, CDRT), and the cylindric algebra formalism.
An Assignment E maps natural number indices to entities of type E.
The update operation g[n↦d] modifies a single register, leaving
all others fixed. These operations satisfy the cylindric set algebra
axioms (@cite{henkin-monk-tarski-1971}).
Variable assignment: function from indices to entities.
This is the canonical assignment type used across the library:
- Montague semantics (static variable binding)
- DRT, DPL, CDRT (dynamic discourse referents)
- Cylindric algebra (abstract coordinate functions)
Equations
- Core.Assignment E = (Nat → E)
Instances For
Assignment update g[n↦d]: set register n to value d,
preserving all other registers.
Instances For
Partial assignment: variables may be undefined (none).
Used in trivalent semantics (@cite{spector-2025}, @cite{beaver-krahmer-2001})
where g(x) = none means variable x is not valued, yielding
undefinedness (#) in predicate application.
Equations
- Core.PartialAssign D = (Nat → Option D)
Instances For
A partial assignment that values no variables.
Equations
Instances For
Update a partial assignment at index n.
Instances For
Whether variable n is valued by g.
Instances For
The U(x) / isValued predicate: x is valued.
@cite{spector-2025} §2.2.2: always bivalent (never undefined).
Instances For
Coerce a total assignment to a partial assignment (always valued).
Equations
- Core.PartialAssign.ofTotal g n = some (g n)
Instances For
Plural assignment: a set of atomic (partial) assignments.
@cite{spector-2025} §6.2: "contexts are viewed as pairs (w, G),
where G is a set of assignments, a plural assignment." Plural
assignments track inter-variable dependencies (e.g., which book
each student read) that individual assignments cannot express.
Originates in plural dynamic semantics (@cite{van-der-berg-1996}, @cite{nouwen-2003}, @cite{brasoveanu-2008}). Spector's innovation is using them in a static (non-dynamic) setting.
Uses a structure wrapper to prevent Lean from currying
(Nat → Option D) → Prop into Nat → Option D → Prop.
- pred : PartialAssign D → Prop
The membership predicate on atomic assignments.
Instances For
Equations
- Core.PluralAssign.instMembershipPartialAssign = { mem := fun (G : Core.PluralAssign D) (g : Core.PartialAssign D) => G.pred g }
Whether G contains at least one atomic assignment.
Instances For
Restrict a plural assignment to atomic assignments mapping x to a.
@cite{spector-2025} §6.2: G_{x=a} is the subset of G where
g(x) = a.
Instances For
Whether x is singular in G: there is exactly one value
assigned to x across all atomic assignments in G.
@cite{spector-2025} §6.2: |G(x)| = 1 — the variable denotes
an atomic individual. Requires both:
- existence: at least one
g ∈ Gdefinesx - agreement: all
g ∈ Gthat definexagree on the value
Equations
Instances For
The atomic(x) predicate for plural assignments (propositional).
@cite{spector-2025} §6.3: ⟦atomic(x)⟧^{w,G} = 1 if |G(x)| = 1,
0 if |G(x)| ≠ 1. Replaces U(x) from the simplified system.
Equivalent to singular: all assignments in G that define x
map it to the same value.
Instances For
The null plural assignment: all possible partial assignments. @cite{spector-2025} §6: the starting context contains all pairs.
Equations
- Core.PluralAssign.null = { pred := fun (x : Core.PartialAssign D) => True }
Instances For
Build a plural assignment from a predicate.
Equations
- Core.PluralAssign.ofPred p = { pred := p }
Instances For
Witness-level singularity: G assigns x uniquely to d.
@cite{spector-2025} §6.2: at least one atomic assignment maps x to d,
and all assignments in G that define x agree on d.
Equations
Instances For
singular is the existential closure of singularAt.