Strong reducibility and degrees.
This file defines the notions of many-one reduction and one-one reduction between sets, and shows that the corresponding degrees form a semilattice.
Notations
This file uses the local notation ⊕'
for sum.elim
to denote the disjoint union of two degrees,
and deg
for the many_one_degree.of
a set.
References
- [Robert Soare, Recursively enumerable sets and degrees][soare1987]
Tags
computability, reducibility, reduction
p
is many-one reducible to q
if there is a computable function translating questions about p
to questions about q
.
Equations
- p ≤₀ q = ∃ (f : α → β), computable f ∧ ∀ (a : α), p a ↔ q (f a)
p
is one-one reducible to q
if there is an injective computable function translating questions
about p
to questions about q
.
Equations
- p ≤₁ q = ∃ (f : α → β), computable f ∧ function.injective f ∧ ∀ (a : α), p a ↔ q (f a)
p
and q
are many-one equivalent if each one is many-one reducible to the other.
Equations
- many_one_equiv p q = (p ≤₀ q ∧ q ≤₀ p)
p
and q
are one-one equivalent if each one is one-one reducible to the other.
Equations
- one_one_equiv p q = (p ≤₁ q ∧ q ≤₁ p)
sets up to many-one equivalence
Equations
- many_one_equiv_setoid = {r := many_one_equiv _inst_1, iseqv := _}
a computable bijection
Equations
- e.computable = (computable ⇑e ∧ computable ⇑(e.symm))
A many-one degree is an equivalence class of sets up to many-one equivalence.
Equations
For many-one degrees d₁
and d₂
, d₁ ≤ d₂
if the sets in d₁
are many-one reducible to the
sets in d₂
.
Equations
- many_one_degree.has_le = {le := many_one_degree.le _inst_1}
the many-one degree of a set or predicate
Equations
Given a computable bijection e
from α
to β
, the inverse image from set β
to set α
lifts
to a map on many-one degrees.
Equations
- many_one_degree.comap e he d = quotient.lift_on' d (λ (p : set β), many_one_degree.of (p ∘ ⇑e)) _
the join of two degrees, induced by the disjoint union of two underlying sets
Equations
- d₁.add d₂ = quotient.lift_on₂' d₁ d₂ (λ (a : set α) (b : set β), many_one_degree.of (sum.elim a b)) many_one_degree.add._proof_1
Equations
- degree_add = {add := λ (d₁ d₂ : many_one_degree α), many_one_degree.comap (denumerable.equiv₂ α (α ⊕ α)) degree_add._proof_1 (d₁.add d₂)}
Equations
- many_one_degree.semilattice_sup = {sup := has_add.add degree_add, le := has_le.le many_one_degree.has_le, lt := partial_order.lt._default has_le.le, le_refl := _, le_trans := _, lt_iff_le_not_le := _, le_antisymm := _, le_sup_left := _, le_sup_right := _, sup_le := _}