File: Mathlib/Computability/Reduce.lean

full_name: ManyOneReducible
code: /--
`p` is many-one reducible to `q` if there is a computable function translating questions about `p`
to questions about `q`.
-/
def ManyOneReducible {α β} [Primcodable α] [Primcodable β] (p : α → Prop) (q : β → Prop) 
goal: Prop

full_name: _aux_Mathlib_Computability_Reduce___unexpand_ManyOneReducible_1
code: @[inherit_doc ManyOneReducible]
infixl:1000 " ≤₀ " => ManyOneReducible
goal: Lean.PrettyPrinter.Unexpander

full_name: «_aux_Mathlib_Computability_Reduce___macroRules_term_≤₀__1»
code: @[inherit_doc ManyOneReducible]
infixl:1000 " ≤₀ " => ManyOneReducible
goal: Lean.Macro

full_name: ManyOneReducible.mk
code: theorem ManyOneReducible.mk {α β} [Primcodable α] [Primcodable β] {f : α → β} (q : β → Prop)
    (h : Computable f) : (fun a => q (f a)) ≤₀ q 
goal: (fun a => q (f a)) ≤₀ q

full_name: manyOneReducible_refl
code: @[refl]
theorem manyOneReducible_refl {α} [Primcodable α] (p : α → Prop) : p ≤₀ p 
goal: p ≤₀ p

full_name: ManyOneReducible.trans
code: @[trans]
theorem ManyOneReducible.trans {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ]
    {p : α → Prop} {q : β → Prop} {r : γ → Prop} : p ≤₀ q → q ≤₀ r → p ≤₀ r
  
goal: p ≤₀ q → q ≤₀ r → p ≤₀ r

full_name: reflexive_manyOneReducible
code: theorem reflexive_manyOneReducible {α} [Primcodable α] : Reflexive (@ManyOneReducible α α _ _) 
goal: Reflexive ManyOneReducible

full_name: transitive_manyOneReducible
code: theorem transitive_manyOneReducible {α} [Primcodable α] : Transitive (@ManyOneReducible α α _ _) 
goal: Transitive ManyOneReducible

full_name: OneOneReducible
code: /--
`p` is one-one reducible to `q` if there is an injective computable function translating questions
about `p` to questions about `q`.
-/
def OneOneReducible {α β} [Primcodable α] [Primcodable β] (p : α → Prop) (q : β → Prop) 
goal: Prop

full_name: _aux_Mathlib_Computability_Reduce___unexpand_OneOneReducible_1
code: @[inherit_doc OneOneReducible]
infixl:1000 " ≤₁ " => OneOneReducible
goal: Lean.PrettyPrinter.Unexpander

full_name: «_aux_Mathlib_Computability_Reduce___macroRules_term_≤₁__1»
code: @[inherit_doc OneOneReducible]
infixl:1000 " ≤₁ " => OneOneReducible
goal: Lean.Macro

full_name: OneOneReducible.mk
code: theorem OneOneReducible.mk {α β} [Primcodable α] [Primcodable β] {f : α → β} (q : β → Prop)
    (h : Computable f) (i : Injective f) : (fun a => q (f a)) ≤₁ q 
goal: (fun a => q (f a)) ≤₁ q

full_name: oneOneReducible_refl
code: @[refl]
theorem oneOneReducible_refl {α} [Primcodable α] (p : α → Prop) : p ≤₁ p 
goal: p ≤₁ p

full_name: OneOneReducible.trans
code: @[trans]
theorem OneOneReducible.trans {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ] {p : α → Prop}
    {q : β → Prop} {r : γ → Prop} : p ≤₁ q → q ≤₁ r → p ≤₁ r
  
goal: p ≤₁ q → q ≤₁ r → p ≤₁ r

full_name: OneOneReducible.to_many_one
code: theorem OneOneReducible.to_many_one {α β} [Primcodable α] [Primcodable β] {p : α → Prop}
    {q : β → Prop} : p ≤₁ q → p ≤₀ q
  
