This PR reviews the implicitness of arguments across List/Array/Vector, generally trying to make arguments implicit where possible, although sometimes correcting propositional arguments which were incorrectly implicit to explicit.
20 lines
721 B
Text
20 lines
721 B
Text
def Array.swaps (a : Array α) : List (Fin a.size × Fin a.size) → Array α
|
||
| [] => a
|
||
| (i, j) :: ijs =>
|
||
have : (a.swap i j).size = a.size := a.size_swap
|
||
swaps (a.swap i j) (ijs.map (fun p => ⟨⟨p.1.1, by simp⟩, ⟨p.2.1, by simp⟩⟩))
|
||
termination_by l => l.length
|
||
|
||
set_option maxHeartbeats 1000 in
|
||
theorem Array.swaps_cancel (a : Array α) (l : List (Fin a.size × Fin a.size)) : a.swaps (l ++ l.reverse) = a :=
|
||
match l with
|
||
| [] => sorry
|
||
| c :: cs =>
|
||
|
||
have h : a.size = (a.swaps [c]).size := sorry
|
||
|
||
have ih1 : ((a.swaps [c]).swaps ((h ▸ cs) ++ (h ▸ cs).reverse)) = (a.swaps [c]) :=
|
||
swaps_cancel (a.swaps [c]) (h ▸ cs)
|
||
sorry
|
||
termination_by l.length
|
||
decreasing_by sorry
|