Theorem: List.pairwise_filterMap
File: Mathlib/Data/List/Pairwise.lean

tactic: let _S (a a' : β) := ∀ b ∈ f a, ∀ b' ∈ f a', R b b'
state_before: α : Type u_1
β : Type u_2
R S T : α → α → Prop
a : α
l✝ : List α
f : β → Option α
l : List β
⊢ Pairwise R (filterMap f l) ↔ Pairwise (fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b') l

tactic: simp only [Option.mem_def]
state_before: α : Type u_1
β : Type u_2
R S T : α → α → Prop
a : α
l✝ : List α
f : β → Option α
l : List β
_S : β → β → Prop := fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b'
⊢ Pairwise R (filterMap f l) ↔ Pairwise (fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b') l

tactic: induction' l with a l IH
state_before: α : Type u_1
β : Type u_2
R S T : α → α → Prop
a : α
l✝ : List α
f : β → Option α
l : List β
_S : β → β → Prop := fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b'
⊢ Pairwise R (filterMap f l) ↔ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l

tactic: cases' e : f a with b
state_before: case cons
α : Type u_1
β : Type u_2
R S T : α → α → Prop
a✝ : α
l✝ : List α
f : β → Option α
_S : β → β → Prop := fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b'
a : β
l : List β
IH : Pairwise R (filterMap f l) ↔ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l
⊢ Pairwise R (filterMap f (a :: l)) ↔
    Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') (a :: l)

tactic: rw [filterMap_cons_some _ _ _ e]
state_before: case cons.some
α : Type u_1
β : Type u_2
R S T : α → α → Prop
a✝ : α
l✝ : List α
f : β → Option α
_S : β → β → Prop := fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b'
a : β
l : List β
IH : Pairwise R (filterMap f l) ↔ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l
b : α
e : f a = some b
⊢ Pairwise R (filterMap f (a :: l)) ↔
    Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') (a :: l)

tactic: simp only [pairwise_cons, mem_filterMap, forall_exists_index, and_imp, IH, e, Option.some.injEq,
  forall_eq', and_congr_left_iff]
state_before: case cons.some
α : Type u_1
β : Type u_2
R S T : α → α → Prop
a✝ : α
l✝ : List α
f : β → Option α
_S : β → β → Prop := fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b'
a : β
l : List β
IH : Pairwise R (filterMap f l) ↔ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l
b : α
e : f a = some b
⊢ Pairwise R (b :: filterMap f l) ↔
    Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') (a :: l)

tactic: intro _
state_before: case cons.some
α : Type u_1
β : Type u_2
R S T : α → α → Prop
a✝ : α
l✝ : List α
f : β → Option α
_S : β → β → Prop := fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b'
a : β
l : List β
IH : Pairwise R (filterMap f l) ↔ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l
b : α
e : f a = some b
⊢ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l →
    ((∀ (a' : α) (x : β), x ∈ l → f x = some a' → R b a') ↔ ∀ (a' : β), a' ∈ l → ∀ (b' : α), f a' = some b' → R b b')

tactic: exact ⟨fun h a ha b hab => h _ _ ha hab, fun h a b ha hab => h _ ha _ hab⟩
state_before: case cons.some
α : Type u_1
β : Type u_2
R S T : α → α → Prop
a✝¹ : α
l✝ : List α
f : β → Option α
_S : β → β → Prop := fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b'
a : β
l : List β
IH : Pairwise R (filterMap f l) ↔ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l
b : α
e : f a = some b
a✝ : Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l
⊢ (∀ (a' : α) (x : β), x ∈ l → f x = some a' → R b a') ↔ ∀ (a' : β), a' ∈ l → ∀ (b' : α), f a' = some b' → R b b'

tactic: simp only [filterMap, Pairwise.nil]
state_before: case nil
α : Type u_1
β : Type u_2
R S T : α → α → Prop
a : α
l : List α
f : β → Option α
_S : β → β → Prop := fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b'
⊢ Pairwise R (filterMap f []) ↔ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') []

tactic: rw [filterMap_cons_none _ _ e, propext IH, pairwise_cons]
state_before: case cons.none
α : Type u_1
β : Type u_2
R S T : α → α → Prop
a✝ : α
l✝ : List α
f : β → Option α
_S : β → β → Prop := fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b'
a : β
l : List β
IH : Pairwise R (filterMap f l) ↔ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l
e : f a = none
⊢ Pairwise R (filterMap f (a :: l)) ↔
    Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') (a :: l)

tactic: simp only [e, forall_prop_of_false not_false, forall₃_true_iff, true_and_iff]
state_before: case cons.none
α : Type u_1
β : Type u_2
R S T : α → α → Prop
a✝ : α
l✝ : List α
f : β → Option α
_S : β → β → Prop := fun a a' => ∀ (b : α), b ∈ f a → ∀ (b' : α), b' ∈ f a' → R b b'
a : β
l : List β
IH : Pairwise R (filterMap f l) ↔ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l
e : f a = none
⊢ Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l ↔
    (∀ (a' : β), a' ∈ l → ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') ∧
      Pairwise (fun a a' => ∀ (b : α), f a = some b → ∀ (b' : α), f a' = some b' → R b b') l