goal: p ≤₁ q → p ≤₀ q

full_name: OneOneReducible.of_equiv
code: theorem OneOneReducible.of_equiv {α β} [Primcodable α] [Primcodable β] {e : α ≃ β} (q : β → Prop)
    (h : Computable e) : (q ∘ e) ≤₁ q 
goal: (q ∘ ⇑e) ≤₁ q

full_name: OneOneReducible.of_equiv_symm
code: theorem OneOneReducible.of_equiv_symm {α β} [Primcodable α] [Primcodable β] {e : α ≃ β}
    (q : β → Prop) (h : Computable e.symm) : q ≤₁ (q ∘ e) 
goal: q ≤₁ (q ∘ ⇑e)

full_name: reflexive_oneOneReducible
code: theorem reflexive_oneOneReducible {α} [Primcodable α] : Reflexive (@OneOneReducible α α _ _) 
goal: Reflexive OneOneReducible

full_name: transitive_oneOneReducible
code: theorem transitive_oneOneReducible {α} [Primcodable α] : Transitive (@OneOneReducible α α _ _) 
goal: Transitive OneOneReducible

full_name: ComputablePred.computable_of_manyOneReducible
code: theorem computable_of_manyOneReducible {p : α → Prop} {q : β → Prop} (h₁ : p ≤₀ q)
    (h₂ : ComputablePred q) : ComputablePred p 
goal: ComputablePred p

full_name: ComputablePred.computable_of_oneOneReducible
code: theorem computable_of_oneOneReducible {p : α → Prop} {q : β → Prop} (h : p ≤₁ q) :
    ComputablePred q → ComputablePred p 
goal: ComputablePred q → ComputablePred p

full_name: ManyOneEquiv
code: /-- `p` and `q` are many-one equivalent if each one is many-one reducible to the other. -/
def ManyOneEquiv {α β} [Primcodable α] [Primcodable β] (p : α → Prop) (q : β → Prop) 
goal: Prop

full_name: OneOneEquiv
code: /-- `p` and `q` are one-one equivalent if each one is one-one reducible to the other. -/
def OneOneEquiv {α β} [Primcodable α] [Primcodable β] (p : α → Prop) (q : β → Prop) 
goal: Prop

full_name: manyOneEquiv_refl
code: @[refl]
theorem manyOneEquiv_refl {α} [Primcodable α] (p : α → Prop) : ManyOneEquiv p p 
goal: ManyOneEquiv p p

full_name: ManyOneEquiv.symm
code: @[symm]
theorem ManyOneEquiv.symm {α β} [Primcodable α] [Primcodable β] {p : α → Prop} {q : β → Prop} :
    ManyOneEquiv p q → ManyOneEquiv q p 
goal: ManyOneEquiv p q → ManyOneEquiv q p

full_name: ManyOneEquiv.trans
code: @[trans]
theorem ManyOneEquiv.trans {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ] {p : α → Prop}
    {q : β → Prop} {r : γ → Prop} : ManyOneEquiv p q → ManyOneEquiv q r → ManyOneEquiv p r
  
goal: ManyOneEquiv p q → ManyOneEquiv q r → ManyOneEquiv p r

full_name: equivalence_of_manyOneEquiv
code: theorem equivalence_of_manyOneEquiv {α} [Primcodable α] : Equivalence (@ManyOneEquiv α α _ _) 
goal: Equivalence ManyOneEquiv

full_name: oneOneEquiv_refl
code: @[refl]
theorem oneOneEquiv_refl {α} [Primcodable α] (p : α → Prop) : OneOneEquiv p p 
goal: OneOneEquiv p p

full_name: OneOneEquiv.symm
code: @[symm]
theorem OneOneEquiv.symm {α β} [Primcodable α] [Primcodable β] {p : α → Prop} {q : β → Prop} :
    OneOneEquiv p q → OneOneEquiv q p 
