def visited_base
bendtorch-core@0.1.0.0 · src/autograd/reduce_fiber_proof.bend:606
import bendtorch-core@0.1.0.0/src/autograd/reduce_fiber_proof.bend as ReduceFiberProof
import Base
import bendtorch-core@0.1.0.0/src/shape/core.bend as Shape
import bendtorch-core@0.1.0.0/src/shape/broadcast_proofs.bend as Broadcast
import bendtorch-core@0.1.0.0/src/autograd/reduce.bend as Reduce
606def visited_base(+rows: List<&2, Shape.Row>, +extents: List<&2, Nat>, +fuel: Nat, +target: Nat, +base: Nat, +digit: Nat) ->
607 {visited(rows, extents, fuel, target, base, digit) == shift(base, visited(rows, extents, fuel, target, 0n, digit)) : List<&2, Nat>}:
608 match rows extents fuel:
609 case Nil{} _ _:
610 %Equal.sym(Nat, Nat.add(base, 0n), base, Broadcast.add_zero(base)) : {[base] == [_] : List<&2, Nat>}
611 {==}
612 case Shape.Row{+stride, +left, +right} <> +rest +extent <> +others 0n:
613 {==}
614 case Shape.Row{+stride, +left, +right} <> +rest +extent <> +others 1n+remaining:
615 +inner = Nat.mod(target, left)
616 +offset = Nat.mul(right, digit)
617 +span = Reduce.first_span(rest, others)
618 +first = Reduce.first_digit(rest, inner)
619 +low = visited(rest, others, span, inner, 0n, first)
620 +high = visited(rows, extents, remaining, target, 0n, 1n+digit)
621 %Equal.sym(List<&2, Nat>, visited(rest, others, span, inner, Nat.add(base, offset), first), shift(Nat.add(base, offset), low),
622 visited_base(rest, others, span, inner, Nat.add(base, offset), first)) :
623 {List.append(&2, Nat, _, visited(rows, extents, remaining, target, base, 1n+digit)) ==
624 shift(base, List.append(&2, Nat, visited(rest, others, span, inner, offset, first), high)) : List<&2, Nat>}
625 %Equal.sym(List<&2, Nat>, visited(rows, extents, remaining, target, base, 1n+digit), shift(base, high),
626 visited_base(rows, extents, remaining, target, base, 1n+digit)) :
627 {List.append(&2, Nat, shift(Nat.add(base, offset), low), _) ==
628 shift(base, List.append(&2, Nat, visited(rest, others, span, inner, offset, first), high)) : List<&2, Nat>}
629 %Equal.sym(List<&2, Nat>, visited(rest, others, span, inner, offset, first), shift(offset, low),
630 visited_base(rest, others, span, inner, offset, first)) :
631 {List.append(&2, Nat, shift(Nat.add(base, offset), low), shift(base, high)) ==
632 shift(base, List.append(&2, Nat, _, high)) : List<&2, Nat>}
633 %Equal.sym(List<&2, Nat>, shift(base, List.append(&2, Nat, shift(offset, low), high)),
634 List.append(&2, Nat, shift(base, shift(offset, low)), shift(base, high)), shift_append(base, shift(offset, low), high)) :
635 {List.append(&2, Nat, shift(Nat.add(base, offset), low), shift(base, high)) == _ : List<&2, Nat>}
636 %Equal.sym(List<&2, Nat>, shift(base, shift(offset, low)), shift(Nat.add(base, offset), low), shift_shift(base, offset, low)) :
637 {List.append(&2, Nat, shift(Nat.add(base, offset), low), shift(base, high)) == List.append(&2, Nat, _, shift(base, high)) : List<&2, Nat>}
638 {==}
639 case Shape.Row{+stride, +left, +right} <> +rest Nil{} _:
640 {==}