Theorem: MonovaryOn.sum_smul_comp_perm_le_sum_smul
File: Mathlib/Algebra/Order/Rearrangement.lean

tactic: revert hσ σ hfg
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s : Finset ι
σ : Perm ι
f : ι → α
g : ι → β
hfg : MonovaryOn f g ↑s
hσ : {x | ↑σ x ≠ x} ⊆ ↑s
⊢ ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i

tactic: apply Finset.induction_on_max_value (fun i ↦ toLex (g i, f i))
  (p := fun t ↦ ∀ {σ : Perm ι}, MonovaryOn f g t → { x | σ x ≠ x } ⊆ t →
    (∑ i in t, f i • g (σ i)) ≤ ∑ i in t, f i • g i) s
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s : Finset ι
f : ι → α
g : ι → β
⊢ ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i

tactic: intro a s has hamax hind σ hfg hσ
state_before: case step
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s : Finset ι
f : ι → α
g : ι → β
⊢ ∀ (a : ι) (s : Finset ι),
    ¬a ∈ s →
      (∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)) →
        (∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i) →
          ∀ {σ : Perm ι},
            MonovaryOn f g ↑(insert a s) →
              {x | ↑σ x ≠ x} ⊆ ↑(insert a s) → ∑ i in insert a s, f i • g (↑σ i) ≤ ∑ i in insert a s, f i • g i

tactic: set τ : Perm ι := σ.trans (swap a (σ a)) with hτ
state_before: case step
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
hind : ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
⊢ ∑ i in insert a s, f i • g (↑σ i) ≤ ∑ i in insert a s, f i • g i

tactic: specialize hind (hfg.subset <| subset_insert _ _) hτs
state_before: case step
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
hind : ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
⊢ ∑ i in insert a s, f i • g (↑σ i) ≤ ∑ i in insert a s, f i • g i

tactic: simp_rw [sum_insert has]
state_before: case step
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
⊢ ∑ i in insert a s, f i • g (↑σ i) ≤ ∑ i in insert a s, f i • g i

tactic: refine' le_trans _ (add_le_add_left hind _)
state_before: case step
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
⊢ f a • g (↑σ a) + ∑ x in s, f x • g (↑σ x) ≤ f a • g a + ∑ i in s, f i • g i

tactic: obtain hσa | hσa := eq_or_ne a (σ a)
state_before: case step
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
⊢ f a • g (↑σ a) + ∑ x in s, f x • g (↑σ x) ≤ f a • g a + ∑ i in s, f i • g (↑τ i)

tactic: have h1s : σ⁻¹ a ∈ s := by
  rw [Ne.def, ← inv_eq_iff_eq] at hσa
  refine' mem_of_mem_insert_of_ne (hσ fun h ↦ hσa _) hσa
  rwa [apply_inv_self, eq_comm] at h
state_before: case step.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
⊢ f a • g (↑σ a) + ∑ x in s, f x • g (↑σ x) ≤ f a • g a + ∑ i in s, f i • g (↑τ i)

tactic: simp only [← s.sum_erase_add _ h1s, add_comm]
state_before: case step.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
⊢ f a • g (↑σ a) + ∑ x in s, f x • g (↑σ x) ≤ f a • g a + ∑ i in s, f i • g (↑τ i)

tactic: rw [← add_assoc, ← add_assoc]
state_before: case step.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
⊢ f a • g (↑σ a) + (f (↑σ⁻¹ a) • g (↑σ (↑σ⁻¹ a)) + ∑ x in erase s (↑σ⁻¹ a), f x • g (↑σ x)) ≤
    f a • g a +
      (f (↑σ⁻¹ a) • g (↑(σ.trans (Equiv.swap a (↑σ a))) (↑σ⁻¹ a)) +
        ∑ x in erase s (↑σ⁻¹ a), f x • g (↑(σ.trans (Equiv.swap a (↑σ a))) x))

tactic: simp only [hτ, swap_apply_left, Function.comp_apply, Equiv.coe_trans, apply_inv_self]
state_before: case step.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
⊢ f a • g (↑σ a) + f (↑σ⁻¹ a) • g (↑σ (↑σ⁻¹ a)) + ∑ x in erase s (↑σ⁻¹ a), f x • g (↑σ x) ≤
    f a • g a + f (↑σ⁻¹ a) • g (↑(σ.trans (Equiv.swap a (↑σ a))) (↑σ⁻¹ a)) +
      ∑ x in erase s (↑σ⁻¹ a), f x • g (↑(σ.trans (Equiv.swap a (↑σ a))) x)

