Documentation

Bdd.Reduce.Process

structure Reduce.StepInv {n m : } (O : OBdd n m) (ps : ProvedState n m) (i s₀ : ) (curkey : RawBdd.RawPointer × RawBdd.RawPointer) (curptr : RawBdd.RawPointer) (Q : List ((RawBdd.RawPointer × RawBdd.RawPointer) × Fin m)) :
Instances For

    The sentinel key (.inl false, .inl false) is the least key: .inl false is the least RawPointer, so it is every key. Used as the initial curkey in step.

    theorem Reduce.sentinel_no_match {m : } (Q : List ((RawBdd.RawPointer × RawBdd.RawPointer) × Fin m)) (hnonred : entryQ, entry.1.1 entry.1.2) (entry : (RawBdd.RawPointer × RawBdd.RawPointer) × Fin m) :
    entry Qentry.1 (Sum.inl false, Sum.inl false)

    In a non-redundant queue, no entry's key matches the sentinel ⟨.inl false, .inl false⟩.

    def Reduce.process_queue {n m i : } (O : OBdd n m) (curkey : RawBdd.RawPointer × RawBdd.RawPointer) (curptr : RawBdd.RawPointer) (s₀ : ) (Q : List ((RawBdd.RawPointer × RawBdd.RawPointer) × Fin m)) (ps : ProvedState n m) :
    Invariant O ps i(∀ entryQ, RawBdd.RawPointer.Bounded ps.state.size entry.1.1 RawBdd.RawPointer.Bounded ps.state.size entry.1.2)(hcurptr_sem : entryQ, entry.1 = curkey∃ (hj : { heap := (↑O).heap, root := Pointer.node entry.2 }.Ordered) (hp : RawBdd.RawPointer.Bounded ps.state.size curptr) (ho : { heap := RawBdd.cook_heap ps.state.heap , root := curptr.cook }.Ordered), OBdd.Reduced { heap := RawBdd.cook_heap ps.state.heap , root := curptr.cook }, ∀ (I : Vector Bool n), OBdd.evaluate { heap := RawBdd.cook_heap ps.state.heap , root := curptr.cook }, I = OBdd.evaluate { heap := (↑O).heap, root := Pointer.node entry.2 }, I) → (hec : entryQ, EntryCorrect O ps i entry) → (si : StepInv O ps i s₀ curkey curptr Q) → { ps' : ProvedState n m // Invariant O ps' i (∀ (k : Fin m), ps.state.ids[k].isSome = trueps'.state.ids[k].isSome = true) (∀ entryQ, ps'.state.ids[entry.2].isSome = true) VarInvariant O ps' HeapInjective ps' ∀ (k : Fin ps'.state.size), i ps'.state.heap[k].va }
    Equations
    Instances For