Documentation

DescriptiveComplexity.Problems.Qsat.Tags

The shape of the QSAT instance built by the Savitch reduction #

The bookkeeping of the reduction of SUCCINCT-REACH to QSAT: what its elements are, which propositional variable each of them stands for, which clause, and in which order the prefix quantifies them. Everything here is semantic – a predicate on the coordinates of a tagged pair – so that the defining formulas of DescriptiveComplexity.Problems.Qsat.Interp have something to be compared with.

The variables (DescriptiveComplexity.QVarTag) #

Write SV for the state variables of the input instance and for the minimum of the input order. Levels of the Savitch recursion are indexed by the state variables themselves, in the ambient order.

tagcoordinatesmeaning
sS, sT(x, ⊥), x ∈ SVthe two endpoints S, T of the walk
sZ(ℓ, x)the midpoint Z_ℓ chosen at level
sU, sV(ℓ, x)the pair (U_ℓ, V_ℓ) passed below level
sB(ℓ, ⊥)the universal bit b_ℓ choosing which half is checked
aS, aT, aP(a, ⊥), a arbitrarythe valuations satisfying the three clause groups
sE(⊥, ⊥)the bit saying that the base case is an equality, not a step

The clauses (DescriptiveComplexity.QClTag) #

cSrc, cTgt, cStep copy the three clause groups of the input, read on aS, aT and aP; lS, lT, lU, lV tie those valuations to the states they must read and write; bE is the equality branch of the base case; lev is the eight clauses of one level. Each of them is a fixed list of literals (DescriptiveComplexity.qLits), a literal being the tag of its variable, its sign, and a DescriptiveComplexity.QLink saying which coordinates that variable has – which is what keeps the whole matrix clausal and the case analysis finite.

The prefix #

Every variable tag gets a key (grp, lev, slot, sec, ord), of which grp, slot and ord are static numerals (DescriptiveComplexity.keyGrp, DescriptiveComplexity.keySlot, DescriptiveComplexity.keyOrd) and lev, sec are the two coordinates in one order or the other; the prefix is the lexicographic comparison DescriptiveComplexity.KeyLt of the keys. It orders the prefix as S, T – then, for each level in increasing order, Z_ℓ, b_ℓ, U_ℓ, V_ℓ – then all the auxiliary variables, with b_ℓ the only universal one. Blocks of like polarity are exactly the sets of variables sharing the first three components (DescriptiveComplexity.keyTriple).

Tags #

The tags of the propositional variables of the QSAT instance built by the Savitch reduction.

  • sS : QVarTag

    The source endpoint S of the walk.

  • sT : QVarTag

    The target endpoint T of the walk.

  • sZ : QVarTag

    The midpoint Z_ℓ guessed at level .

  • sU : QVarTag

    The first component U_ℓ of the pair passed below level .

  • sV : QVarTag

    The second component V_ℓ of the pair passed below level .

  • sB : QVarTag

    The universal bit b_ℓ choosing which half of level is checked.

  • aS : QVarTag

    The valuation satisfying the source clauses.

  • aT : QVarTag

    The valuation satisfying the target clauses.

  • aP : QVarTag

    The valuation satisfying the transition clauses.

  • sE : QVarTag

    The bit saying that the base case is an equality rather than a step.

