def sequence_element

stelliferous@0.0.2.0 · proofs/storage_refinement.bend:262

import stelliferous@0.0.2.0/proofs/storage_refinement.bend as StorageRefinement
import Base
import stelliferous@0.0.2.0/proofs/storage_tree_model.bend as Tree
import stelliferous@0.0.2.0/proofs/loop_projection.bend as Projection
import stelliferous@0.0.2.0/proofs/bounded_u32_arithmetic.bend as Arithmetic
import stelliferous@0.0.2.0/proofs/word_encoding.bend as WordEncoding

262# An observed logical prefix has the actual stored element at every valid index.
263# Capacity need not equal count; address overflow remains explicitly modular.
264def sequence_element(~Element: Data,+count: Nat,+offset: U32,+tree: Tree.Tree<Element>,+index: Nat,
265  inside: {Nat.is_lt(index,count) == True{} : Bool}) ->
266  {List.get(&2,Element,Tree.read_sequence(~Element,count,offset,tree),index) ==
267    Some{Tree.read(Element,tree,(offset + U32.from_nat(index) : U32))} : Maybe<&2,Element>}:
268  match count index:
269    case 0n 0n:
270      Empty.absurd({None{} == Some{Tree.read(Element,tree,(offset + 0 : U32))} : Maybe<&2,Element>},WordEncoding.false_true(inside))
271    case 0n 1n+previous:
272      Empty.absurd({None{} == Some{Tree.read(Element,tree,(offset + U32.from_nat(1n+previous) : U32))} : Maybe<&2,Element>},WordEncoding.false_true(inside))
273    case 1n+rest 0n:
274      %Equal.sym(U32,(offset + 0 : U32),offset,Arithmetic.add_zero(offset)) :
275        {Some{Tree.read(Element,tree,offset)} == Some{Tree.read(Element,tree,_)} : Maybe<&2,Element>}
276      {==}
277    case 1n+ +rest 1n+ +previous:
278      %Equal.sym(U32,(offset + U32.from_nat(1n+previous) : U32),((offset + 1 : U32) + U32.from_nat(previous) : U32),
279        Projection.indexed_successor(offset,previous)) :
280        {List.get(&2,Element,Tree.read_sequence(~Element,rest,(offset + 1 : U32),tree),previous) ==
281          Some{Tree.read(Element,tree,_)} : Maybe<&2,Element>}
282      sequence_element(~Element,rest,(offset + 1 : U32),tree,previous,inside)

Uses (16)

Used by (2)