def fold_value
import bendtorch-core@0.1.0.0/src/tensor/reduction_PROOF.bend as ReductionPROOFimport Base
import bendtorch-core@0.1.0.0/src/shape/core.bend as Shape
import bendtorch-core@0.1.0.0/src/tensor/core.bend as Core
import bendtorch-core@0.1.0.0/src/tensor/reduction.bend as Reduction
import bendtorch-core@0.1.0.0/src/tensor/reduction_LAWS.bend as Laws
import bendtorch-core@0.1.0.0/src/storage/main.bend as Storage
import bendtorch-core@0.1.0.0/src/storage/model.bend as Model
357def fold_value(-shape: Shape.Shape, +depth: Nat, +length: Nat, -original: Array<F32>, -balanced: Model.Balanced(F32, depth, original),
358 -valid: {Storage.bounds(depth, length) == True{} : Bool},
359 -exact: {length == Shape.logical_numel(Shape.dimensions(shape)) : Nat}, +fuel: Nat, +accumulator: F32,
360 +values: List<&2, F32>,
361 logical: Laws.LogicalValues(fuel, shape, Core.TTensor{Storage.Owned{depth, length, original, balanced, valid}, exact}, 0n, values)) ->
362 Fact<{Pair.fst(F32, Array<F32>, Reduction.array_sum(fuel, 0n, accumulator, original)) == Reduction.sequential_sum(values, accumulator) : F32}>:
363 match fuel values:
364 case 0n Nil{}:
365 Fact{{==}}
366 case 1n+rest values:
367 Fact{{\{Fact: p => p} : Fact<({Pair.fst(F32, Array<F32>, Reduction.array_sum(1n+rest, 0n, accumulator, original)) == Reduction.sequential_sum(values, accumulator) : F32})> ->
368 {Pair.fst(F32, Array<F32>, Reduction.array_sum(1n+rest, 0n, accumulator, original)) == Reduction.sequential_sum(values, accumulator) : F32}}(
369 run_value(shape, depth, length, original, balanced, valid, exact, rest, 0n, accumulator, original,
370 Array.get(F32, original, U32.from_nat(0n)), {==}, {==}, values, logical))}
371 case 0n value <> others:
372 Empty.absurd(Fact<{Pair.fst(F32, Array<F32>, Reduction.array_sum(0n, 0n, accumulator, original)) ==
373 Reduction.sequential_sum(value <> others, accumulator) : F32}>, logical)