Documentation

DescriptiveComplexity.SecondOrderKromPull

Pulling SO-Krom definability back through an interpretation #

SO-Krom definability is closed under (ordered) first-order reductions (DescriptiveComplexity.SigmaSOKromDefinable.of_orderedReduction). This is what makes the fragment a DescriptiveComplexity.ComplexityClass – the class DescriptiveComplexity.NL – rather than a mere definability predicate.

The argument is the one of DescriptiveComplexity.SecondOrderHornPull, and it works for the same structural reason: the Krom condition constrains the occurrences of the second-order variables only, while an interpretation rewrites the input-vocabulary atoms, which live in the guard, where anything is allowed. Pulling a clause back through a d-dimensional interpretation with tag type Tag:

The shared pieces (DescriptiveComplexity.SOAtom.pull, DescriptiveComplexity.guardPull, DescriptiveComplexity.tagVal, DescriptiveComplexity.allTagAssign) are in DescriptiveComplexity.SecondOrderPull, and the order enters exactly as it does for SO-Horn: the pullback interprets the target's order by the lexicographic order on tagged tuples (DescriptiveComplexity.FOInterpretation.ordExtend).

Pulling back a literal, a clause and a program #

def DescriptiveComplexity.KromLit.pull {Tag : Type} [Finite Tag] {B : SOBlock} {k : } (l : KromLit B k) (d : ) (t : Fin kTag) :
KromLit (SOBlock.pull Tag d B) (k * d)

The pullback of a literal: same sign, pulled atom.

Equations
Instances For
    Dependency graph
    theorem DescriptiveComplexity.KromLit.pull_holds {L₁ L₂ : FirstOrder.Language} {Tag : Type} [Finite Tag] {d : } {B : SOBlock} {k : } {A : Type} (I : FOInterpretation L₁ L₂ Tag d) (l : KromLit B k) (t : Fin kTag) (ρ : B.Assignment (I.Map A)) (w : Fin (k * d)A) :
    (l.pull d t).Holds (B.pullAssign ρ) w l.Holds ρ (tagVal I t w)
    Dependency graph
    theorem DescriptiveComplexity.KromLit.slotHolds_pull {L₁ L₂ : FirstOrder.Language} {Tag : Type} [Finite Tag] {d : } {B : SOBlock} {k : } {A : Type} (I : FOInterpretation L₁ L₂ Tag d) (o : Option (KromLit B k)) (t : Fin kTag) (ρ : B.Assignment (I.Map A)) (w : Fin (k * d)A) :
    slotHolds (Option.map (fun (l : KromLit B k) => l.pull d t) o) (B.pullAssign ρ) w slotHolds o ρ (tagVal I t w)
    Dependency graph
    noncomputable def DescriptiveComplexity.KromClause.pull {L₁ L₂ : FirstOrder.Language} {Tag : Type} [Finite Tag] {d : } {B : SOBlock} {k : } [L₂.IsRelational] (I : FOInterpretation L₁ L₂ Tag d) (c : KromClause L₂ B k) (t : Fin kTag) :
    KromClause L₁ (SOBlock.pull Tag d B) (k * d)

    The pullback of a Krom clause at a tag assignment: guards pull back as formulas, literals keep their signs – so the result is again a Krom clause.

    Equations
    • One or more equations did not get rendered due to their size.
    Instances For
      Dependency graph
      theorem DescriptiveComplexity.KromClause.pull_holds {L₁ L₂ : FirstOrder.Language} {Tag : Type} [Finite Tag] {d : } {B : SOBlock} {k : } [L₂.IsRelational] {A : Type} [L₁.Structure A] (I : FOInterpretation L₁ L₂ Tag d) (c : KromClause L₂ B k) (t : Fin kTag) (ρ : B.Assignment (I.Map A)) (w : Fin (k * d)A) :
      (pull I c t).Holds (B.pullAssign ρ) w c.Holds ρ (tagVal I t w)
      Dependency graph
      noncomputable def DescriptiveComplexity.KromProgram.pull {L₁ L₂ : FirstOrder.Language} {Tag : Type} [Finite Tag] {d : } {B : SOBlock} {k : } [L₂.IsRelational] (I : FOInterpretation L₁ L₂ Tag d) (prog : KromProgram L₂ B k) :
      KromProgram L₁ (SOBlock.pull Tag d B) (k * d)

      The pullback of a Krom program: one clause per clause of the program and per assignment of tags to its universally quantified variables.

      Equations
      • One or more equations did not get rendered due to their size.
      Instances For
        Dependency graph
        theorem DescriptiveComplexity.KromProgram.pull_mem {L₁ L₂ : FirstOrder.Language} {Tag : Type} [Finite Tag] {d : } {B : SOBlock} {k : } [L₂.IsRelational] (I : FOInterpretation L₁ L₂ Tag d) {prog : KromProgram L₂ B k} {c : KromClause L₂ B k} (hc : c prog) (t : Fin kTag) :
        KromClause.pull I c t pull I prog
        Dependency graph
        theorem DescriptiveComplexity.KromProgram.pull_cases {L₁ L₂ : FirstOrder.Language} {Tag : Type} [Finite Tag] {d : } {B : SOBlock} {k : } [L₂.IsRelational] (I : FOInterpretation L₁ L₂ Tag d) {prog : KromProgram L₂ B k} {c' : KromClause L₁ (SOBlock.pull Tag d B) (k * d)} (hc' : c' pull I prog) :
        cprog, ∃ (t : Fin kTag), c' = KromClause.pull I c t
        Dependency graph

        Correctness of the pullback #

        theorem DescriptiveComplexity.KromProgram.pull_holds {L₁ L₂ : FirstOrder.Language} {Tag : Type} [Finite Tag] {d : } {B : SOBlock} {k : } [L₂.IsRelational] {A : Type} [L₁.Structure A] (I : FOInterpretation L₁ L₂ Tag d) (prog : KromProgram L₂ B k) (ρ : B.Assignment (I.Map A)) :
        (pull I prog).Holds (B.pullAssign ρ) prog.Holds ρ

        An assignment satisfies a program on the interpreted structure iff its transfer satisfies the pulled program on the base structure.

        Dependency graph
        theorem DescriptiveComplexity.KromProgram.exists_holds_pull {L₁ L₂ : FirstOrder.Language} {Tag : Type} [Finite Tag] {d : } {B : SOBlock} {k : } [L₂.IsRelational] {A : Type} [L₁.Structure A] (I : FOInterpretation L₁ L₂ Tag d) (prog : KromProgram L₂ B k) :
        (∃ (ρ : B.Assignment (I.Map A)), prog.Holds ρ) ∃ (σ : (SOBlock.pull Tag d B).Assignment A), (pull I prog).Holds σ

        The pullback is correct: the program is satisfiable on the interpreted structure iff its pullback is satisfiable on the base structure.

        Dependency graph

        Closure under reductions #

        SO-Krom definability is closed under ordered first-order reductions. The Krom shape survives the pullback because an interpretation only rewrites the input-vocabulary atoms, which live in the guards; the second-order literals keep their signs and are merely re-indexed.

        Dependency graph

        SO-Krom definability is closed under first-order reductions.

        Dependency graph