LibraryReExportIsNPComplete
From APIDesign
This page describes a way to convert any wikipedia::3SAT problem to a solution of finding the right configuration from conflicting libraries in a system that can re-export APIs. Thus proving that the later problem is wikipedia::NP-complete.
Contents |
wikipedia::3SAT
The problem of satisfying a logic formula remains NP-complete even if all expressions are written in wikipedia::conjunctive normal form with 3 variables per clause (3-CNF), yielding the 3SAT problem. This means the expression has the form:
where each
is a variable
or a negation of a variable
. Each variable
can appear multiple times in the expression.
Module Dependencies Problem
Let
denote an API.
Let
denote compatible versions of API
.
Let
denote incompatible versions of API
.
Let
denote the fact that version x.y of API A depends on version u.v of API B.
Let
denote the fact that version x.y of API A depends on version u.v of API B and that it re-exports B's elements.
Let Repository
be any set of modules with their various versions and their dependencies on other modules with or without re-export.
Let C be a Configuration in a repository
, if
, where following is satisfied:
- each re-exported dependency is satisfied with some compatible version
- each dependency is satisfied with some compatible version
- Let there be two chains of re-exported dependencies
and
then
- this guarantees that each class has just one, exact meaning for each importer
Module Dependency Problem
Let there be a repository
and a module
. Does there exist a configuration
in the repository
, such that the module
, e.g. the module can be enabled?
Converstion of wikipedia::3SAT to Module Dependencies Problem
Let there be wikipedia::3SAT formula with with variables
as defined above.
Let's create a repository of modules
. For each variable
let's create two modules
and
, which are mutually incompatible and put them into repository
.
For each formula
let's create a module
that will have three compatible versions. Each of them will depend on one variable's module. In case the variable is used with negation, it will depend on version 2.0, otherwise on version 1.0. So for the formula
we will get:
All these modules and dependencies add into repository
Now we will create a module
that depends all formulas:
- ...
and add this module as well as its dependencies into repository
.
Claim: There
(a configuration) of repository
and
there is a solution to the wikipedia::3SAT formula.
Proof
"
": Let's have an evaluation of each variable to either true or false that evaluates the whole wikipedia::3SAT formula to true. Then
It is clear from the definition that each
and
can be in the
just in one version. Now it is important to ensure that each module is present always at least in one version. This is easy for
as its
needs to be true or false, and that means one of
or
will be included. Can there be a
which is not included? Only if
but that would mean the whole or would evaluate to false and as a result also the wikipedia::3SAT formula would evaluate to false. This means that dependencies of
on
modules are satisfied. Are also dependencies of every
satisfied? From all the three versions, there is just one
, the one its
evaluates to true. However
can either be without negation, and as such
depends on
which is included as
is true. Or
contains negation, and as such
depends on
which is included as
is false. qed.