def indexed_fold_split
import stelliferous@0.0.2.0/proofs/traversal_array_refinement.bend as TraversalArrayRefinementimport 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.