Documentation

DescriptiveComplexity.FixedPointStep

Simultaneous first-order inductions: one skeleton for IFP and PFP #

The inflationary (FO(IFP)) and partial (FO(PFP)) fixed-point logics differ in exactly one place – what one application of the step formulas does with the previous stage. Everything else is shared: the data (a block of relation variables, one first-order step formula per variable, an output sentence), the notion of a stage, stabilization on finite structures, transport along isomorphisms, and the pullback along a first-order interpretation. This file provides that shared skeleton; the logics themselves are built on it in DescriptiveComplexity.FixedPointInflationary and DescriptiveComplexity.FixedPointPartial.

The data #

A DescriptiveComplexity.StepDef over L bundles a block B of relation variables, one step formula per variable – a first-order formula over L.sum B.lang whose free variables are the arguments of the variable – and an output sentence over the same expanded vocabulary. This is one simultaneous induction with a first-order output; nesting is treated by stratification, in DescriptiveComplexity.FixedPointInflationary.

Unlike DescriptiveComplexity.LFPDef, whose rules are clausal data (the library's Horn-program normal form), the step formulas here are unrestricted: positivity is exactly what the inflationary and partial iterations dispense with. LFPDef keeps its clausal form – the two are bridged in DescriptiveComplexity.FixedPointInflationary (rules give a StepDef) and DescriptiveComplexity.FixedPointInflationaryLFP (the converse translation).

The two iterations #

Transport #

Both iterations commute with transporting an assignment along an isomorphism (DescriptiveComplexity.StepDef.inflStage_map, DescriptiveComplexity.StepDef.partStage_map) and with the pullback of the block through a first-order interpretation (DescriptiveComplexity.StepDef.inflStage_pull, DescriptiveComplexity.StepDef.partStage_pull, for the pulled definition DescriptiveComplexity.StepDef.pull). Each is one commuting lemma about DescriptiveComplexity.StepDef.next (next_map, next_pull) propagated along the orbit; these are the lemmas isomorphism-invariance and closure under reductions rest on, for every logic built on this skeleton.

Assignments form a finite type #

The all-empty assignment of a block: the starting point of both iterations.

Equations
Instances For
    Dependency graph

    Transport along an equivalence maps the empty assignment to the empty assignment.

    Dependency graph
    Dependency graph

    Realization transport with explicit structures #

    The structures a stage is read against are block expansions, which are not instances; this is FirstOrder.Language.StrongHomClass.realize_formula with the two structures passed explicitly, exactly as DescriptiveComplexity.realize_sentence_of_equiv does at the sentence level.

    theorem DescriptiveComplexity.realize_formula_of_equiv {L' : FirstOrder.Language} {M N α : Type} {instM : L'.Structure M} {instN : L'.Structure N} (e : L'.Equiv M N) (φ : L'.Formula α) (v : αM) :
    (φ.Realize fun (a : α) => e (v a)) φ.Realize v
    Dependency graph

    The data of a simultaneous induction #

    A simultaneous first-order induction: a block of relation variables, one first-order step formula per variable – over the base vocabulary expanded by the block, its free variables the arguments of the variable – and an output sentence over the same expanded vocabulary, read at the value of the iteration. The step formulas are unrestricted; which iteration is applied to them (inflationary or partial) is chosen by the logics built on this data.

    • The relation variables computed by the iteration.

    • step (i : self.B.ι) : (L.sum self.B.lang).Formula (Fin (self.B.arity i))

      The step formula of each variable; its free variables are the arguments of the variable.

    • out : (L.sum self.B.lang).Sentence

      The first-order output, over the expanded vocabulary – unrestricted, in particular free to negate fixed-point atoms.

    Instances For
      Dependency graph

      One application of the step formulas to an assignment.

      Equations
      Instances For
        Dependency graph

        The inflationary step: accumulate the step formulas into the previous stage.

        Equations
        Instances For
          Dependency graph

          The stages of the inflationary iteration.

          Equations
          Instances For
            Dependency graph

            The stages of the partial iteration.

            Equations
            Instances For
              Dependency graph

              The value of the inflationary iteration: the union of the stages. On a finite structure this is the stage at the atom count (DescriptiveComplexity.StepDef.inflLimit_eq_stage_card).

              Equations
              Instances For
                Dependency graph
                Dependency graph
                Dependency graph
                theorem DescriptiveComplexity.StepDef.inflStage_le_succ {L : FirstOrder.Language} (d : StepDef L) {A : Type} [L.Structure A] (n : ) (i : d.B.ι) (x : Fin (d.B.arity i)A) (h : d.inflStage A n i x) :
                d.inflStage A (n + 1) i x

                The inflationary stages increase.

                Dependency graph
                theorem DescriptiveComplexity.StepDef.inflStage_le_of_le {L : FirstOrder.Language} (d : StepDef L) {A : Type} [L.Structure A] {m n : } (hmn : m n) (i : d.B.ι) (x : Fin (d.B.arity i)A) (h : d.inflStage A m i x) :
                d.inflStage A n i x

                The inflationary stages increase, monotonically.

                Dependency graph

                Two partial stages that are both fixed points of the step are equal: the value of a converging partial iteration does not depend on which stable stage witnesses the convergence.

                Dependency graph

                Stabilization on finite structures #

                The inflationary stages plateau within the atom count.

                Dependency graph

                The inflationary iteration reaches a fixed point within the atom count – the height of the subset lattice of the block's atoms, not the number of assignments.

                Dependency graph

                The inflationary stages are constant from the atom count on.

                Dependency graph

                On a finite structure, the value of the inflationary iteration is the stage at the atom count.

                Dependency graph

                The value of the inflationary iteration is a fixed point of the inflationary step.

                Dependency graph

                If the partial iteration converges at all, it converges within the number of assignments of the block – the pigeonhole DescriptiveComplexity.isFixedPt_iterate_card_iff read on the stages.

                Dependency graph

                Transport along isomorphisms #

                theorem DescriptiveComplexity.StepDef.next_map {L : FirstOrder.Language} (d : StepDef L) {M N : Type} [L.Structure M] [L.Structure N] (e : L.Equiv M N) (ρ : d.B.Assignment M) :
                d.next (d.B.mapAssign e.toEquiv ρ) = d.B.mapAssign e.toEquiv (d.next ρ)

                One application of the step formulas commutes with transporting the assignment along an isomorphism: the step formulas cannot tell isomorphic expanded structures apart.

                Dependency graph
                theorem DescriptiveComplexity.StepDef.inflStep_map {L : FirstOrder.Language} (d : StepDef L) {M N : Type} [L.Structure M] [L.Structure N] (e : L.Equiv M N) (ρ : d.B.Assignment M) :

                The inflationary step commutes with transport along an isomorphism.

                Dependency graph
                theorem DescriptiveComplexity.StepDef.inflStage_map {L : FirstOrder.Language} (d : StepDef L) {M N : Type} [L.Structure M] [L.Structure N] (e : L.Equiv M N) (n : ) :

                The inflationary stages transport along an isomorphism.

                Dependency graph
                theorem DescriptiveComplexity.StepDef.partStage_map {L : FirstOrder.Language} (d : StepDef L) {M N : Type} [L.Structure M] [L.Structure N] (e : L.Equiv M N) (n : ) :

                The partial stages transport along an isomorphism.

                Dependency graph

                The value of the inflationary iteration transports along an isomorphism.

                Dependency graph

                Being a fixed point of the step is insensitive to transporting the assignment along an isomorphism.

                Dependency graph

                Pullback through an interpretation #

                theorem DescriptiveComplexity.SOBlock.pullAssign_botAssign (B : SOBlock) {Tag : Type} [Finite Tag] {dm : } {A : Type} :
                B.pullAssign (B.botAssign (Tag × (Fin dmA))) = (pull Tag dm B).botAssign A

                Pulling back the empty assignment gives the empty assignment.

                Dependency graph
                noncomputable def DescriptiveComplexity.StepDef.pull {L₁ L₂ : FirstOrder.Language} [L₂.IsRelational] {Tag : Type} [Finite Tag] {dm : } (dd : StepDef L₂) (I : FOInterpretation L₁ L₂ Tag dm) :
                StepDef L₁

                The pullback of a simultaneous induction through a tagged interpretation: the block is pulled back variable by variable (DescriptiveComplexity.SOBlock.pull), the step formula of a pulled variable is the pullback of the original variable's step formula at the pulled variable's tag tuple (DescriptiveComplexity.guardPull, through the extended interpretation DescriptiveComplexity.FOInterpretation.extendSO), and the output sentence is pulled through the extended interpretation.

                Equations
                • One or more equations did not get rendered due to their size.
                Instances For
                  Dependency graph
                  theorem DescriptiveComplexity.StepDef.next_pull {L₁ L₂ : FirstOrder.Language} [L₂.IsRelational] {Tag : Type} [Finite Tag] {dm : } (I : FOInterpretation L₁ L₂ Tag dm) (dd : StepDef L₂) {A : Type} [L₁.Structure A] (ρ : dd.B.Assignment (I.Map A)) :
                  (dd.pull I).next (dd.B.pullAssign ρ) = dd.B.pullAssign (dd.next ρ)

                  One application of the pulled step formulas is the pullback of one application of the original ones: the single commuting square from which every transport of the iterations along a reduction follows.

                  Dependency graph
                  theorem DescriptiveComplexity.StepDef.inflStep_pull {L₁ L₂ : FirstOrder.Language} [L₂.IsRelational] {Tag : Type} [Finite Tag] {dm : } (I : FOInterpretation L₁ L₂ Tag dm) (dd : StepDef L₂) {A : Type} [L₁.Structure A] (ρ : dd.B.Assignment (I.Map A)) :
                  (dd.pull I).inflStep (dd.B.pullAssign ρ) = dd.B.pullAssign (dd.inflStep ρ)

                  The inflationary step commutes with the pullback.

                  Dependency graph
                  theorem DescriptiveComplexity.StepDef.inflStage_pull {L₁ L₂ : FirstOrder.Language} [L₂.IsRelational] {Tag : Type} [Finite Tag] {dm : } (I : FOInterpretation L₁ L₂ Tag dm) (dd : StepDef L₂) (A : Type) [L₁.Structure A] (n : ) :
                  (dd.pull I).inflStage A n = dd.B.pullAssign (dd.inflStage (I.Map A) n)

                  The inflationary stages of the pulled induction are the pullbacks of the original stages.

                  Dependency graph
                  theorem DescriptiveComplexity.StepDef.partStage_pull {L₁ L₂ : FirstOrder.Language} [L₂.IsRelational] {Tag : Type} [Finite Tag] {dm : } (I : FOInterpretation L₁ L₂ Tag dm) (dd : StepDef L₂) (A : Type) [L₁.Structure A] (n : ) :
                  (dd.pull I).partStage A n = dd.B.pullAssign (dd.partStage (I.Map A) n)

                  The partial stages of the pulled induction are the pullbacks of the original stages.

                  Dependency graph
                  theorem DescriptiveComplexity.StepDef.inflLimit_pull {L₁ L₂ : FirstOrder.Language} [L₂.IsRelational] {Tag : Type} [Finite Tag] {dm : } (I : FOInterpretation L₁ L₂ Tag dm) (dd : StepDef L₂) (A : Type) [L₁.Structure A] :
                  (dd.pull I).inflLimit A = dd.B.pullAssign (dd.inflLimit (I.Map A))

                  The value of the pulled inflationary iteration is the pullback of the original value.

                  Dependency graph
                  theorem DescriptiveComplexity.StepDef.isFixedPt_next_pull_iff {L₁ L₂ : FirstOrder.Language} [L₂.IsRelational] {Tag : Type} [Finite Tag] {dm : } (I : FOInterpretation L₁ L₂ Tag dm) (dd : StepDef L₂) {A : Type} [L₁.Structure A] (ρ : dd.B.Assignment (I.Map A)) :

                  Being a fixed point of the step is insensitive to pulling the assignment back: the pullback of assignments is a bijection (DescriptiveComplexity.SOBlock.mergeAssign_pullAssign) intertwining the two steps.

                  Dependency graph