tactic: refine' add_le_add (smul_add_smul_le_smul_add_smul' _ _) (sum_congr rfl fun x hx ↦ _).le
state_before: case step.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
⊢ f a • g (↑σ a) + f (↑σ⁻¹ a) • g a + ∑ x in erase s (↑σ⁻¹ a), f x • g (↑σ x) ≤
    f a • g a + f (↑σ⁻¹ a) • g (↑σ a) + ∑ x in erase s (↑σ⁻¹ a), f x • g (↑(Equiv.swap a (↑σ a)) (↑σ x))

tactic: simp only [le_rfl, Finset.sum_empty, imp_true_iff]
state_before: case h0
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s : Finset ι
f : ι → α
g : ι → β
⊢ ∀ {σ : Perm ι}, MonovaryOn f g ↑∅ → {x | ↑σ x ≠ x} ⊆ ↑∅ → ∑ i in ∅, f i • g (↑σ i) ≤ ∑ i in ∅, f i • g i

tactic: intro x hx
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
hind : ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
⊢ {x | ↑τ x ≠ x} ⊆ ↑s

tactic: simp only [Ne.def, Set.mem_setOf_eq, Equiv.coe_trans, Equiv.swap_comp_apply] at hx
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
hind : ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
x : ι
hx : x ∈ {x | ↑τ x ≠ x}
⊢ x ∈ ↑s

tactic: split_ifs at hx with h₁ h₂
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
hind : ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
x : ι
hx : ¬(if ↑σ x = a then ↑σ a else if ↑σ x = ↑σ a then a else ↑σ x) = x
⊢ x ∈ ↑s

tactic: obtain rfl | hax := eq_or_ne x a
state_before: case inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
hind : ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
x : ι
h₁ : ↑σ x = a
hx : ¬↑σ a = x
⊢ x ∈ ↑s

tactic: contradiction
state_before: case inl.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
s : Finset ι
hind : ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i
σ : Perm ι
x : ι
has : ¬x ∈ s
hamax : ∀ (x_1 : ι), x_1 ∈ s → ↑toLex (g x_1, f x_1) ≤ ↑toLex (g x, f x)
hfg : MonovaryOn f g ↑(insert x s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert x s)
τ : Perm ι := σ.trans (Equiv.swap x (↑σ x))
hτ : τ = σ.trans (Equiv.swap x (↑σ x))
h₁ : ↑σ x = x
hx : ¬↑σ x = x
⊢ x ∈ ↑s

tactic: exact mem_of_mem_insert_of_ne (hσ fun h ↦ hax <| h.symm.trans h₁) hax
state_before: case inl.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
hind : ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
x : ι
h₁ : ↑σ x = a
hx : ¬↑σ a = x
hax : x ≠ a
⊢ x ∈ ↑s

tactic: exact (hx <| σ.injective h₂.symm).elim
state_before: case inr.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
hind : ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
x : ι
h₁ : ¬↑σ x = a
h₂ : ↑σ x = ↑σ a
hx : ¬a = x
⊢ x ∈ ↑s

tactic: exact mem_of_mem_insert_of_ne (hσ hx) (ne_of_apply_ne _ h₂)
state_before: case inr.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
hind : ∀ {σ : Perm ι}, MonovaryOn f g ↑s → {x | ↑σ x ≠ x} ⊆ ↑s → ∑ i in s, f i • g (↑σ i) ≤ ∑ i in s, f i • g i
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
x : ι
h₁ : ¬↑σ x = a
h₂ : ¬↑σ x = ↑σ a
hx : ¬↑σ x = x
⊢ x ∈ ↑s

tactic: rw [hτ, ← hσa, swap_self, trans_refl]
state_before: case step.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a = ↑σ a
⊢ f a • g (↑σ a) + ∑ x in s, f x • g (↑σ x) ≤ f a • g a + ∑ i in s, f i • g (↑τ i)

tactic: rw [Ne.def, ← inv_eq_iff_eq] at hσa
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
⊢ ↑σ⁻¹ a ∈ s

tactic: refine' mem_of_mem_insert_of_ne (hσ fun h ↦ hσa _) hσa
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : ¬↑σ⁻¹ a = a
⊢ ↑σ⁻¹ a ∈ s

tactic: rwa [apply_inv_self, eq_comm] at h
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : ¬↑σ⁻¹ a = a
h : ↑σ (↑σ⁻¹ a) = ↑σ⁻¹ a
⊢ ↑σ⁻¹ a = a

tactic: specialize hamax (σ⁻¹ a) h1s
state_before: case step.inr.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
⊢ f (↑σ⁻¹ a) ≤ f a

tactic: rw [Prod.Lex.le_iff] at hamax
state_before: case step.inr.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
hamax : ↑toLex (g (↑σ⁻¹ a), f (↑σ⁻¹ a)) ≤ ↑toLex (g a, f a)
⊢ f (↑σ⁻¹ a) ≤ f a

