theorem
Hex.GraphIso.Nauty.Sparse.restore_scan
(before hit starts : Array Nat)
(first n : Nat)
(hb : first + hit.size ≤ before.size)
(hs : starts.size = n)
(hv : ∀ (v : Nat), v ∈ hit.toList → v < n)
:
have r :=
(have lab := before;
have starts := starts;
have v3 := first;
do
let __s ←
forIn [:hit.size] (lab, starts, v3) fun (t : Nat) (__s : Array Nat × Array Nat × Nat) =>
have lab := __s.fst;
have __s := __s.snd;
have starts := __s.fst;
have v3 := __s.snd;
have j := hit[hit.size - 1 - t]!;
have starts := starts.set! j first;
have lab := lab.set! v3 j;
have v3 := v3 + 1;
pure (ForInStep.yield (lab, starts, v3))
have lab : Array Nat := __s.fst
have __s : Array Nat × Nat := __s.snd
have starts : Array Nat := __s.fst
have v3 : Nat := __s.snd
pure (lab, starts, v3)).run;
Fill before hit.toList.reverse first hit.toList.reverse.length r.fst ∧ Index.Writes n starts r.snd.fst hit.toList.reverse first ∧ r.snd.snd = first + hit.size
The actual reverse hit loop copies every hit and writes its new cell start. Its bounds permit empty hit lists and repeated input vertices.