Theorem: Dioph.union
File: Mathlib/NumberTheory/Dioph.lean

tactic: refine
  Iff.trans (or_congr ((pe v).trans ?_) ((qe v).trans ?_))
    (exists_or.symm.trans
      (exists_congr fun t =>
        (@mul_eq_zero _ _ _ (p ((v ⊗ t) ∘ (inl ⊗ inr ∘ inl)))
            (q ((v ⊗ t) ∘ (inl ⊗ inr ∘ inr)))).symm))
state_before: α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ (S ∪ S') v ↔ ∃ t, (Poly.map (inl ⊗ inr ∘ inl) p * Poly.map (inl ⊗ inr ∘ inr) q) (v ⊗ t) = 0
state_after: case refine_1
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ (∃ t, p (v ⊗ t) = 0) ↔ ∃ x, p ((v ⊗ x) ∘ (inl ⊗ inr ∘ inl)) = 0

case refine_2
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ (∃ t, q (v ⊗ t) = 0) ↔ ∃ x, q ((v ⊗ x) ∘ (inl ⊗ inr ∘ inr)) = 0

tactic: refine inject_dummies_lem _ ?_ ?_ _ _
state_before: case refine_1
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ (∃ t, p (v ⊗ t) = 0) ↔ ∃ x, p ((v ⊗ x) ∘ (inl ⊗ inr ∘ inl)) = 0
state_after: case refine_1.refine_1
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ β ⊕ γ → Option β

case refine_1.refine_2
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ ∀ (x : β), ?refine_1.refine_1 (inl x) = some x

tactic: exact some ⊗ fun _ => none
state_before: case refine_1.refine_1
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ β ⊕ γ → Option β
state_after: no goals

tactic: exact fun _ => by simp only [elim_inl]
state_before: case refine_1.refine_2
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ ∀ (x : β), (some ⊗ fun x => none) (inl x) = some x
state_after: no goals

tactic: simp only [elim_inl]
state_before: α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
x✝ : β
⊢ (some ⊗ fun x => none) (inl x✝) = some x✝
state_after: no goals

tactic: refine inject_dummies_lem _ ?_ ?_ _ _
state_before: case refine_2
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ (∃ t, q (v ⊗ t) = 0) ↔ ∃ x, q ((v ⊗ x) ∘ (inl ⊗ inr ∘ inr)) = 0
state_after: case refine_2.refine_1
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ β ⊕ γ → Option γ

case refine_2.refine_2
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ ∀ (x : γ), ?refine_2.refine_1 (inr x) = some x

tactic: exact (fun _ => none) ⊗ some
state_before: case refine_2.refine_1
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ β ⊕ γ → Option γ
state_after: no goals

tactic: exact fun _ => by simp only [elim_inr]
state_before: case refine_2.refine_2
α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
⊢ ∀ (x : γ), ((fun x => none) ⊗ some) (inr x) = some x
state_after: no goals

tactic: simp only [elim_inr]
state_before: α β✝ γ✝ : Type u
S S' : Set (α → ℕ)
β : Type u
p : Poly (α ⊕ β)
pe : ∀ (v : α → ℕ), S v ↔ ∃ t, p (v ⊗ t) = 0
γ : Type u
q : Poly (α ⊕ γ)
qe : ∀ (v : α → ℕ), S' v ↔ ∃ t, q (v ⊗ t) = 0
v : α → ℕ
x✝ : γ
⊢ ((fun x => none) ⊗ some) (inr x✝) = some x✝
state_after: no goals