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))

Uses (17)

Used by (1)