Instances For
    Dependency graph
    @[instance_reducible]
    Equations
    Dependency graph

    The tags of the clauses of the QSAT instance built by the Savitch reduction.

    • cSrc : QClTag

      A copy of a source clause, read on aS.

    • cTgt : QClTag

      A copy of a target clause, read on aT.

    • cStep : QClTag

      A copy of a transition clause, read on aP and guarded by sE.

    • lS : BoolQClTag

      aS reads the source endpoint S, in one of the two directions.

    • lT : BoolQClTag

      aT reads the target endpoint T, in one of the two directions.

    • lU : BoolQClTag

      aP reads U at the bottom level, guarded by sE.

    • lV : BoolQClTag

      aP writes V at the bottom level, guarded by sE.

    • bE : BoolQClTag

      The equality branch of the base case, guarded by sE.

    • lev : BoolBoolBoolQClTag

      One of the eight clauses of a level: the branch of b_ℓ, the component of the pair, and the sign.

    Instances For
      Dependency graph
      Dependency graph
      Equations
      Instances For
        Dependency graph
        @[reducible, inline]

        The tags of the interpretation: a variable tag or a clause tag.

        Equations
        Instances For
          Dependency graph
          Dependency graph
          Dependency graph
          Dependency graph

          A literal of a clause of the constructed instance: the tag of its variable, its sign, and where the variable sits.

          • vt : QVarTag

            The tag of the variable the literal is on.

          • sign : Bool

            The sign of the literal.

          Instances For
            Dependency graph
            Dependency graph
            Equations
            • One or more equations did not get rendered due to their size.
            Instances For
              Dependency graph

              The literals of each clause #

              The literal of a level clause carrying the input of the level: the midpoint Z_ℓ on the two matching branches, and one of the two endpoints of the level – S/U at the top, T/V at the bottom – on the two others.

              Equations
              • One or more equations did not get rendered due to their size.
              Instances For
                Dependency graph

                The literals of each clause of the constructed instance. A clause of the input contributes its own literals through DescriptiveComplexity.QLink.occPos and DescriptiveComplexity.QLink.occNeg; every other clause is a fixed list of two or three literals.

                Equations
                • One or more equations did not get rendered due to their size.
                Instances For
                  Dependency graph

                  The semantics of the tags #

                  Dependency graph

                  The element x is the first state variable: the top level.

                  Equations
                  Instances For
                    Dependency graph

                    The element x is the last state variable: the bottom level.

                    Equations
                    Instances For
                      Dependency graph

                      The state variable x is the one just above the state variable y.

                      Equations
                      Instances For
                        Dependency graph
                        Dependency graph

                        Which tagged pairs are clauses: the guard of each clause tag.

                        Equations
                        Instances For
                          Dependency graph
                          Dependency graph

                          The quantifier prefix #

                          Dependency graph
                          Dependency graph
                          Dependency graph
                          Dependency graph
                          theorem DescriptiveComplexity.qKey_inj {v v' : QVarTag} (hg : keyGrp v = keyGrp v') (hs : keySlot v = keySlot v') (ho : keyOrd v = keyOrd v') :
                          v = v'

                          The key of a variable tag is injective: the triples (keyGrp, keySlot, keyOrd) are pairwise distinct, which is what makes the prefix a linear order.

                          Dependency graph
                          def DescriptiveComplexity.keyLev {A : Type} (v : QVarTag) (p q : A) :
                          A

                          The coordinate of a variable that carries its level.

                          Equations
                          Instances For
                            Dependency graph
                            def DescriptiveComplexity.keySec {A : Type} (v : QVarTag) (p q : A) :
                            A

                            The coordinate of a variable that does not carry its level.

                            Equations
                            Instances For
                              Dependency graph
                              def DescriptiveComplexity.keyTriple {A : Type} (v : QVarTag) (p q : A) :

                              The block coordinates of a variable: the components of its key that a whole quantifier block shares.

                              Equations
                              Instances For
                                Dependency graph

                                The lexicographic comparison of block coordinates.

                                Equations
                                Instances For
                                  Dependency graph
                                  def DescriptiveComplexity.KeyLt {A : Type} [LinearOrder A] (v : QVarTag) (p q : A) (v' : QVarTag) (p' q' : A) :

                                  The quantifier prefix: the lexicographic comparison of the keys, first on the block coordinates and then on the two remaining components.

                                  Equations
                                  • One or more equations did not get rendered due to their size.
                                  Instances For
                                    Dependency graph

                                    The prefix is a strict linear order #

                                    Dependency graph
                                    theorem DescriptiveComplexity.tripleLt_trans {A : Type} [LinearOrder A] {t t' t'' : × A × } (h : TripleLt t t') (h' : TripleLt t' t'') :
                                    TripleLt t t''
                                    Dependency graph
                                    theorem DescriptiveComplexity.tripleLt_total {A : Type} [LinearOrder A] {t t' : × A × } (hne : t t') :
                                    Dependency graph
                                    theorem DescriptiveComplexity.keyLt_irrefl {A : Type} [LinearOrder A] (v : QVarTag) (p q : A) :
                                    ¬KeyLt v p q v p q
                                    Dependency graph
                                    theorem DescriptiveComplexity.keyLt_trans {A : Type} [LinearOrder A] {v v' v'' : QVarTag} {p q p' q' p'' q'' : A} (h : KeyLt v p q v' p' q') (h' : KeyLt v' p' q' v'' p'' q'') :
                                    KeyLt v p q v'' p'' q''
                                    Dependency graph
                                    theorem DescriptiveComplexity.eq_of_key_eq {A : Type} {v v' : QVarTag} {p q p' q' : A} (htr : keyTriple v p q = keyTriple v' p' q') (hs : keySec v p q = keySec v' p' q') (ho : keyOrd v = keyOrd v') :
                                    v = v' p = p' q = q'

                                    A variable is determined by its key together with its coordinates: this is what makes distinct variables comparable.

                                    Dependency graph
                                    theorem DescriptiveComplexity.keyLt_total {A : Type} [LinearOrder A] {v v' : QVarTag} {p q p' q' : A} (hne : ¬(v = v' p = p' q = q')) :
                                    KeyLt v p q v' p' q' KeyLt v' p' q' v p q

                                    The prefix is total on the variables: two distinct variables are comparable.

                                    Dependency graph
                                    theorem DescriptiveComplexity.keyLt_of_tripleLt {A : Type} [LinearOrder A] {v v' : QVarTag} {p q p' q' : A} (h : TripleLt (keyTriple v p q) (keyTriple v' p' q')) :
                                    KeyLt v p q v' p' q'

                                    A variable of a block precedes every variable of a later block.

                                    Dependency graph
                                    theorem DescriptiveComplexity.tripleLt_or_eq_of_keyLt {A : Type} [LinearOrder A] {v v' : QVarTag} {p q p' q' : A} (h : KeyLt v p q v' p' q') :
                                    TripleLt (keyTriple v p q) (keyTriple v' p' q') keyTriple v p q = keyTriple v' p' q'

                                    Comparable variables have comparable block coordinates.

                                    Dependency graph