tactic: cases' hamax with hamax hamax
state_before: case step.inr.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
hamax :
  (g (↑σ⁻¹ a), f (↑σ⁻¹ a)).fst < (g a, f a).fst ∨
    (g (↑σ⁻¹ a), f (↑σ⁻¹ a)).fst = (g a, f a).fst ∧ (g (↑σ⁻¹ a), f (↑σ⁻¹ a)).snd ≤ (g a, f a).snd
⊢ f (↑σ⁻¹ a) ≤ f a

tactic: exact hfg (mem_insert_of_mem h1s) (mem_insert_self _ _) hamax
state_before: case step.inr.refine'_1.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
hamax : (g (↑σ⁻¹ a), f (↑σ⁻¹ a)).fst < (g a, f a).fst
⊢ f (↑σ⁻¹ a) ≤ f a

tactic: exact hamax.2
state_before: case step.inr.refine'_1.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
hamax : (g (↑σ⁻¹ a), f (↑σ⁻¹ a)).fst = (g a, f a).fst ∧ (g (↑σ⁻¹ a), f (↑σ⁻¹ a)).snd ≤ (g a, f a).snd
⊢ f (↑σ⁻¹ a) ≤ f a

tactic: specialize hamax (σ a) (mem_of_mem_insert_of_ne (hσ <| σ.injective.ne hσa.symm) hσa.symm)
state_before: case step.inr.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
⊢ g (↑σ a) ≤ g a

tactic: rw [Prod.Lex.le_iff] at hamax
state_before: case step.inr.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
hamax : ↑toLex (g (↑σ a), f (↑σ a)) ≤ ↑toLex (g a, f a)
⊢ g (↑σ a) ≤ g a

tactic: cases' hamax with hamax hamax
state_before: case step.inr.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
hamax :
  (g (↑σ a), f (↑σ a)).fst < (g a, f a).fst ∨
    (g (↑σ a), f (↑σ a)).fst = (g a, f a).fst ∧ (g (↑σ a), f (↑σ a)).snd ≤ (g a, f a).snd
⊢ g (↑σ a) ≤ g a

tactic: exact hamax.le
state_before: case step.inr.refine'_2.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
hamax : (g (↑σ a), f (↑σ a)).fst < (g a, f a).fst
⊢ g (↑σ a) ≤ g a

tactic: exact hamax.1.le
state_before: case step.inr.refine'_2.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
hamax : (g (↑σ a), f (↑σ a)).fst = (g a, f a).fst ∧ (g (↑σ a), f (↑σ a)).snd ≤ (g a, f a).snd
⊢ g (↑σ a) ≤ g a

tactic: rw [mem_erase, Ne.def, eq_inv_iff_eq] at hx
state_before: case step.inr.refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
x : ι
hx : x ∈ erase s (↑σ⁻¹ a)
⊢ f x • g (↑σ x) = f x • g (↑(Equiv.swap a (↑σ a)) (↑σ x))

tactic: rw [swap_apply_of_ne_of_ne hx.1 (σ.injective.ne _)]
state_before: case step.inr.refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
x : ι
hx : ¬↑σ x = a ∧ x ∈ s
⊢ f x • g (↑σ x) = f x • g (↑(Equiv.swap a (↑σ a)) (↑σ x))

tactic: rintro rfl
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
a : ι
s : Finset ι
has : ¬a ∈ s
hamax : ∀ (x : ι), x ∈ s → ↑toLex (g x, f x) ≤ ↑toLex (g a, f a)
σ : Perm ι
hfg : MonovaryOn f g ↑(insert a s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert a s)
τ : Perm ι := σ.trans (Equiv.swap a (↑σ a))
hτ : τ = σ.trans (Equiv.swap a (↑σ a))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : a ≠ ↑σ a
h1s : ↑σ⁻¹ a ∈ s
x : ι
hx : ¬↑σ x = a ∧ x ∈ s
⊢ x ≠ a

tactic: exact has hx.2
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : LinearOrderedAddCommGroup β
inst✝¹ : Module α β
inst✝ : OrderedSMul α β
s✝ : Finset ι
f : ι → α
g : ι → β
s : Finset ι
σ : Perm ι
x : ι
has : ¬x ∈ s
hamax : ∀ (x_1 : ι), x_1 ∈ s → ↑toLex (g x_1, f x_1) ≤ ↑toLex (g x, f x)
hfg : MonovaryOn f g ↑(insert x s)
hσ : {x | ↑σ x ≠ x} ⊆ ↑(insert x s)
τ : Perm ι := σ.trans (Equiv.swap x (↑σ x))
hτ : τ = σ.trans (Equiv.swap x (↑σ x))
hτs : {x | ↑τ x ≠ x} ⊆ ↑s
hind : ∑ i in s, f i • g (↑τ i) ≤ ∑ i in s, f i • g i
hσa : x ≠ ↑σ x
h1s : ↑σ⁻¹ x ∈ s
hx : ¬↑σ x = x ∧ x ∈ s
⊢ False