The level lattice + the minimal-(m,n) solver core #
The synthesizer (ParamSynth) composes Param witnesses at a fixed level. The
full engine picks the minimal (m,n) a goal needs and synthesizes there. This
module supplies the solver's mathematical core:
- the
MapClasslattice order≤(not linear —map2a/map2bare incomparable, both belowmap3), withDecidable, the partial-order laws, and the meet (⊓) = greatest lower bound (the "least common level"); - the level-arithmetic decision tables
arrowReq/forallReq: for a desired output level, the exact input levels eachMap_k_arrow/Map_k_forallrequires (read offParamArrow.lean/ParamForall.lean). A level-directed resolution or aMetaMsolver consults these to dispatch the right combinator — the Lean analogue of Trocq's Elpiparam-classconstraint solver.
What remains for the full solver is the resolution wiring (variable-level
HasParam with these tables driving instance selection), built on this substrate.
The lattice order on MapClass #
The structure order: map0 ⊑ map1 ⊑ {map2a, map2b} ⊑ map3 ⊑ map4, with map2a,
map2b incomparable. le m' m means m' carries no more structure than m.
Equations
- Transfer.Param.MapClass.map0.le x✝ = true
- Transfer.Param.MapClass.map1.le Transfer.Param.MapClass.map0 = false
- Transfer.Param.MapClass.map1.le x✝ = true
- Transfer.Param.MapClass.map2a.le Transfer.Param.MapClass.map2a = true
- Transfer.Param.MapClass.map2a.le Transfer.Param.MapClass.map3 = true
- Transfer.Param.MapClass.map2a.le Transfer.Param.MapClass.map4 = true
- Transfer.Param.MapClass.map2a.le x✝ = false
- Transfer.Param.MapClass.map2b.le Transfer.Param.MapClass.map2b = true
- Transfer.Param.MapClass.map2b.le Transfer.Param.MapClass.map3 = true
- Transfer.Param.MapClass.map2b.le Transfer.Param.MapClass.map4 = true
- Transfer.Param.MapClass.map2b.le x✝ = false
- Transfer.Param.MapClass.map3.le Transfer.Param.MapClass.map3 = true
- Transfer.Param.MapClass.map3.le Transfer.Param.MapClass.map4 = true
- Transfer.Param.MapClass.map3.le x✝ = false
- Transfer.Param.MapClass.map4.le Transfer.Param.MapClass.map4 = true
- Transfer.Param.MapClass.map4.le x✝ = false
Instances For
m' ⊑ m: m' carries no more structure than m (the lattice order).
Equations
- Transfer.Param.«term_⊑_» = Lean.ParserDescr.trailingNode `Transfer.Param.«term_⊑_» 50 51 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " ⊑ ") (Lean.ParserDescr.cat `term 51))
Instances For
The meet (greatest lower bound): the least common structure level.
Equations
- Transfer.Param.MapClass.map0.meet x✝ = Transfer.Param.MapClass.map0
- x✝.meet Transfer.Param.MapClass.map0 = Transfer.Param.MapClass.map0
- Transfer.Param.MapClass.map1.meet x✝ = Transfer.Param.MapClass.map1
- x✝.meet Transfer.Param.MapClass.map1 = Transfer.Param.MapClass.map1
- Transfer.Param.MapClass.map2a.meet Transfer.Param.MapClass.map2a = Transfer.Param.MapClass.map2a
- Transfer.Param.MapClass.map2b.meet Transfer.Param.MapClass.map2b = Transfer.Param.MapClass.map2b
- Transfer.Param.MapClass.map2a.meet Transfer.Param.MapClass.map2b = Transfer.Param.MapClass.map1
- Transfer.Param.MapClass.map2b.meet Transfer.Param.MapClass.map2a = Transfer.Param.MapClass.map1
- Transfer.Param.MapClass.map2a.meet x✝ = Transfer.Param.MapClass.map2a
- x✝.meet Transfer.Param.MapClass.map2a = Transfer.Param.MapClass.map2a
- Transfer.Param.MapClass.map2b.meet x✝ = Transfer.Param.MapClass.map2b
- x✝.meet Transfer.Param.MapClass.map2b = Transfer.Param.MapClass.map2b
- Transfer.Param.MapClass.map3.meet Transfer.Param.MapClass.map3 = Transfer.Param.MapClass.map3
- Transfer.Param.MapClass.map3.meet Transfer.Param.MapClass.map4 = Transfer.Param.MapClass.map3
- Transfer.Param.MapClass.map4.meet Transfer.Param.MapClass.map3 = Transfer.Param.MapClass.map3
- Transfer.Param.MapClass.map4.meet Transfer.Param.MapClass.map4 = Transfer.Param.MapClass.map4
Instances For
The level-arithmetic decision tables (the solver's dispatch core) #
For a desired output forward level of the arrow/forall combinator, these give the
exact (m,n) the two arguments must have — read directly off ParamArrow.lean /
ParamForall.lean. A level-directed resolver consults these to choose which
Map_k_{arrow,forall} to apply.
Required argument levels for Map_k_arrow at a given output forward level.
Returns (PA.fwd, PA.bwd, PB.fwd, PB.bwd). From ParamArrow.lean:
Map1_arrow ← Param01/Param10, Map2a_arrow ← Param02b/Param2a0,
Map2b_arrow ← Param02a/Param2b0, Map3_arrow ← Param03/Param30.
Equations
- Transfer.Param.arrowReq Transfer.Param.MapClass.map0 = some (Transfer.Param.MapClass.map0, Transfer.Param.MapClass.map0, Transfer.Param.MapClass.map0, Transfer.Param.MapClass.map0)
- Transfer.Param.arrowReq Transfer.Param.MapClass.map1 = some (Transfer.Param.MapClass.map0, Transfer.Param.MapClass.map1, Transfer.Param.MapClass.map1, Transfer.Param.MapClass.map0)
- Transfer.Param.arrowReq Transfer.Param.MapClass.map2a = some (Transfer.Param.MapClass.map0, Transfer.Param.MapClass.map2b, Transfer.Param.MapClass.map2a, Transfer.Param.MapClass.map0)
- Transfer.Param.arrowReq Transfer.Param.MapClass.map2b = some (Transfer.Param.MapClass.map0, Transfer.Param.MapClass.map2a, Transfer.Param.MapClass.map2b, Transfer.Param.MapClass.map0)
- Transfer.Param.arrowReq Transfer.Param.MapClass.map3 = some (Transfer.Param.MapClass.map0, Transfer.Param.MapClass.map3, Transfer.Param.MapClass.map3, Transfer.Param.MapClass.map0)
- Transfer.Param.arrowReq Transfer.Param.MapClass.map4 = some (Transfer.Param.MapClass.map0, Transfer.Param.MapClass.map3, Transfer.Param.MapClass.map3, Transfer.Param.MapClass.map0)
Instances For
Required domain level for Map_k_forall at a given output forward level (the
codomain family is at (k, map0)). From ParamForall.lean: Map1_forall needs the
domain at Param02a (backward map2a); Map2a_forall needs the domain at
Param04 (backward map4 = univalence) — the localized UA boundary.
Equations
- Transfer.Param.forallReq Transfer.Param.MapClass.map0 = some Transfer.Param.MapClass.map0
- Transfer.Param.forallReq Transfer.Param.MapClass.map1 = some Transfer.Param.MapClass.map2a
- Transfer.Param.forallReq Transfer.Param.MapClass.map2a = some Transfer.Param.MapClass.map4
- Transfer.Param.forallReq x✝ = none
Instances For
The univalence-free forall fragment: output levels whose domain requirement stays
below map4. Exactly {map0, map1} — matching the localization in ParamForall.
Equations
- Transfer.Param.forallUnivalenceFree k = match Transfer.Param.forallReq k with | some d => d.le Transfer.Param.MapClass.map2a | none => false
Instances For
Map1_forall is univalence-free; Map2a_forall is not (needs map4 domain).