def read_sequence_evidence

stelliferous@0.0.2.0 · proofs/storage_refinement.bend:391

import stelliferous@0.0.2.0/proofs/storage_refinement.bend as StorageRefinement
import Base
import stelliferous@0.0.2.0/storage_buffer.bend as Storage
import stelliferous@0.0.2.0/proofs/storage_tree_model.bend as Tree
import stelliferous@0.0.2.0/proofs/u32_division.bend as U32Division

391def read_sequence_evidence(~Element: Data,+fallback: Element,+length: Nat,+values: List<&2,Element>,
392  +evidence: SequenceEvidence<Element,length,values>,+index: U32,+native_length: U32,
393  +length_exact: {U32.to_nat(native_length) == length : Nat}) ->
394  {Storage.read_or(Element,fallback,sequence_owner(Element,length,values,evidence),index,native_length) ==
395    (sequence_owner(Element,length,values,evidence),Maybe.default(&2,Element,List.get(&2,Element,values,U32.to_nat(index)),fallback)) : Array<Element> & Element}:
396  SequenceEvidence{+storage,+contents,room} = evidence
397  %contents :
398    {Storage.read_or(Element,fallback,Tree.pack(Element,storage),index,native_length) ==
399      (Tree.pack(Element,storage),Maybe.default(&2,Element,List.get(&2,Element,_,U32.to_nat(index)),fallback)) : Array<Element> & Element}
400  %length_exact :
401    {Storage.read_or(Element,fallback,Tree.pack(Element,storage),index,native_length) ==
402      (Tree.pack(Element,storage),Maybe.default(&2,Element,List.get(&2,Element,Tree.read_sequence(~Element,_,0,storage),U32.to_nat(index)),fallback)) : Array<Element> & Element}
403  bounded_read_observation(~Element,fallback,native_length,storage,index,
404    U32Division.nat_le_native(native_length,Tree.capacity(Element,storage),
405      %Equal.sym(Nat,U32.to_nat(native_length),length,length_exact) :
406        {Nat.is_le(_,U32.to_nat(Tree.capacity(Element,storage))) == True{} : Bool}
407      room))

Uses (20)

Used by (2)