def indexed_fold_split

stelliferous@0.0.2.0 · proofs/traversal_array_refinement.bend:295

import stelliferous@0.0.2.0/proofs/traversal_array_refinement.bend as TraversalArrayRefinement
import Base
import stelliferous@0.0.2.0/traversal_array.bend as Traversal
import stelliferous@0.0.2.0/proofs/natural_addition.bend as Addition
import stelliferous@0.0.2.0/proofs/nat_to_u32_bounds.bend as Bounds

295# Splitting a traversal preserves every state update in the same order. The
296# boundary uses modular U32 conversion; no scalar/FP32-specific induction.
297def indexed_fold_split(~Value: Type,~Context: Data,~update: U32 -> Context -> Value -> Value,
298  +first: Nat,+second: Nat,+start: Nat,+context: Context,-initial: Value) ->
299  {Traversal.indexed_fold(~Value,~Context,~update,Nat.add(first,second),U32.from_nat(start),context,initial) ==
300    Traversal.indexed_fold(~Value,~Context,~update,second,U32.from_nat(Nat.add(start,first)),context,
301      Traversal.indexed_fold(~Value,~Context,~update,first,U32.from_nat(start),context,initial)) : Value}:
302  match first:
303    case 0n:
304      %Equal.sym(Nat,Nat.add(start,0n),start,Addition.zero_right(start)) :
305        {Traversal.indexed_fold(~Value,~Context,~update,second,U32.from_nat(start),context,initial) ==
306          Traversal.indexed_fold(~Value,~Context,~update,second,U32.from_nat(_),context,initial) : Value}
307      {==}
308    case 1n+ +rest:
309      %Equal.sym(U32,(U32.from_nat(start) + 1 : U32),U32.from_nat(1n+start),Bounds.add_one(U32.from_nat(start))) :
310        {Traversal.indexed_fold(~Value,~Context,~update,Nat.add(rest,second),_,context,update(U32.from_nat(start),context,initial)) ==
311          Traversal.indexed_fold(~Value,~Context,~update,second,U32.from_nat(Nat.add(start,1n+rest)),context,
312            Traversal.indexed_fold(~Value,~Context,~update,rest,_,context,update(U32.from_nat(start),context,initial))) : Value}
313      %Equal.sym(Nat,Nat.add(start,1n+rest),1n+Nat.add(start,rest),Addition.successor_right(start,rest)) :
314        {Traversal.indexed_fold(~Value,~Context,~update,Nat.add(rest,second),U32.from_nat(1n+start),context,update(U32.from_nat(start),context,initial)) ==
315          Traversal.indexed_fold(~Value,~Context,~update,second,U32.from_nat(_),context,
316            Traversal.indexed_fold(~Value,~Context,~update,rest,U32.from_nat(1n+start),context,update(U32.from_nat(start),context,initial))) : Value}
317      indexed_fold_split(~Value,~Context,~update,rest,second,1n+start,context,update(U32.from_nat(start),context,initial))

Uses (10)

Used by (0)

No other definition uses this definition.