Theorem: Function.HasMaxCutPropertyAt.rows_lt_aux
File: Mathlib/Combinatorics/Optimization/ValuedCSP.lean

Proof steps:
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : r ∈ ω.tt ![![a, b], ![b, a]]
⊢ f ![a, b] < f r
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
⊢ f ![a, b] < f r
tactic: rw [FractionalOperation.tt, Multiset.mem_map] at rin
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
⊢ f ![a, b] < f r
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
⊢ f ![a, b] < f ![r 0, r 1]
tactic: rw [show r = ![r 0, r 1] from List.ofFn_inj.mp rfl]
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
⊢ f ![a, b] < f ![r 0, r 1]
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
⊢ f ![a, b] ≠ f ![r 0, r 1]
tactic: apply lt_of_le_of_ne (mcf.right (r 0) (r 1)).left
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
⊢ f ![a, b] ≠ f ![r 0, r 1]
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
equ : f ![a, b] = f ![r 0, r 1]
⊢ False
tactic: intro equ
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
equ : f ![a, b] = f ![r 0, r 1]
asymm : r 0 ≠ r 1
⊢ False
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
equ : f ![a, b] = f ![r 0, r 1]
asymm : r 0 ≠ r 1
⊢ r 0 = r 1
tactic: apply asymm
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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
equ : f ![a, b] = f ![r 0, r 1]
asymm : r 0 ≠ r 1
⊢ r 0 = r 1
state_after: case 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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
o : (Fin 2 → D) → D
in_omega : o ∈ ω
equ : f ![a, b] = f ![(fun i => o (swap ![![a, b], ![b, a]] i)) 0, (fun i => o (swap ![![a, b], ![b, a]] i)) 1]
asymm : (fun i => o (swap ![![a, b], ![b, a]] i)) 0 ≠ (fun i => o (swap ![![a, b], ![b, a]] i)) 1
⊢ (fun i => o (swap ![![a, b], ![b, a]] i)) 0 = (fun i => o (swap ![![a, b], ![b, a]] i)) 1
tactic: obtain ⟨o, in_omega, rfl⟩ := rin
state_before: case 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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
o : (Fin 2 → D) → D
in_omega : o ∈ ω
equ : f ![a, b] = f ![(fun i => o (swap ![![a, b], ![b, a]] i)) 0, (fun i => o (swap ![![a, b], ![b, a]] i)) 1]
asymm : (fun i => o (swap ![![a, b], ![b, a]] i)) 0 ≠ (fun i => o (swap ![![a, b], ![b, a]] i)) 1
⊢ (fun i => o (swap ![![a, b], ![b, a]] i)) 0 = (fun i => o (swap ![![a, b], ![b, a]] i)) 1
state_after: case 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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
o : (Fin 2 → D) → D
in_omega : o ∈ ω
equ : f ![a, b] = f ![(fun i => o (swap ![![a, b], ![b, a]] i)) 0, (fun i => o (swap ![![a, b], ![b, a]] i)) 1]
asymm : (fun i => o (swap ![![a, b], ![b, a]] i)) 0 ≠ (fun i => o (swap ![![a, b], ![b, a]] i)) 1
⊢ (o fun j => ![![a, b], ![b, a]] j 0) = o fun j => ![![a, b], ![b, a]] j 1
tactic: show o (fun j => ![![a, b], ![b, a]] j 0) = o (fun j => ![![a, b], ![b, a]] j 1)
state_before: case 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
a b : D
mcf : HasMaxCutPropertyAt f a b
hab : a ≠ b
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
o : (Fin 2 → D) → D
in_omega : o ∈ ω
equ : f ![a, b] = f ![(fun i => o (swap ![![a, b], ![b, a]] i)) 0, (fun i => o (swap ![![a, b], ![b, a]] i)) 1]
asymm : (fun i => o (swap ![![a, b], ![b, a]] i)) 0 ≠ (fun i => o (swap ![![a, b], ![b, a]] i)) 1
⊢ (o fun j => ![![a, b], ![b, a]] j 0) = o fun j => ![![a, b], ![b, a]] j 1
state_after: no goals
tactic: convert symmega ![a, b] ![b, a] (List.Perm.swap b a []) o in_omega using 2 <;>
    simp [Matrix.const_fin1_eq]