Theorem: List.pairwise_join
File: .lake/packages/batteries/Batteries/Data/List/Pairwise.lean

tactic: induction L with
| nil => simp
| cons l L IH =>
  simp only [join, pairwise_append, IH, mem_join, exists_imp, and_imp, forall_mem_cons,
    pairwise_cons, and_assoc, and_congr_right_iff]
  rw [and_comm, and_congr_left_iff]
  intros; exact ⟨fun h a b c d e => h c d e a b, fun h c d e a b => h a b c d e⟩
state_before: α : Type u_1
R : α → α → Prop
L : List (List α)
⊢ Pairwise R L.join ↔
    (∀ (l : List α), l ∈ L → Pairwise R l) ∧ Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L
state_after: no goals

tactic: simp
state_before: case nil
α : Type u_1
R : α → α → Prop
⊢ Pairwise R [].join ↔
    (∀ (l : List α), l ∈ [] → Pairwise R l) ∧ Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) []
state_after: no goals

tactic: simp only [join, pairwise_append, IH, mem_join, exists_imp, and_imp, forall_mem_cons,
  pairwise_cons, and_assoc, and_congr_right_iff]
state_before: case cons
α : Type u_1
R : α → α → Prop
l : List α
L : List (List α)
IH :
  Pairwise R L.join ↔
    (∀ (l : List α), l ∈ L → Pairwise R l) ∧ Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L
⊢ Pairwise R (l :: L).join ↔
    (∀ (l_1 : List α), l_1 ∈ l :: L → Pairwise R l_1) ∧
      Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) (l :: L)
state_after: case cons
α : Type u_1
R : α → α → Prop
l : List α
L : List (List α)
IH :
  Pairwise R L.join ↔
    (∀ (l : List α), l ∈ L → Pairwise R l) ∧ Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L
⊢ Pairwise R l →
    (∀ (l : List α), l ∈ L → Pairwise R l) →
      ((Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L ∧
          ∀ (a : α), a ∈ l → ∀ (b : α) (x : List α), x ∈ L → b ∈ x → R a b) ↔
        (∀ (a' : List α), a' ∈ L → ∀ (x : α), x ∈ l → ∀ (y : α), y ∈ a' → R x y) ∧
          Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L)

tactic: rw [and_comm, and_congr_left_iff]
state_before: case cons
α : Type u_1
R : α → α → Prop
l : List α
L : List (List α)
IH :
  Pairwise R L.join ↔
    (∀ (l : List α), l ∈ L → Pairwise R l) ∧ Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L
⊢ Pairwise R l →
    (∀ (l : List α), l ∈ L → Pairwise R l) →
      ((Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L ∧
          ∀ (a : α), a ∈ l → ∀ (b : α) (x : List α), x ∈ L → b ∈ x → R a b) ↔
        (∀ (a' : List α), a' ∈ L → ∀ (x : α), x ∈ l → ∀ (y : α), y ∈ a' → R x y) ∧
          Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L)
state_after: case cons
α : Type u_1
R : α → α → Prop
l : List α
L : List (List α)
IH :
  Pairwise R L.join ↔
    (∀ (l : List α), l ∈ L → Pairwise R l) ∧ Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L
⊢ Pairwise R l →
    (∀ (l : List α), l ∈ L → Pairwise R l) →
      Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L →
        ((∀ (a : α), a ∈ l → ∀ (b : α) (x : List α), x ∈ L → b ∈ x → R a b) ↔
          ∀ (a' : List α), a' ∈ L → ∀ (x : α), x ∈ l → ∀ (y : α), y ∈ a' → R x y)

tactic: intros
state_before: case cons
α : Type u_1
R : α → α → Prop
l : List α
L : List (List α)
IH :
  Pairwise R L.join ↔
    (∀ (l : List α), l ∈ L → Pairwise R l) ∧ Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L
⊢ Pairwise R l →
    (∀ (l : List α), l ∈ L → Pairwise R l) →
      Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L →
        ((∀ (a : α), a ∈ l → ∀ (b : α) (x : List α), x ∈ L → b ∈ x → R a b) ↔
          ∀ (a' : List α), a' ∈ L → ∀ (x : α), x ∈ l → ∀ (y : α), y ∈ a' → R x y)
state_after: case cons
α : Type u_1
R : α → α → Prop
l : List α
L : List (List α)
IH :
  Pairwise R L.join ↔
    (∀ (l : List α), l ∈ L → Pairwise R l) ∧ Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L
a✝² : Pairwise R l
a✝¹ : ∀ (l : List α), l ∈ L → Pairwise R l
a✝ : Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L
⊢ (∀ (a : α), a ∈ l → ∀ (b : α) (x : List α), x ∈ L → b ∈ x → R a b) ↔
    ∀ (a' : List α), a' ∈ L → ∀ (x : α), x ∈ l → ∀ (y : α), y ∈ a' → R x y

tactic: exact ⟨fun h a b c d e => h c d e a b, fun h c d e a b => h a b c d e⟩
state_before: case cons
α : Type u_1
R : α → α → Prop
l : List α
L : List (List α)
IH :
  Pairwise R L.join ↔
    (∀ (l : List α), l ∈ L → Pairwise R l) ∧ Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L
a✝² : Pairwise R l
a✝¹ : ∀ (l : List α), l ∈ L → Pairwise R l
a✝ : Pairwise (fun l₁ l₂ => ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₂ → R x y) L
⊢ (∀ (a : α), a ∈ l → ∀ (b : α) (x : List α), x ∈ L → b ∈ x → R a b) ↔
    ∀ (a' : List α), a' ∈ L → ∀ (x : α), x ∈ l → ∀ (y : α), y ∈ a' → R x y
state_after: no goals