SAT reduces to 3SAT by an ordered FO reduction #
The classical clause-splitting reduction, as an ordered first-order
reduction – DescriptiveComplexity.sat_ordered_fo_reduction_threeSat : SAT ≤ᶠᵒ[≤] ThreeSAT. Every clause of the input CNF is split along the linear order of
its literal occurrences (DescriptiveComplexity.OccurrenceOrder) into a chain of
clauses of width at most three, linked by fresh variables.
Concretely, the interpretation (DescriptiveComplexity.SatToThreeSat.satToThreeSat,
tags SplitTag, dimension 2) produces, for each occurrence (x, s) of a
clause c:
- a linking variable
(.link s, (c, x)), intended to mean “no occurrence ofcstrictly before(x, s)is true”; - a clause piece
(.piece s, (c, x))containing the literal(x, s)itself (on the variable copy(.var, (x, x))), the linking variable of the successor occurrence positively (if any), and its own linking variable negatively (if the occurrence is not the first): at most three literals.
For a clause with occurrences ℓ₁ < ⋯ < ℓₖ, this yields the usual chain
(ℓ₁ ∨ y₂), (¬y₂ ∨ ℓ₂ ∨ y₃), …, (¬yₖ ∨ ℓₖ). Empty input clauses are copied
as empty clauses (.empty, (c, c)), keeping the output unsatisfiable. All
other tuples are junk: they are neither clauses nor occur in any clause.
The two halves of correctness are SatToThreeSat.widthAtMostThree_map (the
output always satisfies the width promise – each piece has at most three
literals, by uniqueness of the successor occurrence) and
SatToThreeSat.satisfiable_iff_map (satisfiability is preserved, by the
usual chain argument, threaded along the occurrence order).
Tags for the clause-splitting interpretation of 3SAT instances in ordered CNF instances.
- var : SplitTag
(.var, (x, x))is the copy of the propositional variablex. - link
(s : Bool)
: SplitTag
(.link s, (c, x))is the fresh linking variable of the occurrence(x, s)of the clausec. - piece
(s : Bool)
: SplitTag
(.piece s, (c, x))is the clause piece of the occurrence(x, s)of the clausec. - empty : SplitTag
(.empty, (c, c))is the copy of the empty clausec.
Instances For
Dependency graph
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq DescriptiveComplexity.SatToThreeSat.SplitTag.var DescriptiveComplexity.SatToThreeSat.SplitTag.var = isTrue ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq DescriptiveComplexity.SatToThreeSat.SplitTag.var (DescriptiveComplexity.SatToThreeSat.SplitTag.link s) = isFalse ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq DescriptiveComplexity.SatToThreeSat.SplitTag.var (DescriptiveComplexity.SatToThreeSat.SplitTag.piece s) = isFalse ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq (DescriptiveComplexity.SatToThreeSat.SplitTag.link s) DescriptiveComplexity.SatToThreeSat.SplitTag.var = isFalse ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq (DescriptiveComplexity.SatToThreeSat.SplitTag.link s) (DescriptiveComplexity.SatToThreeSat.SplitTag.piece s_1) = isFalse ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq (DescriptiveComplexity.SatToThreeSat.SplitTag.link s) DescriptiveComplexity.SatToThreeSat.SplitTag.empty = isFalse ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq (DescriptiveComplexity.SatToThreeSat.SplitTag.piece s) DescriptiveComplexity.SatToThreeSat.SplitTag.var = isFalse ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq (DescriptiveComplexity.SatToThreeSat.SplitTag.piece s) (DescriptiveComplexity.SatToThreeSat.SplitTag.link s_1) = isFalse ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq (DescriptiveComplexity.SatToThreeSat.SplitTag.piece s) DescriptiveComplexity.SatToThreeSat.SplitTag.empty = isFalse ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq DescriptiveComplexity.SatToThreeSat.SplitTag.empty (DescriptiveComplexity.SatToThreeSat.SplitTag.link s) = isFalse ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq DescriptiveComplexity.SatToThreeSat.SplitTag.empty (DescriptiveComplexity.SatToThreeSat.SplitTag.piece s) = isFalse ⋯
- DescriptiveComplexity.SatToThreeSat.instDecidableEqSplitTag.decEq DescriptiveComplexity.SatToThreeSat.SplitTag.empty DescriptiveComplexity.SatToThreeSat.SplitTag.empty = isTrue ⋯
Instances For
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Defining formula for satIsClause: clause pieces sit on occurrences,
empty-clause copies on diagonal pairs carrying an empty clause.
Equations
- DescriptiveComplexity.SatToThreeSat.isClauseF (DescriptiveComplexity.SatToThreeSat.SplitTag.piece s) = DescriptiveComplexity.SatOcc.occF s (0, 0) (0, 1)
- DescriptiveComplexity.SatToThreeSat.isClauseF DescriptiveComplexity.SatToThreeSat.SplitTag.empty = DescriptiveComplexity.SatOcc.eqF (0, 0) (0, 1) ⊓ DescriptiveComplexity.SatOcc.emptyClF (0, 0)
- DescriptiveComplexity.SatToThreeSat.isClauseF x✝ = ⊥
Instances For
Dependency graph
Defining formula for satPosIn: the piece of a positive occurrence
contains its literal positively, and every piece contains the linking
variable of the successor occurrence (if any) positively.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.SatToThreeSat.posInF x✝¹ x✝ = ⊥
Instances For
Dependency graph
Defining formula for satNegIn: the piece of a negative occurrence
contains its literal negatively, and the piece of a non-first occurrence
contains its own linking variable negatively.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.SatToThreeSat.negInF x✝¹ x✝ = ⊥
Instances For
Dependency graph
The first-order interpretation producing, from an ordered CNF structure, its width-three split.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
Characterizations of the interpreted relations #
Dependency graph
Dependency graph
Dependency graph
The width bound #
The interpreted structure always satisfies the width promise of 3SAT:
every clause piece has at most three literal occurrences (its own literal, the
successor's linking variable – unique by succOcc_right_unique – and its own
linking variable), and empty-clause copies have none.
Dependency graph
Preservation of satisfiability #
The assignment of the interpreted structure induced by an assignment of
the input: variable copies follow ν, and the linking variable of an
occurrence states that no earlier occurrence of its clause is true.
Equations
- DescriptiveComplexity.SatToThreeSat.splitAssign ν (DescriptiveComplexity.SatToThreeSat.SplitTag.var, w) = ν (w 0)
- DescriptiveComplexity.SatToThreeSat.splitAssign ν (DescriptiveComplexity.SatToThreeSat.SplitTag.link s, w) = ¬DescriptiveComplexity.SatOcc.PrefixOrStrict ν (w 0) (w 1) s
- DescriptiveComplexity.SatToThreeSat.splitAssign ν x✝ = False
Instances For
Dependency graph
The chain argument of the reduction, isolated in the form its
not-all-equal variant reuses (DescriptiveComplexity.NaeSatToNaeThreeSat): if an
assignment of the split gives every output clause a true literal, then, read on
the variable copies, it gives every clause of the input a true literal.
Dependency graph
Correctness of the reduction, satisfiability half: an ordered CNF structure is satisfiable iff its width-three split is.
Dependency graph
Correctness of the reduction: an ordered CNF structure is satisfiable iff its width-three split is a yes-instance of 3SAT.
Dependency graph
SAT FO-reduces to 3SAT on ordered structures. The clause-splitting
interpretation SatToThreeSat.satToThreeSat, over the ordered expansion of
the language of CNF instances, maps a finite CNF structure to a yes-instance
of 3SAT iff it is satisfiable. Together with threeSat_fo_reduction_sat, SAT
and 3SAT are FO-interreducible.
Equations
- One or more equations did not get rendered due to their size.