Zulip Chat Archive

Stream: new members

Topic: Is there a way to automate this proof?


Ilmārs Cīrulis (Sep 02 2025 at 18:13):

Or maybe I just need more patience to do it step by step?

import Mathlib

namespace InnerProductGeometry
open scoped RealInnerProductSpace

variable {V : Type*} [NormedAddCommGroup V] [InnerProductSpace  V]

lemma aux (x z : V) (kx kz : ) (H : kx  x + kz  z  0) (H0: kx  0) :
    x - (kx  x + kz  z‖⁻¹ * x, kx  x + kz  z)  kx  x + kz  z‖⁻¹  (kx  x + kz  z) =
    -(kz / kx)  (z - (kx  x + kz  z‖⁻¹ * z, kx  x + kz  z)  kx  x + kz  z‖⁻¹  (kx  x + kz  z)) := by
  sorry

Ilmārs Cīrulis (Sep 02 2025 at 19:05):

Discovered Rediscovered module tactic that simplifies the proof a bit.

Ilmārs Cīrulis (Sep 02 2025 at 19:08):

Here it is, messy but working

import Mathlib

namespace InnerProductGeometry
open scoped RealInnerProductSpace

variable {V : Type*} [NormedAddCommGroup V] [InnerProductSpace  V]

lemma aux00 (x y : V) (k : ) (Hk : k  0) :
    x = y  k  x = k  y := by
  constructor <;> intro H7
  · rw [H7]
  · have H8 : k⁻¹  (k  x) = k⁻¹  (k  y) := by
      rw [H7]
    rw [ smul_assoc,  smul_assoc, smul_eq_mul] at H8
    field_simp at H8
    simp at H8
    exact H8

lemma aux01 (x z : V) (kx kz : ) (H : kx  x + kz  z  0) (H0: kx  0) :
    x - (kx  x + kz  z‖⁻¹ * x, kx  x + kz  z)  kx  x + kz  z‖⁻¹  (kx  x + kz  z) =
    -(kz / kx)  (z - (kx  x + kz  z‖⁻¹ * z, kx  x + kz  z)  kx  x + kz  z‖⁻¹  (kx  x + kz  z)) := by
  set w := kx  x + kz  z
  have Hw : w  0 := norm_ne_zero_iff.mpr H
  rw [aux00 _ _ _ H0, aux00 _ _ _ Hw, aux00 _ _ _ Hw,  sub_eq_zero]
  repeat rw [<- smul_assoc]
  repeat rw [smul_eq_mul]
  repeat rw [smul_sub]
  repeat rw [<- smul_assoc]
  repeat rw [smul_eq_mul]
  field_simp
  abel_nf
  simp
  rw [ sub_eq_add_neg,  add_assoc,  sub_eq_add_neg]
  rw [ smul_eq_mul (w ^ 2) kx,  smul_eq_mul (w ^ 2) kz]
  rw [smul_assoc, smul_assoc]
  have H1 (u1 u2 u3 u4 : V) : u1 - u2 + (u3 - u4) = u1 + u3 - (u2 + u4) := by module
  rw [H1]
  have H2 : w ^ 2  kx  x + w ^ 2  kz  z = w ^ 2  w := by
    unfold w
    module
  have H3 : (kx * x, w)  w + (kz * z, w)  w =
            (kx * x, w + kz * z, w)  w := by module
  rw [H2, H3]
  rw [ real_inner_smul_left,  real_inner_smul_left,  inner_add_left]
  rw [ real_inner_self_eq_norm_sq w]
  module

Jovan Gerbscheid (Sep 02 2025 at 20:31):

You can use mathlib's powerful tactics to your advantage:

import Mathlib

namespace InnerProductGeometry
open scoped RealInnerProductSpace

variable {V : Type*} [NormedAddCommGroup V] [InnerProductSpace  V]

lemma aux01 (x z : V) (kx kz : ) (H : kx  x + kz  z  0) (H0: kx  0) :
    x - (kx  x + kz  z‖⁻¹ * x, kx  x + kz  z)  kx  x + kz  z‖⁻¹  (kx  x + kz  z) =
    -(kz / kx)  (z - (kx  x + kz  z‖⁻¹ * z, kx  x + kz  z)  kx  x + kz  z‖⁻¹  (kx  x + kz  z)) := by
  rw [neg_smul, smul_sub]
  simp [smul_smul]
  match_scalars <;>
  · field_simp
    rw [ real_inner_self_eq_norm_sq]
    simp [inner_add_left, inner_smul_left]
    ring

Ilmārs Cīrulis (Sep 02 2025 at 20:32):

Wow!

Jovan Gerbscheid (Sep 02 2025 at 20:32):

The doc-string of module also mentions the match_scalars tactic.

Jovan Gerbscheid (Sep 02 2025 at 20:34):

The brand new field_simp tactic is really great for these kinds of goals.

Ilmārs Cīrulis (Sep 02 2025 at 21:13):

Thank you!

Heather Macbeth (Sep 03 2025 at 10:51):

@Jovan Gerbscheid In fact you can eliminate the

  rw [neg_smul, smul_sub]
  simp [smul_smul]

:)


Last updated: Dec 20 2025 at 21:32 UTC