Theorem: Function.HasMaxCutProperty.forbids_commutativeFractionalPolymorphism
File: Mathlib/Combinatorics/Optimization/ValuedCSP.lean

tactic: intro contr
state_before: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
mcf : HasMaxCutProperty f
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
⊢ ¬AdmitsFractional f ω
state_after: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
mcf : HasMaxCutProperty f
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
contr : AdmitsFractional f ω
⊢ False

tactic: obtain ⟨a, b, hab, mcfab⟩ := mcf
state_before: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
mcf : HasMaxCutProperty f
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
contr : AdmitsFractional f ω
⊢ False
state_after: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
contr : AdmitsFractional f ω
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
⊢ False

tactic: specialize contr ![![a, b], ![b, a]]
state_before: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
contr : AdmitsFractional f ω
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
⊢ False
state_after: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • ∑ i : Fin 2, f (![![a, b], ![b, a]] i)
⊢ False

tactic: rw [Fin.sum_univ_two', ← mcfab.left, ← two_nsmul] at contr
state_before: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • ∑ i : Fin 2, f (![![a, b], ![b, a]] i)
⊢ False
state_after: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
⊢ False

tactic: have impos : 2 • (ω.map (fun _ => f ![a, b])).sum < ω.size • 2 • f ![a, b] := by
  convert lt_of_lt_of_le sharp contr
  simp [FractionalOperation.tt, Multiset.map_map]
state_before: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
⊢ False
state_after: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
impos : 2 • (Multiset.map (fun x => f ![a, b]) ω).sum < ω.size • 2 • f ![a, b]
⊢ False

tactic: have rhs_swap : ω.size • 2 • f ![a, b] = 2 • ω.size • f ![a, b] := nsmul_left_comm ..
state_before: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
impos : 2 • (Multiset.map (fun x => f ![a, b]) ω).sum < ω.size • 2 • f ![a, b]
⊢ False
state_after: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
impos : 2 • (Multiset.map (fun x => f ![a, b]) ω).sum < ω.size • 2 • f ![a, b]
rhs_swap : ω.size • 2 • f ![a, b] = 2 • ω.size • f ![a, b]
⊢ False

tactic: have distrib : (ω.map (fun _ => f ![a, b])).sum = ω.size • f ![a, b] := by simp
state_before: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
impos : 2 • (Multiset.map (fun x => f ![a, b]) ω).sum < ω.size • 2 • f ![a, b]
rhs_swap : ω.size • 2 • f ![a, b] = 2 • ω.size • f ![a, b]
⊢ False
state_after: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
impos : 2 • (Multiset.map (fun x => f ![a, b]) ω).sum < ω.size • 2 • f ![a, b]
rhs_swap : ω.size • 2 • f ![a, b] = 2 • ω.size • f ![a, b]
distrib : (Multiset.map (fun x => f ![a, b]) ω).sum = ω.size • f ![a, b]
⊢ False

tactic: rw [rhs_swap, distrib] at impos
state_before: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
impos : 2 • (Multiset.map (fun x => f ![a, b]) ω).sum < ω.size • 2 • f ![a, b]
rhs_swap : ω.size • 2 • f ![a, b] = 2 • ω.size • f ![a, b]
distrib : (Multiset.map (fun x => f ![a, b]) ω).sum = ω.size • f ![a, b]
⊢ False
state_after: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
impos : 2 • ω.size • f ![a, b] < 2 • ω.size • f ![a, b]
rhs_swap : ω.size • 2 • f ![a, b] = 2 • ω.size • f ![a, b]
distrib : (Multiset.map (fun x => f ![a, b]) ω).sum = ω.size • f ![a, b]
⊢ False

tactic: exact ne_of_lt impos rfl
state_before: case intro.intro.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
impos : 2 • ω.size • f ![a, b] < 2 • ω.size • f ![a, b]
rhs_swap : ω.size • 2 • f ![a, b] = 2 • ω.size • f ![a, b]
distrib : (Multiset.map (fun x => f ![a, b]) ω).sum = ω.size • f ![a, b]
⊢ False
state_after: no goals

tactic: rw [two_nsmul, two_nsmul]
state_before: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
half_sharp :
  (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
⊢ 2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
state_after: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
half_sharp :
  (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
⊢ (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum +
      (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum +
      (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum

tactic: exact add_lt_add half_sharp half_sharp
state_before: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
half_sharp :
  (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
⊢ (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum +
      (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum +
      (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
state_after: no goals

tactic: apply Multiset.sum_lt_sum
state_before: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
⊢ (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
state_after: case hle
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
⊢ ∀ i ∈ ω.tt ![![a, b], ![b, a]], f ![a, b] ≤ f i

case hlt
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
⊢ ∃ i ∈ ω.tt ![![a, b], ![b, a]], f ![a, b] < f i

tactic: intro r rin
state_before: case hle
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
⊢ ∀ i ∈ ω.tt ![![a, b], ![b, a]], f ![a, b] ≤ f i
state_after: case hle
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
r : Fin (Nat.succ 0).succ → D
rin : r ∈ ω.tt ![![a, b], ![b, a]]
⊢ f ![a, b] ≤ f r

tactic: exact le_of_lt (mcfab.rows_lt_aux hab symmega rin)
state_before: case hle
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
r : Fin (Nat.succ 0).succ → D
rin : r ∈ ω.tt ![![a, b], ![b, a]]
⊢ f ![a, b] ≤ f r
state_after: no goals

tactic: obtain ⟨g, _⟩ := valid.contains
state_before: case hlt
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
⊢ ∃ i ∈ ω.tt ![![a, b], ![b, a]], f ![a, b] < f i
state_after: case hlt.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
g : (Fin 2 → D) → D
h✝ : g ∈ ω
⊢ ∃ i ∈ ω.tt ![![a, b], ![b, a]], f ![a, b] < f i

tactic: have : (fun i => g ((Function.swap ![![a, b], ![b, a]]) i)) ∈ ω.tt ![![a, b], ![b, a]] := by
  simp only [FractionalOperation.tt, Multiset.mem_map]
  use g
state_before: case hlt.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
g : (Fin 2 → D) → D
h✝ : g ∈ ω
⊢ ∃ i ∈ ω.tt ![![a, b], ![b, a]], f ![a, b] < f i
state_after: case hlt.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
g : (Fin 2 → D) → D
h✝ : g ∈ ω
this : (fun i => g (swap ![![a, b], ![b, a]] i)) ∈ ω.tt ![![a, b], ![b, a]]
⊢ ∃ i ∈ ω.tt ![![a, b], ![b, a]], f ![a, b] < f i

tactic: exact ⟨_, this, mcfab.rows_lt_aux hab symmega this⟩
state_before: case hlt.intro
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
g : (Fin 2 → D) → D
h✝ : g ∈ ω
this : (fun i => g (swap ![![a, b], ![b, a]] i)) ∈ ω.tt ![![a, b], ![b, a]]
⊢ ∃ i ∈ ω.tt ![![a, b], ![b, a]], f ![a, b] < f i
state_after: no goals

tactic: simp only [FractionalOperation.tt, Multiset.mem_map]
state_before: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
g : (Fin 2 → D) → D
h✝ : g ∈ ω
⊢ (fun i => g (swap ![![a, b], ![b, a]] i)) ∈ ω.tt ![![a, b], ![b, a]]
state_after: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
g : (Fin 2 → D) → D
h✝ : g ∈ ω
⊢ ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = fun i => g (swap ![![a, b], ![b, a]] i)

tactic: use g
state_before: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
g : (Fin 2 → D) → D
h✝ : g ∈ ω
⊢ ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = fun i => g (swap ![![a, b], ![b, a]] i)
state_after: no goals

tactic: convert lt_of_lt_of_le sharp contr
state_before: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
⊢ 2 • (Multiset.map (fun x => f ![a, b]) ω).sum < ω.size • 2 • f ![a, b]
state_after: case h.e'_3.h.e'_6.h.e'_3
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
⊢ Multiset.map (fun x => f ![a, b]) ω = Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])

tactic: simp [FractionalOperation.tt, Multiset.map_map]
state_before: case h.e'_3.h.e'_6.h.e'_3
D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
⊢ Multiset.map (fun x => f ![a, b]) ω = Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])
state_after: no goals

tactic: simp
state_before: D : Type u_1
C✝ : Type u_2
inst✝¹ : OrderedAddCommMonoid C✝
m : ℕ
C : Type u_3
inst✝ : OrderedCancelAddCommMonoid C
f : (Fin 2 → D) → C
ω : FractionalOperation D 2
valid : ω.IsValid
symmega : ω.IsSymmetric
a b : D
hab : a ≠ b
mcfab : HasMaxCutPropertyAt f a b
contr : 2 • (Multiset.map f (ω.tt ![![a, b], ![b, a]])).sum ≤ ω.size • 2 • f ![a, b]
sharp :
  2 • (Multiset.map (fun x => f ![a, b]) (ω.tt ![![a, b], ![b, a]])).sum <
    2 • (Multiset.map (fun r => f r) (ω.tt ![![a, b], ![b, a]])).sum
impos : 2 • (Multiset.map (fun x => f ![a, b]) ω).sum < ω.size • 2 • f ![a, b]
rhs_swap : ω.size • 2 • f ![a, b] = 2 • ω.size • f ![a, b]
⊢ (Multiset.map (fun x => f ![a, b]) ω).sum = ω.size • f ![a, b]
state_after: no goals