Promise problems -- definitions #
A promise problem has disjoint yes- and no-instance languages. Inputs outside their union are unconstrained. This module keeps semantic solvers, explicit side-preserving maps, and polynomial-time many-one reductions separate.
Ordinary languages embed as total promise problems with no-instances equal to
the complement. Gap problems should use PromiseProblem directly rather than
arbitrarily assigning the gap region to one side.
A decision promise consisting of disjoint yes- and no-instance languages.
- yesInstances : Language
Inputs on which a solver must answer yes.
- noInstances : Language
Inputs on which a solver must answer no.
- disjoint : Disjoint self.yesInstances self.noInstances
No input receives conflicting promised answers.
Instances For
The set of inputs on which the problem constrains a solver.
Equations
- problem.promise = problem.yesInstances ∪ problem.noInstances
Instances For
A Boolean function solves a promise problem when it gives the required answer on both promised sides. Its behavior outside the promise is arbitrary.
Equations
- problem.SolvedBy decide = ((∀ x ∈ problem.yesInstances, decide x = true) ∧ ∀ x ∈ problem.noInstances, decide x = false)
Instances For
An explicit map preserves both sides of a promise reduction.
Equations
- source.MapReducesVia target f = ((∀ x ∈ source.yesInstances, f x ∈ target.yesInstances) ∧ ∀ x ∈ source.noInstances, f x ∈ target.noInstances)
Instances For
Polynomial-time many-one reduction between promise problems.
Equations
- source.MapReducesPoly target = ∃ f ∈ Complexity.FP, source.MapReducesVia target f
Instances For
Swap the promised yes and no sides.
Equations
- problem.complement = { yesInstances := problem.noInstances, noInstances := problem.yesInstances, disjoint := ⋯ }
Instances For
Regard an ordinary language as a total promise problem.
Equations
- Complexity.PromiseProblem.ofLanguage L = { yesInstances := L, noInstances := Lᶜ, disjoint := ⋯ }
Instances For
Lift a language class to promise problems by total completions. A promise
problem belongs to PromiseClass C when some language in C contains every
yes-instance and no no-instance. Behavior outside the promise is unrestricted.
Equations
- Complexity.PromiseClass C = {problem : Complexity.PromiseProblem | ∃ completion ∈ C, problem.yesInstances ⊆ completion ∧ Disjoint completion problem.noInstances}
Instances For
Promise problems admitting a deterministic polynomial-time completion.
Instances For
Promise problems admitting a nondeterministic polynomial-time completion.
Instances For
Promise problems admitting a coNP completion.
Instances For
A promise problem is hard for a language class when every total language in the class reduces to it by a side-preserving polynomial-time map.
Equations
- Complexity.PromiseHardFor C target = ∀ L ∈ C, (Complexity.PromiseProblem.ofLanguage L).MapReducesPoly target
Instances For
A promise problem is complete for a language class when it belongs to the completion-based promise lift and is hard for every total language in the class.
Equations
- Complexity.PromiseCompleteFor C target = (target ∈ Complexity.PromiseClass C ∧ Complexity.PromiseHardFor C target)
Instances For
Polynomial-time side-preserving NP-hardness for a promise target.
Equations
- Complexity.PromiseNPHard target = Complexity.PromiseHardFor Complexity.NP target