The 3-coloring gadget graph of a CNF structure #
Combinatorial core of the reduction from SAT to 3-colorability: the classical
gadget graph associated to a CNF, and the proof that it is 3-colorable iff the
CNF is satisfiable. The first-order definition of this graph (as a tagged
2-dimensional interpretation) is in
DescriptiveComplexity.Problems.ThreeColorability.FromSat; here everything is purely
semantic.
Vertices are tagged pairs (t, a, b) with t : SatTag and a b elements of
the CNF structure:
palT/palF/palB: the palette (“true”/“false”/“base”). All copies of one palette tag form one color class: every copy of one tag is adjacent to every copy of every other tag, so in a proper coloring allpalTcopies share a color, etc. This avoids singling out canonical elements.lit sat(x, x): the literal vertex forxwith signs; adjacent to its complementary literal and to the base palette, so it is colored true-or-false, consistently with the complementary literal.gu s/gv s/go sat(c, x): the OR-gate for the non-first occurrence(x, s)of the clausec: a triangle whose inputsgu,gvare adjacent respectively to the previous prefix node (the literal vertex of the first occurrence, or the previous gate outputgo) and to the literal vertex of(x, s). The gate outputgocan be colored “true” iff some input is; the output of the last gate is forced true by edges topalFandpalB.- a clause whose unique literal is
(x, s)forces its literal directly:lit sat(x, x)is adjacent topalF(as well aspalB); spoilat(c, c): adjacent to all three palette classes whencis an empty clause, making the graph non-3-colorable, as required.
Junk vertices (tuples not matching the shapes above) have no incident edges.
The main result is DescriptiveComplexity.SatToCol.satisfiable_iff_gadColoring.
Tags of the gadget graph.
- palT : SatTag
Palette “true”.
- palF : SatTag
Palette “false”.
- palB : SatTag
Palette “base”.
- lit
(s : Bool)
: SatTag
Literal vertex, at diagonal pairs
(x, x). - gu
(s : Bool)
: SatTag
OR-gate input from the previous prefix node, at pairs
(c, x). - gv
(s : Bool)
: SatTag
OR-gate input from the literal vertex, at pairs
(c, x). - go
(s : Bool)
: SatTag
OR-gate output, at pairs
(c, x). - spoil : SatTag
Spoiler for empty clauses, at diagonal pairs
(c, c).
Instances For
Dependency graph
Dependency graph
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palT DescriptiveComplexity.SatToCol.SatTag.palT = isTrue ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palT (DescriptiveComplexity.SatToCol.SatTag.lit s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palT (DescriptiveComplexity.SatToCol.SatTag.gu s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palT (DescriptiveComplexity.SatToCol.SatTag.gv s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palT (DescriptiveComplexity.SatToCol.SatTag.go s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palF DescriptiveComplexity.SatToCol.SatTag.palF = isTrue ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palF (DescriptiveComplexity.SatToCol.SatTag.lit s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palF (DescriptiveComplexity.SatToCol.SatTag.gu s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palF (DescriptiveComplexity.SatToCol.SatTag.gv s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palF (DescriptiveComplexity.SatToCol.SatTag.go s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palB DescriptiveComplexity.SatToCol.SatTag.palB = isTrue ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palB (DescriptiveComplexity.SatToCol.SatTag.lit s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palB (DescriptiveComplexity.SatToCol.SatTag.gu s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palB (DescriptiveComplexity.SatToCol.SatTag.gv s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.palB (DescriptiveComplexity.SatToCol.SatTag.go s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.lit s) DescriptiveComplexity.SatToCol.SatTag.palT = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.lit s) DescriptiveComplexity.SatToCol.SatTag.palF = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.lit s) DescriptiveComplexity.SatToCol.SatTag.palB = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.lit s) (DescriptiveComplexity.SatToCol.SatTag.gu s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.lit s) (DescriptiveComplexity.SatToCol.SatTag.gv s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.lit s) (DescriptiveComplexity.SatToCol.SatTag.go s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.lit s) DescriptiveComplexity.SatToCol.SatTag.spoil = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gu s) DescriptiveComplexity.SatToCol.SatTag.palT = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gu s) DescriptiveComplexity.SatToCol.SatTag.palF = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gu s) DescriptiveComplexity.SatToCol.SatTag.palB = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gu s) (DescriptiveComplexity.SatToCol.SatTag.lit s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gu s) (DescriptiveComplexity.SatToCol.SatTag.gv s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gu s) (DescriptiveComplexity.SatToCol.SatTag.go s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gu s) DescriptiveComplexity.SatToCol.SatTag.spoil = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gv s) DescriptiveComplexity.SatToCol.SatTag.palT = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gv s) DescriptiveComplexity.SatToCol.SatTag.palF = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gv s) DescriptiveComplexity.SatToCol.SatTag.palB = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gv s) (DescriptiveComplexity.SatToCol.SatTag.lit s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gv s) (DescriptiveComplexity.SatToCol.SatTag.gu s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gv s) (DescriptiveComplexity.SatToCol.SatTag.go s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.gv s) DescriptiveComplexity.SatToCol.SatTag.spoil = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.go s) DescriptiveComplexity.SatToCol.SatTag.palT = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.go s) DescriptiveComplexity.SatToCol.SatTag.palF = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.go s) DescriptiveComplexity.SatToCol.SatTag.palB = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.go s) (DescriptiveComplexity.SatToCol.SatTag.lit s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.go s) (DescriptiveComplexity.SatToCol.SatTag.gu s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.go s) (DescriptiveComplexity.SatToCol.SatTag.gv s_1) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq (DescriptiveComplexity.SatToCol.SatTag.go s) DescriptiveComplexity.SatToCol.SatTag.spoil = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.spoil (DescriptiveComplexity.SatToCol.SatTag.lit s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.spoil (DescriptiveComplexity.SatToCol.SatTag.gu s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.spoil (DescriptiveComplexity.SatToCol.SatTag.gv s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.spoil (DescriptiveComplexity.SatToCol.SatTag.go s) = isFalse ⋯
- DescriptiveComplexity.SatToCol.instDecidableEqSatTag.decEq DescriptiveComplexity.SatToCol.SatTag.spoil DescriptiveComplexity.SatToCol.SatTag.spoil = isTrue ⋯
Instances For
Dependency graph
Dependency graph
Dependency graph
One direction of the edge relation of the gadget graph, in component form:
Core t₁ a₁ b₁ t₂ a₂ b₂ relates the vertex (t₁, (a₁, b₁)) to
(t₂, (a₂, b₂)). The edge relation of the graph is its symmetrization.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.SatToCol.Core DescriptiveComplexity.SatToCol.SatTag.palT x✝³ x✝² DescriptiveComplexity.SatToCol.SatTag.palF x✝¹ x✝ = True
- DescriptiveComplexity.SatToCol.Core DescriptiveComplexity.SatToCol.SatTag.palF x✝³ x✝² DescriptiveComplexity.SatToCol.SatTag.palB x✝¹ x✝ = True
- DescriptiveComplexity.SatToCol.Core DescriptiveComplexity.SatToCol.SatTag.palB x✝³ x✝² DescriptiveComplexity.SatToCol.SatTag.palT x✝¹ x✝ = True
- DescriptiveComplexity.SatToCol.Core (DescriptiveComplexity.SatToCol.SatTag.lit s) x✝³ x✝² (DescriptiveComplexity.SatToCol.SatTag.lit t) x✝¹ x✝ = (t = !s ∧ x✝³ = x✝² ∧ x✝¹ = x✝ ∧ x✝³ = x✝¹)
- DescriptiveComplexity.SatToCol.Core (DescriptiveComplexity.SatToCol.SatTag.lit s) x✝³ x✝² DescriptiveComplexity.SatToCol.SatTag.palB x✝¹ x✝ = (x✝³ = x✝²)
- DescriptiveComplexity.SatToCol.Core (DescriptiveComplexity.SatToCol.SatTag.go s) x✝³ x✝² DescriptiveComplexity.SatToCol.SatTag.palB x✝¹ x✝ = DescriptiveComplexity.SatOcc.Chained x✝³ x✝² s
- DescriptiveComplexity.SatToCol.Core x✝⁵ x✝⁴ x✝³ x✝² x✝¹ x✝ = False
Instances For
Dependency graph
From a satisfying assignment to a proper coloring #
The coloring of the gadget graph induced by an assignment ν:
0 is “true”, 1 is “false”, 2 is “base”.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.SatToCol.gadCol ν DescriptiveComplexity.SatToCol.SatTag.palT x✝¹ x✝ = 0
- DescriptiveComplexity.SatToCol.gadCol ν DescriptiveComplexity.SatToCol.SatTag.palF x✝¹ x✝ = 1
- DescriptiveComplexity.SatToCol.gadCol ν DescriptiveComplexity.SatToCol.SatTag.palB x✝¹ x✝ = 2
- DescriptiveComplexity.SatToCol.gadCol ν (DescriptiveComplexity.SatToCol.SatTag.lit s) x✝¹ x✝ = if DescriptiveComplexity.SatOcc.LitTrue ν x✝¹ s then 0 else 1
- DescriptiveComplexity.SatToCol.gadCol ν (DescriptiveComplexity.SatToCol.SatTag.go s) x✝¹ x✝ = if DescriptiveComplexity.SatOcc.PrefixOr ν x✝¹ x✝ s then 0 else 1
- DescriptiveComplexity.SatToCol.gadCol ν DescriptiveComplexity.SatToCol.SatTag.spoil x✝¹ x✝ = 2
Instances For
Dependency graph
The coloring induced by a satisfying assignment is proper.
Dependency graph
Main combinatorial equivalence #
Combinatorial correctness of the SAT → 3COL gadget: a CNF structure is satisfiable iff its gadget graph admits a proper 3-coloring.