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
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
The three classes #
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
The triples #
From a matching to an assignment #
From an assignment to a matching #
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.