3-dimensional matching is NP-hard #
The reduction is Karp's, from SATISFIABILITY, with its three families of
triples read off the occurrences of the input formula. Write (c, s) for a
signed occurrence – the clause c contains the literal (x, s) – and let a
tip be one of the two X-elements tip(x, c, s, σ) attached to it.
The truth-setting gadget. For each occurrence of a variable
xthere is aY-elementa(x, c, s)and aZ-elementb(x, c, s), and two triples(tip(x, c, s, true), a(x, c, s), b(x, c, s)) (tip(x, c, s, false), a(x, c', t), b(x, c, s)) (c', t) = next(c, s)where
nextruns cyclically through the occurrences ofx(DescriptiveComplexity.SatOcc.VarNext). Covering everybpicks one triple per occurrence, and covering everyathen forces the choice to be the same all around the cycle: the gadget is a truth value, and it frees the tips of one side.The clause gadget. Each clause
chas aY-element and aZ-element of its own, coverable only by a triple(tip(x, c, s, !s), …). That tip is free exactly when the literal(x, s)is true, so covering the clause pair is satisfying the clause.Garbage collection. The tips left over have to be covered too, by triples pairing any tip with a private
Y/Zpair. There must be exactly as many such pairs as there are leftover tips, and that number is#occurrences − #clauses: the pairs are therefore indexed by the occurrences that are not the first of their clause (DescriptiveComplexity.SatOcc.Chained), the same counting trick the reductions to Partition and to job sequencing use for their slack items.
Nothing here bounds the width of a clause, so the source is SAT itself; an empty clause leaves its two elements uncoverable, which is the right answer.
The tags #
Tags of the reduction: the two tips of an occurrence, the two elements of its truth-setting gadget, the two elements of a clause, and the two elements of a garbage pair.
- tip
(s σ : Bool)
: TTag
The
σ-tip of the occurrence(c, s)ofx; its tuple is(x, c). - av
(s : Bool)
: TTag
The
Y-element of the occurrence(c, s)ofx; its tuple is(x, c). - bv
(s : Bool)
: TTag
The
Z-element of the occurrence(c, s)ofx; its tuple is(x, c). - cy : TTag
The
Y-element of the clausec; its tuple is(c, ⊥). - cz : TTag
The
Z-element of the clausec; its tuple is(c, ⊥). - gy
(s : Bool)
: TTag
The
Y-element of the garbage pair of a non-first occurrence(x, s)ofc; its tuple is(x, c). - gz
(s : Bool)
: TTag
The
Z-element of that garbage pair; its tuple is(x, c).
Instances For
Dependency graph
Dependency graph
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.tip s σ) (DescriptiveComplexity.TDMRed.TTag.av s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.tip s σ) (DescriptiveComplexity.TDMRed.TTag.bv s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.tip s σ) DescriptiveComplexity.TDMRed.TTag.cy = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.tip s σ) DescriptiveComplexity.TDMRed.TTag.cz = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.tip s σ) (DescriptiveComplexity.TDMRed.TTag.gy s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.tip s σ) (DescriptiveComplexity.TDMRed.TTag.gz s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.av s) (DescriptiveComplexity.TDMRed.TTag.tip s_1 σ) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.av a) (DescriptiveComplexity.TDMRed.TTag.av b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.av s) (DescriptiveComplexity.TDMRed.TTag.bv s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.av s) DescriptiveComplexity.TDMRed.TTag.cy = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.av s) DescriptiveComplexity.TDMRed.TTag.cz = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.av s) (DescriptiveComplexity.TDMRed.TTag.gy s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.av s) (DescriptiveComplexity.TDMRed.TTag.gz s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.bv s) (DescriptiveComplexity.TDMRed.TTag.tip s_1 σ) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.bv s) (DescriptiveComplexity.TDMRed.TTag.av s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.bv a) (DescriptiveComplexity.TDMRed.TTag.bv b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.bv s) DescriptiveComplexity.TDMRed.TTag.cy = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.bv s) DescriptiveComplexity.TDMRed.TTag.cz = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.bv s) (DescriptiveComplexity.TDMRed.TTag.gy s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.bv s) (DescriptiveComplexity.TDMRed.TTag.gz s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cy (DescriptiveComplexity.TDMRed.TTag.tip s σ) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cy (DescriptiveComplexity.TDMRed.TTag.av s) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cy (DescriptiveComplexity.TDMRed.TTag.bv s) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cy DescriptiveComplexity.TDMRed.TTag.cy = isTrue ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cy (DescriptiveComplexity.TDMRed.TTag.gy s) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cy (DescriptiveComplexity.TDMRed.TTag.gz s) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cz (DescriptiveComplexity.TDMRed.TTag.tip s σ) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cz (DescriptiveComplexity.TDMRed.TTag.av s) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cz (DescriptiveComplexity.TDMRed.TTag.bv s) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cz DescriptiveComplexity.TDMRed.TTag.cz = isTrue ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cz (DescriptiveComplexity.TDMRed.TTag.gy s) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq DescriptiveComplexity.TDMRed.TTag.cz (DescriptiveComplexity.TDMRed.TTag.gz s) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gy s) (DescriptiveComplexity.TDMRed.TTag.tip s_1 σ) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gy s) (DescriptiveComplexity.TDMRed.TTag.av s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gy s) (DescriptiveComplexity.TDMRed.TTag.bv s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gy s) DescriptiveComplexity.TDMRed.TTag.cy = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gy s) DescriptiveComplexity.TDMRed.TTag.cz = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gy a) (DescriptiveComplexity.TDMRed.TTag.gy b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gy s) (DescriptiveComplexity.TDMRed.TTag.gz s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gz s) (DescriptiveComplexity.TDMRed.TTag.tip s_1 σ) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gz s) (DescriptiveComplexity.TDMRed.TTag.av s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gz s) (DescriptiveComplexity.TDMRed.TTag.bv s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gz s) DescriptiveComplexity.TDMRed.TTag.cy = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gz s) DescriptiveComplexity.TDMRed.TTag.cz = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gz s) (DescriptiveComplexity.TDMRed.TTag.gy s_1) = isFalse ⋯
- DescriptiveComplexity.TDMRed.instDecidableEqTTag.decEq (DescriptiveComplexity.TDMRed.TTag.gz a) (DescriptiveComplexity.TDMRed.TTag.gz b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
Instances For
Dependency graph
Equations
- One or more equations did not get rendered due to their size.
Dependency graph
Dependency graph
The interpretation #
A minimum of the order, as a formula over the ordered expansion of the vocabulary of CNF instances.
Equations
Instances For
Dependency graph
Dependency graph
Defining formula for the first class: the tips of the occurrences.
Equations
Instances For
Dependency graph
Defining formula for the second class: one element per occurrence, per clause and per non-first occurrence.
Equations
- DescriptiveComplexity.TDMRed.yElF (DescriptiveComplexity.TDMRed.TTag.av s) = DescriptiveComplexity.SatOcc.occF s (0, 1) (0, 0)
- DescriptiveComplexity.TDMRed.yElF DescriptiveComplexity.TDMRed.TTag.cy = DescriptiveComplexity.SatOcc.clF (0, 0) ⊓ DescriptiveComplexity.TDMRed.minF (0, 1)
- DescriptiveComplexity.TDMRed.yElF (DescriptiveComplexity.TDMRed.TTag.gy s) = DescriptiveComplexity.SatOcc.chainedF s (0, 1) (0, 0)
- DescriptiveComplexity.TDMRed.yElF x✝ = ⊥
Instances For
Dependency graph
Defining formula for the third class, mirroring the second.
Equations
- DescriptiveComplexity.TDMRed.zElF (DescriptiveComplexity.TDMRed.TTag.bv s) = DescriptiveComplexity.SatOcc.occF s (0, 1) (0, 0)
- DescriptiveComplexity.TDMRed.zElF DescriptiveComplexity.TDMRed.TTag.cz = DescriptiveComplexity.SatOcc.clF (0, 0) ⊓ DescriptiveComplexity.TDMRed.minF (0, 1)
- DescriptiveComplexity.TDMRed.zElF (DescriptiveComplexity.TDMRed.TTag.gz s) = DescriptiveComplexity.SatOcc.chainedF s (0, 1) (0, 0)
- DescriptiveComplexity.TDMRed.zElF x✝ = ⊥
Instances For
Dependency graph
Defining formula for the triples: the two of the truth-setting gadget of each occurrence, one per occurrence of a clause, and one per tip and garbage pair.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.TDMRed.tripF x✝² x✝¹ x✝ = ⊥
Instances For
Dependency graph
The interpretation of a triple system in a CNF structure.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
The points of the interpreted structure #
The point of tag t over the pair w.
Equations
- DescriptiveComplexity.TDMRed.tPt t w = (t, w)
Instances For
Dependency graph
Dependency graph
Dependency graph
Two 2-tuples with the same coordinates are equal.
Dependency graph
The σ-tip of the occurrence (c, s) of x.
Equations
Instances For
Dependency graph
The second-class element of the occurrence (c, s) of x.
Equations
Instances For
Dependency graph
The third-class element of the occurrence (c, s) of x.
Equations
Instances For
Dependency graph
The second-class element of the clause c.
Equations
Instances For
Dependency graph
The third-class element of the clause c.
Equations
Instances For
Dependency graph
The second-class element of the garbage pair of the occurrence (x, s)
of c.
Equations
Instances For
Dependency graph
The third-class element of that garbage pair.
Equations
Instances For
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
The three classes #
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Every element of the first class is a tip.
Dependency graph
Every element of the second class is one of the three kinds.
Dependency graph
Every element of the third class is one of the three kinds.
Dependency graph
The triples #
The triple of the truth-setting gadget that frees the false-tip.
Dependency graph
The triple of the truth-setting gadget that frees the true-tip: it
carries the Y-element of the next occurrence of the variable.
Dependency graph
The triple of a clause, hanging on the tip of one of its occurrences.
Dependency graph
A garbage triple: any tip together with any garbage pair.
Dependency graph
What can cover a b-element: only the two triples of the
truth-setting gadget of its own occurrence.
Dependency graph
What can cover an a-element: the gadget triple of its own
occurrence, or the one of the occurrence before it.
Dependency graph
What can cover the Y-element of a clause: only a triple hanging on
the tip of one of its occurrences.
Dependency graph
From a matching to an assignment #
The truth-setting gadget of x uses, at the occurrence (c, s), the
triple that frees the false-tip.
Equations
- DescriptiveComplexity.TDMRed.WheelTrue M x c s = M (DescriptiveComplexity.TDMRed.tTip s true x c) (DescriptiveComplexity.TDMRed.tAv s x c) (DescriptiveComplexity.TDMRed.tBv s x c)
Instances For
Dependency graph
One triple per occurrence: the gadget of x either frees the
false-tip of (c, s) or the true one.
Dependency graph
The gadget is consistent: neighbouring occurrences of a variable make the same choice.
Dependency graph
The gadget is a truth value: all the occurrences of a variable make the same choice, since the walk closes into a cycle.
Dependency graph
The assignment a matching defines: a variable is true when its gadget
frees the false-tips.
Equations
- DescriptiveComplexity.TDMRed.matchAssign M x = ∃ (c : A) (s : Bool), DescriptiveComplexity.SatOcc.OccIn c x s ∧ DescriptiveComplexity.TDMRed.WheelTrue M x c s
Instances For
Dependency graph
Dependency graph
A matching satisfies every clause: covering the pair of a clause takes the tip of one of its occurrences, and that tip is free exactly when the literal is true.
Dependency graph
From an assignment to a matching #
Where the garbage pair of an occurrence goes: to itself, unless it is the first occurrence of its clause, which is sent to the occurrence the clause gadget consumes. This is the bijection between the tips left over and the garbage pairs.
Instances For
Dependency graph
The matching an assignment defines: the gadget triples of the side the assignment picks, one triple per clause, and a garbage triple for every tip left over.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
The garbage pair an occurrence is sent to is a genuine one: a non-first occurrence of its clause.
Dependency graph
The garbage map is injective on the tips left over.
Dependency graph
Every garbage pair is used: the map is onto the non-first occurrences.
Dependency graph
The construction is a matching: every marked element is covered exactly once.
Dependency graph
Correctness of the reduction #
Correctness: a CNF structure is satisfiable exactly when the interpreted triple system has a matching.
Dependency graph
SAT ordered-FO-reduces to 3-dimensional matching: two tips, a Y and
a Z element per occurrence, a pair per clause, and a garbage pair per
non-first occurrence. The truth-setting gadget of a variable runs cyclically
through its occurrences, so it admits exactly two matchings – the variable's
two truth values – and the pair of a clause can only be covered through the
tip of a true literal.
Equations
- One or more equations did not get rendered due to their size.