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

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 : 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 [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
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
⊢ f ![a, b] ≠ f ![r 0, r 1]

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
⊢ 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: 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
⊢ 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: obtain ⟨o, in_omega, rfl⟩ := 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
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: 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
⊢ (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: convert symmega ![a, b] ![b, a] (List.Perm.swap b a []) o in_omega using 2 <;>
  simp [Matrix.const_fin1_eq]
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: rcases (mcf.right (r 0) (r 1)).right equ with ⟨ha0, hb1⟩ | ⟨ha1, hb0⟩
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]
⊢ r 0 ≠ r 1
state_after: case inl.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
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]
ha0 : a = r 0
hb1 : b = r 1
⊢ r 0 ≠ r 1

case inr.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
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]
ha1 : a = r 1
hb0 : b = r 0
⊢ r 0 ≠ r 1

tactic: rw [ha0, hb1] at hab
state_before: case inl.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
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]
ha0 : a = r 0
hb1 : b = r 1
⊢ r 0 ≠ r 1
state_after: case inl.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
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
hab : r 0 ≠ r 1
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
equ : f ![a, b] = f ![r 0, r 1]
ha0 : a = r 0
hb1 : b = r 1
⊢ r 0 ≠ r 1

tactic: exact hab
state_before: case inl.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
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
hab : r 0 ≠ r 1
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
equ : f ![a, b] = f ![r 0, r 1]
ha0 : a = r 0
hb1 : b = r 1
⊢ r 0 ≠ r 1
state_after: no goals

tactic: rw [ha1, hb0] at hab
state_before: case inr.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
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]
ha1 : a = r 1
hb0 : b = r 0
⊢ r 0 ≠ r 1
state_after: case inr.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
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
hab : r 1 ≠ r 0
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
equ : f ![a, b] = f ![r 0, r 1]
ha1 : a = r 1
hb0 : b = r 0
⊢ r 0 ≠ r 1

tactic: exact hab.symm
state_before: case inr.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
ω : FractionalOperation D 2
symmega : ω.IsSymmetric
r : Fin 2 → D
hab : r 1 ≠ r 0
rin : ∃ a_1 ∈ ω, (fun i => a_1 (swap ![![a, b], ![b, a]] i)) = r
equ : f ![a, b] = f ![r 0, r 1]
ha1 : a = r 1
hb0 : b = r 0
⊢ r 0 ≠ r 1
state_after: no goals