def loop_certificate
bendtorch-core@0.1.0.0 · src/tensor/core_PROOF.bend:974
import bendtorch-core@0.1.0.0/src/tensor/core_PROOF.bend as CorePROOF
import 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/elementwise.bend as Elementwise
974def loop_certificate(fuel: Nat, +operation: Elementwise.Operation, +plan: Shape.BroadcastPlan, +cursor: Nat,
975 -original_left: Core.Dynamic, -original_right: Core.Dynamic, state: Elementwise.State<Shape.output_shape(plan)>,
976 -invariant: Elementwise.StateInvariant(operation, plan, original_left, original_right, cursor, state)) ->
977 Elementwise.LoopCertificate<fuel, operation, plan, cursor, original_left, original_right, state>:
978 match fuel:
979 case 0n:
980 Elementwise.State{left, right, output} = state
981 Elementwise.LoopCertificate{((left, right), Done{Core.Packed{Shape.output_shape(plan), output}}), {==},
982 %Equal.sym(Nat, Nat.add(cursor, 0n), cursor, add_zero_right(cursor)) :
983 Elementwise.PrefixInvariant(operation, plan, original_left, original_right, _, Core.Packed{Shape.output_shape(plan), output})
984 invariant_prefix(operation, plan, original_left, original_right, cursor, left, right, output, invariant)}
985 case 1n++remaining:
986 loop_after_certificate(remaining, operation, plan, cursor, original_left, original_right, state, invariant,
987 natural_certificate(operation, plan, cursor, state),
988 state => invariant => loop_certificate(remaining, operation, plan, 1n+cursor, original_left, original_right, state, invariant))