import JaxLean.Stdlib import examples.tensor_puzzles.proofs.TensorPuzzleProofs import examples.tensor_puzzles.generated.LoopSum import examples.tensor_puzzles.generated.LoopOuter import examples.tensor_puzzles.generated.LoopFlip import examples.tensor_puzzles.generated.LoopFlattennamespace JaxLean.PuzzleJaxopen scoped BigOperatorsa:Tensor ℝ [4]⊢ ∑ i, a (i, ()) = loop_sum a PUnit.unit a:Tensor ℝ [4]⊢ ∑ i, a (i, ()) = 0 + a (0, ()) + a (1, ()) + a (2, ()) + a (3, ()) a:Tensor ℝ [4]⊢ a (0, ()) + (a (1, ()) + (a (2, ()) + a (3, ()))) = a (0, ()) + a (1, ()) + a (2, ()) + a (3, ()) All goals completed! 🐙theorem outer_matches_loop (a : Tensor ℝ [2]) (b : Tensor ℝ [3]) : puzzle_outer a b = loop_outer a b := a:Tensor ℝ [2]b:Tensor ℝ [3]⊢ puzzle_outer a b = loop_outer a b a:Tensor ℝ [2]b:Tensor ℝ [3]i:Index [2, 3]⊢ puzzle_outer a b i = loop_outer a b i a:Tensor ℝ [2]b:Tensor ℝ [3]i:Fin 2j:Fin 3⊢ puzzle_outer a b (i, j, PUnit.unit) = loop_outer a b (i, j, PUnit.unit) a:Tensor ℝ [2]b:Tensor ℝ [3]j:Fin 3⊢ puzzle_outer a b ((fun i => i) ⟨0, ⋯⟩, j, PUnit.unit) = loop_outer a b ((fun i => i) ⟨0, ⋯⟩, j, PUnit.unit)a:Tensor ℝ [2]b:Tensor ℝ [3]j:Fin 3⊢ puzzle_outer a b ((fun i => i) ⟨1, ⋯⟩, j, PUnit.unit) = loop_outer a b ((fun i => i) ⟨1, ⋯⟩, j, PUnit.unit) a:Tensor ℝ [2]b:Tensor ℝ [3]j:Fin 3⊢ puzzle_outer a b ((fun i => i) ⟨0, ⋯⟩, j, PUnit.unit) = loop_outer a b ((fun i => i) ⟨0, ⋯⟩, j, PUnit.unit)a:Tensor ℝ [2]b:Tensor ℝ [3]j:Fin 3⊢ puzzle_outer a b ((fun i => i) ⟨1, ⋯⟩, j, PUnit.unit) = loop_outer a b ((fun i => i) ⟨1, ⋯⟩, j, PUnit.unit) a:Tensor ℝ [2]b:Tensor ℝ [3]⊢ puzzle_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨0, ⋯⟩, PUnit.unit) = loop_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨0, ⋯⟩, PUnit.unit)a:Tensor ℝ [2]b:Tensor ℝ [3]⊢ puzzle_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨1, ⋯⟩, PUnit.unit) = loop_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨1, ⋯⟩, PUnit.unit)a:Tensor ℝ [2]b:Tensor ℝ [3]⊢ puzzle_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨2, ⋯⟩, PUnit.unit) = loop_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨2, ⋯⟩, PUnit.unit) a:Tensor ℝ [2]b:Tensor ℝ [3]⊢ puzzle_outer a b ((fun i => i) ⟨0, ⋯⟩, (fun i => i) ⟨0, ⋯⟩, PUnit.unit) = loop_outer a b ((fun i => i) ⟨0, ⋯⟩, (fun i => i) ⟨0, ⋯⟩, PUnit.unit)a:Tensor ℝ [2]b:Tensor ℝ [3]⊢ puzzle_outer a b ((fun i => i) ⟨0, ⋯⟩, (fun i => i) ⟨1, ⋯⟩, PUnit.unit) = loop_outer a b ((fun i => i) ⟨0, ⋯⟩, (fun i => i) ⟨1, ⋯⟩, PUnit.unit)a:Tensor ℝ [2]b:Tensor ℝ [3]⊢ puzzle_outer a b ((fun i => i) ⟨0, ⋯⟩, (fun i => i) ⟨2, ⋯⟩, PUnit.unit) = loop_outer a b ((fun i => i) ⟨0, ⋯⟩, (fun i => i) ⟨2, ⋯⟩, PUnit.unit)a:Tensor ℝ [2]b:Tensor ℝ [3]⊢ puzzle_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨0, ⋯⟩, PUnit.unit) = loop_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨0, ⋯⟩, PUnit.unit)a:Tensor ℝ [2]b:Tensor ℝ [3]⊢ puzzle_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨1, ⋯⟩, PUnit.unit) = loop_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨1, ⋯⟩, PUnit.unit)a:Tensor ℝ [2]b:Tensor ℝ [3]⊢ puzzle_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨2, ⋯⟩, PUnit.unit) = loop_outer a b ((fun i => i) ⟨1, ⋯⟩, (fun i => i) ⟨2, ⋯⟩, PUnit.unit) All goals completed! 🐙theorem flip_matches_loop (a : Tensor ℝ [4]) : flip a = loop_flip a := a:Tensor ℝ [4]⊢ flip a = loop_flip a a:Tensor ℝ [4]i:Index [4]⊢ flip a i = loop_flip a i a:Tensor ℝ [4]i:Fin 4⊢ flip a (i, PUnit.unit) = loop_flip a (i, PUnit.unit) a:Tensor ℝ [4]⊢ flip a ((fun i => i) ⟨0, ⋯⟩, PUnit.unit) = loop_flip a ((fun i => i) ⟨0, ⋯⟩, PUnit.unit)a:Tensor ℝ [4]⊢ flip a ((fun i => i) ⟨1, ⋯⟩, PUnit.unit) = loop_flip a ((fun i => i) ⟨1, ⋯⟩, PUnit.unit)a:Tensor ℝ [4]⊢ flip a ((fun i => i) ⟨2, ⋯⟩, PUnit.unit) = loop_flip a ((fun i => i) ⟨2, ⋯⟩, PUnit.unit)a:Tensor ℝ [4]⊢ flip a ((fun i => i) ⟨3, ⋯⟩, PUnit.unit) = loop_flip a ((fun i => i) ⟨3, ⋯⟩, PUnit.unit) a:Tensor ℝ [4]⊢ flip a ((fun i => i) ⟨0, ⋯⟩, PUnit.unit) = loop_flip a ((fun i => i) ⟨0, ⋯⟩, PUnit.unit)a:Tensor ℝ [4]⊢ flip a ((fun i => i) ⟨1, ⋯⟩, PUnit.unit) = loop_flip a ((fun i => i) ⟨1, ⋯⟩, PUnit.unit)a:Tensor ℝ [4]⊢ flip a ((fun i => i) ⟨2, ⋯⟩, PUnit.unit) = loop_flip a ((fun i => i) ⟨2, ⋯⟩, PUnit.unit)a:Tensor ℝ [4]⊢ flip a ((fun i => i) ⟨3, ⋯⟩, PUnit.unit) = loop_flip a ((fun i => i) ⟨3, ⋯⟩, PUnit.unit) All goals completed! 🐙a:Tensor ℝ [2, 3]⊢ (fun i => a (i.1.divNat, i.1.modNat, ())) = loop_flatten a a:Tensor ℝ [2, 3]i:Index [2 * 3]⊢ a (i.1.divNat, i.1.modNat, ()) = loop_flatten a i a:Tensor ℝ [2, 3]i:Fin (2 * 3)⊢ a ((i, PUnit.unit).1.divNat, (i, PUnit.unit).1.modNat, ()) = loop_flatten a (i, PUnit.unit) a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨0, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨0, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨0, ⋯⟩, PUnit.unit)a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨1, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨1, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨1, ⋯⟩, PUnit.unit)a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨2, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨2, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨2, ⋯⟩, PUnit.unit)a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨3, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨3, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨3, ⋯⟩, PUnit.unit)a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨4, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨4, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨4, ⋯⟩, PUnit.unit)a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨5, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨5, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨5, ⋯⟩, PUnit.unit) a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨0, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨0, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨0, ⋯⟩, PUnit.unit)a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨1, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨1, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨1, ⋯⟩, PUnit.unit)a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨2, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨2, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨2, ⋯⟩, PUnit.unit)a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨3, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨3, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨3, ⋯⟩, PUnit.unit)a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨4, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨4, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨4, ⋯⟩, PUnit.unit)a:Tensor ℝ [2, 3]⊢ a (((fun i => i) ⟨5, ⋯⟩, PUnit.unit).1.divNat, ((fun i => i) ⟨5, ⋯⟩, PUnit.unit).1.modNat, ()) = loop_flatten a ((fun i => i) ⟨5, ⋯⟩, PUnit.unit) All goals completed! 🐙All goals completed! 🐙All goals completed! 🐙All goals completed! 🐙All goals completed! 🐙end JaxLean.PuzzleJax