An induction, then a partial iteration: one partial iteration #
DescriptiveComplexity.StepDef.stratify composes two inflationary
inductions. This file composes an inflationary induction with a partial
one (DescriptiveComplexity.StepDef.stratifyPFP): the value of the second
iteration, run over the structure expanded by the first one's limit, is the
value of a single partial iteration
(DescriptiveComplexity.StepDef.pfpHolds_stratifyPFP).
That is what closes DescriptiveComplexity.PSPACE under FO(LFP) reductions
(DescriptiveComplexity.FixedPointReductionSpace): a reduction's induction has
to be absorbed into the membership witness, and PSPACE's witness is a partial
iteration.
Why a partial second stratum still works #
The received reason to expect trouble is that a partial iteration is not
monotone, so “run the second stratum once the first has converged” cannot be
arranged by inflation, as DescriptiveComplexity.StepDef.stratify arranges it.
What makes it work anyway is that only the gating needs monotonicity, and the
gate is a bit of the state, not of the second stratum:
- the first stratum's variables accumulate – its step formula is written with the accumulation spelled out, since the composite iteration replaces rather than accumulates;
- the gate is an arity-
0variable, set once the first stratum's step formulas add nothing (DescriptiveComplexity.stratGateF) and never unset; - the second stratum's step is conjoined with the gate, so its variables stay empty until the gate fires and then iterate partially, from the empty assignment, over the frozen first stratum.
The stage count then shifts by the gate's index and nothing else: the composite
is at stage G + 1 + m exactly what the second stratum is at stage m
(DescriptiveComplexity.StepDef.strat2Assign_partStage_add). Fixed points can
only occur after the gate has fired – before it, either the first stratum still
moves or the gate itself does – so the composite converges exactly when the
second stratum does, and reads the same output there.
The atom of a first-stratum variable #
A first-stratum variable, as a formula over the combined block: the composite iteration replaces rather than accumulates, so the accumulation has to be written out.
Equations
- DescriptiveComplexity.strat1AtomF L B₁ B₂ i = (DescriptiveComplexity.strat1Sym L B₁ B₂ i).formula fun (j : Fin (B₁.arity i)) => FirstOrder.Language.var j
Instances For
Dependency graph
Dependency graph
The composite #
An inflationary stratum followed by a partial one: the first stratum's variables accumulate, the gate fires when they stop moving, and the second stratum's variables iterate partially behind the gate, over the frozen first stratum.
Reducible, so that the block of the composite is the combined block: the stage lemmas below rewrite with assignment-level equalities, which instance search must see through.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
One step of the first stratum: its own inflationary step, the accumulation being written out.
Dependency graph
One step of the gate: set once the first stratum's steps add nothing, and never unset.
Dependency graph
One step of the second stratum: empty until the gate fires, one partial step over the frozen first stratum afterwards.
Dependency graph
The three parts of one step #
The first stratum of one step is its own inflationary step.
Dependency graph
The gate of one step.
Dependency graph
The second stratum of one step.
Dependency graph
The stages of the composite #
The first stratum of the composite stages is its own inflationary stages.
Dependency graph
The gate of the composite stages: it turns on when the first stratum stops moving, and never off.
Dependency graph
The gate is off at the start.
Dependency graph
The gate stays on.
Dependency graph
While the gate is off, the second stratum stays empty.
Dependency graph
Once the gate is on and the first stratum frozen, the second stratum replays its own partial stages.
Dependency graph
The value of the composite #
An inflationary limit is reached at any stage that stops moving.
Dependency graph
An assignment of the combined block is its three parts.
Dependency graph
The composite computes the second iteration over the first one's limit. An inflationary induction followed by a partial iteration is one partial iteration: the composite converges exactly when the second stratum does, over the structure expanded by the first stratum's limit, and reads the same output there.