~/bend-docscommunity

proofs/containers/lru/rebuild.bend checks

raw source on the hub · import bend-collections-laws-containers@1.0.0.0/proofs/containers/lru/rebuild.bend as Rebuild

18 imports
import Base
import ../../lib/logic.bend as L
import ../../lib/array.bend as AR
import ../../../spec/lib/common.bend as SC
import ../../../spec/containers/hash_table.bend as S
import ../../../spec/containers/lru.bend as SP
import ../../lib/u32div.bend as UD
import ../hash_table/table.bend as TB
import ../hash_table/buckets.bend as B
import ../../../src/containers/hash_table.bend as H
import ./state.bend as ST
import ./lists.bend as LS
import ./trace.bend as TR
import ./unlink.bend as UL
import ../hash_table/insf.bend as IF
import ../../lib/nat_list.bend as NL
import ../../lib/links.bend as LK
import ../../lib/words32.bend as W32

Definitions

def subl_refl source · line 26 · raw

@+xs:List<&2, Nat> -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(xs, xs) == True{} : Bool}

def subl_ml source · line 33 · raw

@+xs:List<&2, Nat> -> @+a:List<&2, Nat> -> @+b:List<&2, Nat> -> @+h:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(xs, a) == True{} : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(xs, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.append(Nat, a, b)) == True{} : Bool}

def subl_mr source · line 40 · raw

@+xs:List<&2, Nat> -> @+a:List<&2, Nat> -> @+b:List<&2, Nat> -> @+h:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(xs, b) == True{} : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(xs, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.append(Nat, a, b)) == True{} : Bool}

def subl_app source · line 47 · raw

@+a:List<&2, Nat> -> @+b:List<&2, Nat> -> @+ys:List<&2, Nat> -> @+ha:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(a, ys) == True{} : Bool} -> @+hb:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(b, ys) == True{} : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.append(Nat, a, b), ys) == True{} : Bool}

def bslb_sub source · line 63 · raw

@+sl:List<&2, Nat> -> @+sl2:List<&2, Nat> -> @+ll:List<&2, U32> -> @+b:0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/buckets.Bk -> @+h:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.bslb(sl, ll, b) == True{} : Bool} -> @+sub:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(sl, sl2) == True{} : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.bslb(sl2, ll, b) == True{} : Bool}

def bsl_sub source · line 70 · raw

@+bs:List<&2, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/buckets.Bk> -> @+sl:List<&2, Nat> -> @+sl2:List<&2, Nat> -> @+ll:List<&2, U32> -> @+m:Nat -> @+h:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.bsl(bs, sl, ll, m) == True{} : Bool} -> @+sub:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(sl, sl2) == True{} : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.bsl(bs, sl2, ll, m) == True{} : Bool}

def tr_eq_bool source · line 77 · raw

@+a:Bool -> @+b:Bool -> @+e:{a == b : Bool} -> @+h:{b == True{} : Bool} -> {a == True{} : Bool}

Templates

template sall_sub source · line 56 · raw

@-V:Data -> @+p:0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.SP1<V> -> @+xs:List<&2, Nat> -> @+ys:List<&2, Nat> -> @+h:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.sall(V, p, xs) == True{} : Bool} -> @+sub:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(ys, xs) == True{} : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.sall(V, p, ys) == True{} : Bool}

template good_lk source · line 83 · raw

@-V:Data -> @+cap:U32 -> @+n:U32 -> @+head:U32 -> @+tail:U32 -> @+free:U32 -> @+mT:0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.Tree<U32> -> @+k:Nat -> @+sd:Nat -> @+tabT:0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.Tree<U32> -> @+ksT:0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.Tree<String> -> @+eT:0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.Tree<Maybe<&2, V>> -> @+lkT:0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.Tree<U32> -> @+sl:List<&2, Nat> -> @+fl:List<&2, Nat> -> @+hg:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.good(V, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.LS{cap, n, head, tail, free, mT, k, sd, tabT, ksT, eT, lkT, sl, fl}) == True{} : Bool} -> @+head2:U32 -> @+tail2:U32 -> @+lkT2:0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.Tree<U32> -> @+sl2:List<&2, Nat> -> @+tr:0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/trace.Tr -> @+hp2:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.perfect(U32, 3n+sd, lkT2) == True{} : Bool} -> @+hs2:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.slots(U32, lkT2) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/trace.app(0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.slots(U32, lkT), tr) : List<&2, U32>} -> @+hlo:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/trace.trlo(tr) == True{} : Bool} -> @+hin:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/trace.trin(tr, sl2) == True{} : Bool} -> @+hseg:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.seg(0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.slots(U32, lkT2), sl2, 0, 0) == True{} : Bool} -> @+hh:{U32.is_eq(head2, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/links.fst_or(sl2, 0)) == True{} : Bool} -> @+ht:{U32.is_eq(tail2, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/links.last_or(sl2, 0)) == True{} : Bool} -> @+hsub:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(sl, sl2) == True{} : Bool} -> @+hsub2:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/hash_table/insf.subl(sl2, sl) == True{} : Bool} -> @+hnd:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/nat_list.nodupn(sl2) == True{} : Bool} -> @+hlen:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.length(Nat, sl2) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/lib/common.length(Nat, sl) : Nat} -> @+hkeys:{0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/containers/hash_table.nodup(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/containers/lru.keys_of(V, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.es(V, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.slots(U32, lkT), 0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.slots(String, ksT), 0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/lib/array.slots(Maybe<&2, V>, eT), sl2))) == True{} : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.good(V, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/proofs/containers/lru/state.LS{cap, n, head2, tail2, free, mT, k, sd, tabT, ksT, eT, lkT2, sl2, fl}) == True{} : Bool}

THEOREM: re-linking the recency list (a permutation sl2 of sl, link-word writes to its slots) keeps the invariant.