Documentation

DescriptiveComplexity.Problems.Wide.IxAddr

The address a file's marks stand for #

A program that seeks to a computed address holds that address on its file, one bit per register, and holds the address under its head there too – the mirror. At the elementwise file that is nothing to say: a register is an element, a mark on the registers is an address. At a coarser file it is something to say, and this file says it.

DescriptiveComplexity.ixAddr is the address a mark on the index stands for – each register carries the bit of one element (elt) – and DescriptiveComplexity.ixMark is the mark a file keeps of an address, its bits at the registers. The two are inverse on the addresses a file can hold (DescriptiveComplexity.IxHolds), and what makes the correspondence useful is that it carries the order, under three conditions:

For a clocked program's file all three hold of the argument registers, because the argument tags are the last ones (DescriptiveComplexity.Draw.lt_arg) and therefore the least significant: the addresses over them are the logical ones.

def DescriptiveComplexity.ixAddr {A I : Type} (elt : IA) (m : IProp) :
AProp

The address a mark on a file's index stands for: the elements whose register is marked.

Equations
Instances For
    Dependency graph
    def DescriptiveComplexity.ixMark {A I : Type} (elt : IA) (s : AProp) :
    IProp

    The mark a file keeps of an address: its bits at the registers.

    Equations
    Instances For
      Dependency graph
      def DescriptiveComplexity.IxHolds {A I : Type} (elt : IA) (Use : IProp) (s : AProp) :

      An address a file can hold: every element of it is one of the file's.

      Equations
      Instances For
        Dependency graph
        theorem DescriptiveComplexity.ixAddr_elt {A I : Type} {elt : IA} (hinj : Function.Injective elt) (m : IProp) (u : I) :
        ixAddr elt m (elt u) m u
        Dependency graph
        theorem DescriptiveComplexity.ixAddr_ixMark {A I : Type} {elt : IA} {Use : IProp} {s : AProp} (hs : IxHolds elt Use s) :
        ixAddr elt (ixMark elt s) = s

        A file's mark of an address stands for that address, when the file has a register for each of its elements.

        Dependency graph
        theorem DescriptiveComplexity.ixMark_ixAddr {A I : Type} {elt : IA} (hinj : Function.Injective elt) (m : IProp) :
        ixMark elt (ixAddr elt m) = m

        A mark is the mark of the address it stands for.

        Dependency graph
        theorem DescriptiveComplexity.ixHolds_ixAddr {A I : Type} {elt : IA} {Use m : IProp} (hm : ∀ (u : I), m uUse u) :
        IxHolds elt Use (ixAddr elt m)

        The address of a mark is one the file can hold.

        Dependency graph
        theorem DescriptiveComplexity.ixAddr_empty {A I : Type} {elt : IA} :
        (ixAddr elt fun (x : I) => False) = fun (x : A) => False
        Dependency graph
        theorem DescriptiveComplexity.ixHolds_of_wmSetLe {A I : Type} {Le : AAProp} {elt : IA} {Use : IProp} (hup : ∀ (u : I) (x : A), Use uWMLt Le (elt u) x∃ (u' : I), Use u' elt u' = x) (hLe : IsLinOrd Le) {s t : AProp} (hs : IxHolds elt Use t) (h : WMSetLe Le s t) :
        IxHolds elt Use s

        The addresses a file can hold are downward closed: below one of them, every element is either one the file already has a register for, or one above such an element – and above is where the file's elements are.

        Dependency graph
        theorem DescriptiveComplexity.wmSetLt_ixAddr {A I : Type} {ile : IIProp} {Le : AAProp} {elt : IA} (hinj : Function.Injective elt) (hmono : ∀ (u u' : I), WMLt ile u u' WMLt Le (elt u) (elt u')) (m m' : IProp) :
        WMSetLt ile m m' WMSetLt Le (ixAddr elt m) (ixAddr elt m')

        Comparing marks is comparing the addresses they stand for, strictly.

        Dependency graph
        theorem DescriptiveComplexity.wmSetLe_ixAddr {A I : Type} {ile : IIProp} {Le : AAProp} {elt : IA} (hinj : Function.Injective elt) (hmono : ∀ (u u' : I), WMLt ile u u' WMLt Le (elt u) (elt u')) (m m' : IProp) :
        WMSetLe ile m m' WMSetLe Le (ixAddr elt m) (ixAddr elt m')

        Comparing marks is comparing the addresses they stand for.

        Dependency graph
        theorem DescriptiveComplexity.wmIncr_ixMark {A I : Type} {ile : IIProp} {Le : AAProp} {elt : IA} {Use : IProp} (hinj : Function.Injective elt) (hmono : ∀ (u u' : I), WMLt ile u u' WMLt Le (elt u) (elt u')) {s s' : AProp} (hs' : IxHolds elt Use s') (hi : WMIncr Le s s') :
        WMIncr ile (ixMark elt s) (ixMark elt s')

        An increment of the addresses is an increment of the marks: the carry is an element the file has a register for, and so is everything above it.

        Dependency graph
        theorem DescriptiveComplexity.wmIncr_ixAddr {A I : Type} {ile : IIProp} {Le : AAProp} {elt : IA} {Use : IProp} (hinj : Function.Injective elt) (hmono : ∀ (u u' : I), WMLt ile u u' WMLt Le (elt u) (elt u')) (hup : ∀ (u : I) (x : A), Use uWMLt Le (elt u) x∃ (u' : I), Use u' elt u' = x) {m m' : IProp} (hm' : ∀ (u : I), m' uUse u) (hi : WMIncr ile m m') :
        WMIncr Le (ixAddr elt m) (ixAddr elt m')

        An increment of the marks is an increment of the addresses, the same correspondence read the other way.

        Dependency graph
        theorem DescriptiveComplexity.ixAddr_id {A : Type} (m : AProp) :
        ixAddr id m = m

        At the elementwise file the address is the mark: a register is an element, so the correspondence is the identity and every statement here is the one the space-bounded program already had.

        Dependency graph
        theorem DescriptiveComplexity.ixMark_id {A : Type} (s : AProp) :
        ixMark id s = s
        Dependency graph