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
263
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)