goal: OneOneEquiv p q → OneOneEquiv q p

full_name: OneOneEquiv.trans
code: @[trans]
theorem OneOneEquiv.trans {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ] {p : α → Prop}
    {q : β → Prop} {r : γ → Prop} : OneOneEquiv p q → OneOneEquiv q r → OneOneEquiv p r
  
goal: OneOneEquiv p q → OneOneEquiv q r → OneOneEquiv p r

full_name: equivalence_of_oneOneEquiv
code: theorem equivalence_of_oneOneEquiv {α} [Primcodable α] : Equivalence (@OneOneEquiv α α _ _) 
goal: Equivalence OneOneEquiv

full_name: OneOneEquiv.to_many_one
code: theorem OneOneEquiv.to_many_one {α β} [Primcodable α] [Primcodable β] {p : α → Prop}
    {q : β → Prop} : OneOneEquiv p q → ManyOneEquiv p q
  
goal: OneOneEquiv p q → ManyOneEquiv p q

full_name: Equiv.Computable
code: /-- a computable bijection -/
nonrec def Equiv.Computable {α β} [Primcodable α] [Primcodable β] (e : α ≃ β) 
goal: Prop

full_name: Equiv.Computable.symm
code: theorem Equiv.Computable.symm {α β} [Primcodable α] [Primcodable β] {e : α ≃ β} :
    e.Computable → e.symm.Computable 
goal: e.Computable → e.symm.Computable

full_name: Equiv.Computable.trans
code: theorem Equiv.Computable.trans {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ] {e₁ : α ≃ β}
    {e₂ : β ≃ γ} : e₁.Computable → e₂.Computable → (e₁.trans e₂).Computable
  
goal: e₁.Computable → e₂.Computable → (e₁.trans e₂).Computable

full_name: Computable.eqv
code: theorem Computable.eqv (α) [Denumerable α] : (Denumerable.eqv α).Computable 
goal: (Denumerable.eqv α).Computable

full_name: Computable.equiv₂
code: theorem Computable.equiv₂ (α β) [Denumerable α] [Denumerable β] :
    (Denumerable.equiv₂ α β).Computable 
goal: (Denumerable.equiv₂ α β).Computable

full_name: OneOneEquiv.of_equiv
code: theorem OneOneEquiv.of_equiv {α β} [Primcodable α] [Primcodable β] {e : α ≃ β} (h : e.Computable)
    {p} : OneOneEquiv (p ∘ e) p 
goal: OneOneEquiv (p ∘ ⇑e) p

full_name: ManyOneEquiv.of_equiv
code: theorem ManyOneEquiv.of_equiv {α β} [Primcodable α] [Primcodable β] {e : α ≃ β} (h : e.Computable)
    {p} : ManyOneEquiv (p ∘ e) p 
goal: ManyOneEquiv (p ∘ ⇑e) p

full_name: ManyOneEquiv.le_congr_left
code: theorem ManyOneEquiv.le_congr_left {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ]
    {p : α → Prop} {q : β → Prop} {r : γ → Prop} (h : ManyOneEquiv p q) : p ≤₀ r ↔ q ≤₀ r 
goal: p ≤₀ r ↔ q ≤₀ r

full_name: ManyOneEquiv.le_congr_right
code: theorem ManyOneEquiv.le_congr_right {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ]
    {p : α → Prop} {q : β → Prop} {r : γ → Prop} (h : ManyOneEquiv q r) : p ≤₀ q ↔ p ≤₀ r 
goal: p ≤₀ q ↔ p ≤₀ r

full_name: OneOneEquiv.le_congr_left
code: theorem OneOneEquiv.le_congr_left {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ]
    {p : α → Prop} {q : β → Prop} {r : γ → Prop} (h : OneOneEquiv p q) : p ≤₁ r ↔ q ≤₁ r 
goal: p ≤₁ r ↔ q ≤₁ r

