Documentation

DescriptiveComplexity.Exponential.KernelPad

Padding a kernel's block #

A machine written against a DescriptiveComplexity.NexKernel pays for its run out of the drawing's own size, and the drawing's size is a count of tags – one per rule name, and a rule name of the guessing site carries an assignment of the guessed block. So a kernel with few relation variables draws a small machine and buys a short clock, while what the run costs is set by the machine's tape, which the block does not shrink.

The remedy is to pad: give the block extra relation variables that the kernel never mentions. It says the same thing – an existential block whose extra variables do not occur is satisfied exactly when the original is – and it multiplies the guessing site's rule names by 2 ^ (number of extra variables).

This file is that padding: the block (SOBlock.pad), the language morphism that reads a kernel over it (blockPadLHom), the two directions of the transport (realize_blockPad), and the kernel-level statement (NexKernel.pad_holds).

A block with n more relation variables, each of arity a, which no kernel of the original block mentions.

Equations
Instances For
    Dependency graph
    @[simp]
    theorem DescriptiveComplexity.SOBlock.pad_arity_inl (B : SOBlock) (n a : ) (i : B.ι) :
    (B.pad n a).arity (Sum.inl i) = B.arity i
    Dependency graph

    The variables of a padded block, counted: the original's and the new ones. This is what a clock's counting hypothesis is discharged by – the guessing site's rule names are indexed by assignments of the block.

    Dependency graph
    def DescriptiveComplexity.SOBlock.unpadAssign (B : SOBlock) {n a : } {M : Type} (ρ : (B.pad n a).Assignment M) :

    What a padded block's assignment says about the original's: forget the new variables.

    Equations
    Instances For
      Dependency graph
      def DescriptiveComplexity.SOBlock.padAssign (B : SOBlock) (n a : ) {M : Type} (ρ : B.Assignment M) :
      (B.pad n a).Assignment M

      And back: the new variables empty.

      Equations
      Instances For
        Dependency graph
        @[simp]
        Dependency graph

        The language morphism reading a kernel of the block over the padded one: every symbol goes to itself, and the new relation symbols are simply not in the image.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          Dependency graph
          theorem DescriptiveComplexity.blockPadLHom_isExpansionOn (L : FirstOrder.Language) (B : SOBlock) (n a : ) (M : Type) (instM : L.Structure M) (ρ : (B.pad n a).Assignment M) :

          The padded structure is an expansion along it: the new symbols are the only ones added, and no formula in the image mentions them.

          Dependency graph
          theorem DescriptiveComplexity.realize_blockPad {L : FirstOrder.Language} (B : SOBlock) (n a : ) (M : Type) [instM : L.Structure M] (ρ : (B.pad n a).Assignment M) (φ : (L.sum B.lang).Sentence) :
          M (blockPadLHom L B n a).onSentence φ M φ

          Padding the block changes no meaning: a kernel of the original block, read over the padded one, says of a padded assignment what it said of the assignment's own part.

          Dependency graph

          The padded kernel #

          A kernel with a padded block: the same expansion, the same sentence read over more relation variables.

          Equations
          Instances For
            Dependency graph
            @[simp]
            Dependency graph
            @[simp]
            theorem DescriptiveComplexity.NexKernel.pad_B {L : FirstOrder.Language} (K : NexKernel L) (n a : ) :
            (K.pad n a).B = K.B.pad n a
            Dependency graph
            theorem DescriptiveComplexity.NexKernel.pad_holds {L : FirstOrder.Language} (K : NexKernel L) (n a : ) {M : Type} [instM : K.X.E.Structure M] [instO : LinearOrder M] :
            (K.pad n a).Holds M K.Holds M

            A padded kernel says what the kernel said. The extra variables occur in no atom, so an assignment satisfying the padded kernel restricts to one satisfying the kernel, and one satisfying the kernel extends – by the empty relation – to one satisfying the padded kernel.

            Dependency graph