Inheritance hierarchies #
The rival horn of the motivation question ([JA20] ch. 3): a
lexical entry is motivated by inheriting default properties from a more general
entry, overriding where it legislates locally. A Hierarchy is a single-parent
chain with acyclicity witnessed by a well-founded parent relation (the taxonomy
of [JA20]'s Figure 3.5); multiple inheritance — a node with
two schematic parents, as in their cross-classifying cases — is deferred to a
future engine and out of scope here.
Default/override lookup (Hierarchy.value) reads a node's local specification if
present, else the nearest ancestor's. It is computed by fuel-bounded structural
recursion saturating at Fintype.card, so it kernel-reduces (a
WellFounded.fix definition would not, blocking decide). Acyclicity is not
needed for the lookup laws — card fuel saturates any finite parent map — so
value_eq_of_att and value_eq_parent hold structurally; the well-founded
field records the taxonomy commitment and feeds later results.
Formal defaults-with-override traditions this abstracts: DATR
([EG96]) and Network Morphology ([BH12]).
[JA20] argue inheritance and the impoverished-entry model do
not by themselves explicate motivation — their claim, contested in the DATR
literature. The one-level default-override primitive already lives in
Syntax/ConstructionGrammar/Inheritance.lean (inheritField, child-wins); the
transitive chain walk here is new, and the shared Option-level override
primitive is a candidate for a future Core/Order/ lift.
Main declarations #
Hierarchy— a single-parent chain with a well-founded parent relationvalueFuel,Hierarchy.value— fuel-bounded default/override lookupHierarchy.value_eq_of_att,Hierarchy.value_eq_parent— override wins; path extension to the parentHierarchy.parent_asymm— no 2-cycle: nodes cannot be each other's parent
Default/override lookup with a step budget: at fuel 0 only the local
specification is read; each further unit walks one step to the parent.
Equations
- Morphology.Construction.valueFuel parent att 0 x✝ = att x✝
- Morphology.Construction.valueFuel parent att k.succ x✝ = match att x✝ with | some v => some v | none => (parent x✝).bind (Morphology.Construction.valueFuel parent att k)
Instances For
Fuel monotonicity and saturation #
A local specification is read at any fuel.
Two fuel levels giving the same lookup give the same lookup after one more step: the recursion consumes only the previous level.
Once a fuel level is a fixed point, every larger level agrees with it.
Card fuel saturates: with Fintype.card fuel the lookup is a fixed
point of the one-step recursion. A monotone chain of defined-sets bounded by the
universe can strictly grow at most card times.
Default/override lookup: a node's local specification if present, else the
nearest ancestor's, computed by saturating the fuel recursion at Fintype.card.
Equations
- h.value att n = Morphology.Construction.valueFuel h.parent att (Fintype.card ι) n
Instances For
Path extension: at a node with no local specification, the value is the parent's.
No 2-cycle: in a well-founded hierarchy no two nodes are each other's parent. This is the obstruction a single directed inheritance relation hits on [JA20]'s Objection 10 — a pair whose form and meaning planes demand opposite parent orientations cannot both be edges of one acyclic hierarchy.
Figure 3.5: default and override #
The taxonomy Animal → Bird/Fish, Bird → Canary/Ostrich: birds fly by
default, the ostrich overrides to not-fly, the canary inherits flight. A concept
hierarchy, not linguistic data — an abstract witness that override and default
inheritance compute as intended.
Equations
- Morphology.Construction.instDecidableEqAnimal x✝ y✝ = if h : Morphology.Construction.Animal.ctorIdx✝ x✝ = Morphology.Construction.Animal.ctorIdx✝ y✝ then isTrue ⋯ else isFalse ⋯
Equations
- One or more equations did not get rendered due to their size.