full_name: OneOneEquiv.le_congr_right
code: theorem OneOneEquiv.le_congr_right {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ]
    {p : α → Prop} {q : β → Prop} {r : γ → Prop} (h : OneOneEquiv q r) : p ≤₁ q ↔ p ≤₁ r 
goal: p ≤₁ q ↔ p ≤₁ r

full_name: ManyOneEquiv.congr_left
code: theorem ManyOneEquiv.congr_left {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ]
    {p : α → Prop} {q : β → Prop} {r : γ → Prop} (h : ManyOneEquiv p q) :
    ManyOneEquiv p r ↔ ManyOneEquiv q r 
goal: ManyOneEquiv p r ↔ ManyOneEquiv q r

full_name: ManyOneEquiv.congr_right
code: theorem ManyOneEquiv.congr_right {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ]
    {p : α → Prop} {q : β → Prop} {r : γ → Prop} (h : ManyOneEquiv q r) :
    ManyOneEquiv p q ↔ ManyOneEquiv p r 
goal: ManyOneEquiv p q ↔ ManyOneEquiv p r

full_name: OneOneEquiv.congr_left
code: theorem OneOneEquiv.congr_left {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ]
    {p : α → Prop} {q : β → Prop} {r : γ → Prop} (h : OneOneEquiv p q) :
    OneOneEquiv p r ↔ OneOneEquiv q r 
goal: OneOneEquiv p r ↔ OneOneEquiv q r

full_name: OneOneEquiv.congr_right
code: theorem OneOneEquiv.congr_right {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ]
    {p : α → Prop} {q : β → Prop} {r : γ → Prop} (h : OneOneEquiv q r) :
    OneOneEquiv p q ↔ OneOneEquiv p r 
goal: OneOneEquiv p q ↔ OneOneEquiv p r

full_name: ULower.down_computable
code: @[simp]
theorem ULower.down_computable {α} [Primcodable α] : (ULower.equiv α).Computable 
goal: (ULower.equiv α).Computable

full_name: manyOneEquiv_up
code: theorem manyOneEquiv_up {α} [Primcodable α] {p : α → Prop} : ManyOneEquiv (p ∘ ULower.up) p 
goal: ManyOneEquiv (p ∘ ULower.up) p

full_name: «_aux_Mathlib_Computability_Reduce___macroRules_term_⊕'__1_1»
code: local infixl:1001 " ⊕' " => Sum.elim
goal: Lean.Macro

full_name: _aux_Mathlib_Computability_Reduce___unexpand_Sum_elim_1
code: local infixl:1001 " ⊕' " => Sum.elim
goal: Lean.PrettyPrinter.Unexpander

full_name: OneOneReducible.disjoin_left
code: theorem OneOneReducible.disjoin_left {α β} [Primcodable α] [Primcodable β] {p : α → Prop}
    {q : β → Prop} : p ≤₁ p ⊕' q 
goal: p ≤₁ p ⊕' q

full_name: OneOneReducible.disjoin_right
code: theorem OneOneReducible.disjoin_right {α β} [Primcodable α] [Primcodable β] {p : α → Prop}
    {q : β → Prop} : q ≤₁ p ⊕' q 
goal: q ≤₁ p ⊕' q

