Fair enumeration for a fragment-relative consistency property (issue #8 tranche 2, commit 3) #
Generic over a universe U and a ConsistencyPropertyEqOn U: a finite consistent S₀ ⊆ U
extends to a Henkin-complete S* ⊇ S₀. The schedule is a prefix sweep — stage (n+1)
processes requests 0,…,n starting from stage n — so, given a surjection e : ℕ → Request U,
each request e k is processed during every sweep after k (fairness with no arithmetic about
Nat.pair), while each sweep adds only finitely many sentences.
Branching / witness rules make a classical choice at the moment the request fires; the
triggering sentence stays present, so re-processing is harmless. The union S* is never claimed
to be in C.sets (Finding 1) — only that each closure target cohabits a later stage.
Named lemmas exposed for the inseparable-pair instance and the limit proof: the schedule
(stage_mono, subset_stage, stage_subset_U; stage-in-C.sets is automatic via the SetIn
subtype), the firing API (request_fires_after — every request fires in a sweep after any given
stage, via beforeRequest/process_beforeRequest_eq_sweep/sweep_mono), and finite-stage
preservation (finite_stage).
The remaining piece (the HenkinComplete Sstar acceptance theorem) is the per-field limit proof;
it consumes request_fires_after plus per-request "what process adds" facts.
A scheduling request. Decomposition rules dispatch on the trigger's outermost shape; idx
supplies the per-index parameter (component / instance / which negated-implication conclusion)
and is ignored by the classical-choice rules.
- decompose {L : Language} {U : Set (L.withConstants ℕ).Sentenceω} (t : ↑U) (idx : ℕ) : Request U
- impC1 {L : Language} {U : Set (L.withConstants ℕ).Sentenceω} (t : ↑U) : Request U
- eqRefl {L : Language} {U : Set (L.withConstants ℕ).Sentenceω} (c : ℕ) : Request U
- eqSymm {L : Language} {U : Set (L.withConstants ℕ).Sentenceω} (a b : ℕ) : Request U
- eqTrans {L : Language} {U : Set (L.withConstants ℕ).Sentenceω} (a b d : ℕ) : Request U
- relCongr {L : Language} {U : Set (L.withConstants ℕ).Sentenceω} (l : ℕ) (R : L.Relations l) (g : Fin l → ℕ) (i : Fin l) (b : ℕ) : Request U
Instances For
One processing step #
A member of the consistency family, bundled with its membership proof.
Instances For
Process a decomposition request: if the trigger t is present, add the target dictated by
its outermost shape (the per-index rules use idx; the branching/witness rules choose
classically).
Equations
- One or more equations did not get rendered due to their size.
Instances For
Process a C1 request: inspects only the outer imp constructor (so it reduces on
φ.imp ψ regardless of whether φ/ψ later specialize to the negation encoding — the field
that a shape-dispatching decompose leaves stuck).
Equations
- One or more equations did not get rendered due to their size.
Instances For
Process one request.
Equations
- One or more equations did not get rendered due to their size.
- FirstOrder.Language.process S (FirstOrder.Language.Request.decompose t idx) = FirstOrder.Language.processDecompose S t idx
- FirstOrder.Language.process S (FirstOrder.Language.Request.impC1 t) = FirstOrder.Language.processImpC1 S t
- FirstOrder.Language.process S (FirstOrder.Language.Request.eqRefl c) = ⟨↑S ∪ {FirstOrder.Language.constEq c c}, ⋯⟩
- FirstOrder.Language.process S (FirstOrder.Language.Request.eqSymm a b) = if h : FirstOrder.Language.constEq a b ∈ ↑S then ⟨↑S ∪ {FirstOrder.Language.constEq b a}, ⋯⟩ else S
Instances For
Processing only grows the set (processDecompose).
Processing only grows the set.
The prefix-sweep schedule #
One sweep: process requests e 0, …, e n in order.
Equations
- FirstOrder.Language.sweep e S 0 = FirstOrder.Language.process S (e 0)
- FirstOrder.Language.sweep e S n.succ = FirstOrder.Language.process (FirstOrder.Language.sweep e S n) (e (n + 1))
Instances For
stage (n+1) processes requests 0,…,n starting from stage n.
Equations
- FirstOrder.Language.stage e S₀ 0 = S₀
- FirstOrder.Language.stage e S₀ n.succ = FirstOrder.Language.sweep e (FirstOrder.Language.stage e S₀ n) n
Instances For
Stage monotonicity (one step).
Stage monotonicity.
S₀ ⊆ every stage.
Each stage lies in U.
The limit of the enumeration.
Equations
- FirstOrder.Language.Sstar e S₀ = ⋃ (n : ℕ), ↑(FirstOrder.Language.stage e S₀ n)
Instances For
The firing API #
The accumulated set just before request e k is processed in a sweep from S.
Equations
Instances For
Processing e k at its accumulated point advances the sweep by one — nearly definitional.
Sweeps are monotone in the number of requests processed.
The firing consumer lemma (fairness): for a surjective schedule, every request fires in
some sweep after any given stage m — the pre-accumulator contains stage m, and the process
output at the firing lands inside stage (n+1).
Finite-stage preservation #
Finite-stage preservation: from a finite initial set, every stage is finite (documenting that the construction stays inside the finite-pair instance).
What each firing adds (process specs) #
The limit is Henkin-complete #
If a firing of r on any accumulator containing member adds target, and member ∈ S*,
then target ∈ S*.
Disjunctive variant (for branching fields).
Existential variant (for witness fields).
Unconditional variant (for reflexivity, which has no trigger).
Two-premise variant (for transitivity / relation congruence).
The limit is Henkin-complete.
Fair enumeration (the acceptance theorem): a consistent set in a ConsistencyPropertyEqOn U (over a countable U and countable relation symbols) extends to a Henkin-complete S* ⊇ S₀
inside U.