full_name: disjoin_manyOneReducible
code: theorem disjoin_manyOneReducible {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ]
    {p : α → Prop} {q : β → Prop} {r : γ → Prop} : p ≤₀ r → q ≤₀ r → (p ⊕' q) ≤₀ r
  
goal: p ≤₀ r → q ≤₀ r → p ⊕' q ≤₀ r

full_name: disjoin_le
code: theorem disjoin_le {α β γ} [Primcodable α] [Primcodable β] [Primcodable γ] {p : α → Prop}
    {q : β → Prop} {r : γ → Prop} : (p ⊕' q) ≤₀ r ↔ p ≤₀ r ∧ q ≤₀ r 
goal: p ⊕' q ≤₀ r ↔ p ≤₀ r ∧ q ≤₀ r

full_name: toNat
code: /-- Computable and injective mapping of predicates to sets of natural numbers.
-/
def toNat (p : Set α) : Set ℕ 
goal: Set ℕ

full_name: toNat_manyOneReducible
code: @[simp]
theorem toNat_manyOneReducible {p : Set α} : toNat p ≤₀ p 
goal: toNat p ≤₀ p

full_name: manyOneReducible_toNat
code: @[simp]
theorem manyOneReducible_toNat {p : Set α} : p ≤₀ toNat p 
goal: p ≤₀ toNat p

full_name: manyOneReducible_toNat_toNat
code: @[simp]
theorem manyOneReducible_toNat_toNat {p : Set α} {q : Set β} : toNat p ≤₀ toNat q ↔ p ≤₀ q 
goal: toNat p ≤₀ toNat q ↔ p ≤₀ q

full_name: toNat_manyOneEquiv
code: @[simp]
theorem toNat_manyOneEquiv {p : Set α} : ManyOneEquiv (toNat p) p 
goal: ManyOneEquiv (toNat p) p

full_name: manyOneEquiv_toNat
code: @[simp]
theorem manyOneEquiv_toNat (p : Set α) (q : Set β) :
    ManyOneEquiv (toNat p) (toNat q) ↔ ManyOneEquiv p q 
goal: ManyOneEquiv (toNat p) (toNat q) ↔ ManyOneEquiv p q

full_name: ManyOneDegree
code: /-- A many-one degree is an equivalence class of sets up to many-one equivalence. -/
def ManyOneDegree : Type 
goal: Type

full_name: ManyOneDegree.of
code: /-- The many-one degree of a set on a primcodable type. -/
def of (p : α → Prop) : ManyOneDegree 
goal: ManyOneDegree

full_name: ManyOneDegree.ind_on
code: @[elab_as_elim]
protected theorem ind_on {C : ManyOneDegree → Prop} (d : ManyOneDegree)
    (h : ∀ p : Set ℕ, C (of p)) : C d 
goal: C d

full_name: ManyOneDegree.liftOn
code: /-- Lifts a function on sets of natural numbers to many-one degrees.
-/
-- @[elab_as_elim] -- Porting note: unexpected eliminator resulting type
protected abbrev liftOn {φ} (d : ManyOneDegree) (f : Set ℕ → φ)
    (h : ∀ p q, ManyOneEquiv p q → f p = f q) : φ 
goal: φ

full_name: ManyOneDegree.liftOn_eq
code: @[simp]
protected theorem liftOn_eq {φ} (p : Set ℕ) (f : Set ℕ → φ)
    (h : ∀ p q, ManyOneEquiv p q → f p = f q) : (of p).liftOn f h = f p 
goal: (ManyOneDegree.of p).liftOn f h = f p

full_name: ManyOneDegree.liftOn₂
code: /-- Lifts a binary function on sets of natural numbers to many-one degrees.
-/
@[reducible, simp] -- @[elab_as_elim] -- Porting note: unexpected eliminator resulting type
protected def liftOn₂ {φ} (d₁ d₂ : ManyOneDegree) (f : Set ℕ → Set ℕ → φ)
    (h : ∀ p₁ p₂ q₁ q₂, ManyOneEquiv p₁ p₂ → ManyOneEquiv q₁ q₂ → f p₁ q₁ = f p₂ q₂) : φ 
goal: φ

full_name: ManyOneDegree.liftOn₂_eq
code: @[simp]
protected theorem liftOn₂_eq {φ} (p q : Set ℕ) (f : Set ℕ → Set ℕ → φ)
    (h : ∀ p₁ p₂ q₁ q₂, ManyOneEquiv p₁ p₂ → ManyOneEquiv q₁ q₂ → f p₁ q₁ = f p₂ q₂) :
    (of p).liftOn₂ (of q) f h = f p q 
goal: (ManyOneDegree.of p).liftOn₂ (ManyOneDegree.of q) f h = f p q

full_name: ManyOneDegree.of_eq_of
code: @[simp]
theorem of_eq_of {p : α → Prop} {q : β → Prop} : of p = of q ↔ ManyOneEquiv p q 
goal: ManyOneDegree.of p = ManyOneDegree.of q ↔ ManyOneEquiv p q

full_name: ManyOneDegree.instInhabited
code: instance instInhabited : Inhabited ManyOneDegree 
goal: Inhabited ManyOneDegree

full_name: ManyOneDegree.instLE
code: /-- For many-one degrees `d₁` and `d₂`, `d₁ ≤ d₂` if the sets in `d₁` are many-one reducible to the
sets in `d₂`.
-/
instance instLE : LE ManyOneDegree 
goal: LE ManyOneDegree

full_name: ManyOneDegree.of_le_of
code: @[simp]
theorem of_le_of {p : α → Prop} {q : β → Prop} : of p ≤ of q ↔ p ≤₀ q 
goal: ManyOneDegree.of p ≤ ManyOneDegree.of q ↔ p ≤₀ q

full_name: _private.Mathlib.Computability.Reduce.0.ManyOneDegree.le_refl
code: private theorem le_refl (d : ManyOneDegree) : d ≤ d 
goal: d ≤ d

full_name: _private.Mathlib.Computability.Reduce.0.ManyOneDegree.le_antisymm
code: private theorem le_antisymm {d₁ d₂ : ManyOneDegree} : d₁ ≤ d₂ → d₂ ≤ d₁ → d₁ = d₂ 
goal: d₁ ≤ d₂ → d₂ ≤ d₁ → d₁ = d₂

full_name: _private.Mathlib.Computability.Reduce.0.ManyOneDegree.le_trans
code: private theorem le_trans {d₁ d₂ d₃ : ManyOneDegree} : d₁ ≤ d₂ → d₂ ≤ d₃ → d₁ ≤ d₃ 
goal: d₁ ≤ d₂ → d₂ ≤ d₃ → d₁ ≤ d₃

full_name: ManyOneDegree.instPartialOrder
code: instance instPartialOrder : PartialOrder ManyOneDegree 
goal: PartialOrder ManyOneDegree

full_name: ManyOneDegree.instAdd
code: /-- The join of two degrees, induced by the disjoint union of two underlying sets. -/
instance instAdd : Add ManyOneDegree 
goal: Add ManyOneDegree

full_name: ManyOneDegree.add_of
code: @[simp]
theorem add_of (p : Set α) (q : Set β) : of (p ⊕' q) = of p + of q 
goal: ManyOneDegree.of (p ⊕' q) = ManyOneDegree.of p + ManyOneDegree.of q

full_name: ManyOneDegree.add_le
code: @[simp]
protected theorem add_le {d₁ d₂ d₃ : ManyOneDegree} : d₁ + d₂ ≤ d₃ ↔ d₁ ≤ d₃ ∧ d₂ ≤ d₃ 
goal: d₁ + d₂ ≤ d₃ ↔ d₁ ≤ d₃ ∧ d₂ ≤ d₃

full_name: ManyOneDegree.le_add_left
code: @[simp]
protected theorem le_add_left (d₁ d₂ : ManyOneDegree) : d₁ ≤ d₁ + d₂ 
goal: d₁ ≤ d₁ + d₂

full_name: ManyOneDegree.le_add_right
code: @[simp]
protected theorem le_add_right (d₁ d₂ : ManyOneDegree) : d₂ ≤ d₁ + d₂ 
goal: d₂ ≤ d₁ + d₂

full_name: ManyOneDegree.instSemilatticeSup
code: instance instSemilatticeSup : SemilatticeSup ManyOneDegree 
goal: SemilatticeSup ManyOneDegree