#SAT reduces parsimoniously to #1-in-SAT #
The reduction of 3SAT to 1-in-SAT in
DescriptiveComplexity.Problems.OneInSat.Reduction uses the classical gadget, which
gives some satisfying assignments two extensions: it preserves satisfiability,
not the number of solutions. This file reduces #SAT to #1-in-SAT directly and
parsimoniously (DescriptiveComplexity.sharpSat_ordered_parsimonious_sharpOneInSat),
so #1-in-SAT is parsimoniously #P-complete
(DescriptiveComplexity.sharpOneInSat_sharpP_parsimoniousComplete).
As in DescriptiveComplexity.Problems.ThreeSat.CountingFromSat, each occurrence
(x, s) of a clause c has a prefix variable z, the truth of the
disjunction of the occurrences of c up to it
(DescriptiveComplexity.OccurrencePrefix). What changes is how z ↔ z' ∨ ℓ is said
with exactly-one clauses, z' being the prefix variable of the preceding
occurrence and ℓ the literal: three more variables name the cases
z' ∧ ℓ, z' ∧ ¬ℓ and ¬z' ∧ ℓ, and three clauses,
{¬z', g₁₁, g₁₀},{¬ℓ, g₁₁, g₀₁}and{¬z, g₁₁, g₁₀, g₀₁},
each with exactly one true literal, force them and z. The first occurrence
of a clause has the clause {¬z, ℓ}, and the last one the unit clause {z}.
The three clauses of the gate of an occurrence.
Instances For
Dependency graph
Dependency graph
Equations
- One or more equations did not get rendered due to their size.
Dependency graph
The three case variables of the gate of an occurrence.
Instances For
Dependency graph
Dependency graph
Equations
- One or more equations did not get rendered due to their size.
Dependency graph
Which case variables a gate clause contains.
Equations
- DescriptiveComplexity.SharpSatToOneIn.gateIn DescriptiveComplexity.SharpSatToOneIn.GK.a DescriptiveComplexity.SharpSatToOneIn.GI.tt = true
- DescriptiveComplexity.SharpSatToOneIn.gateIn DescriptiveComplexity.SharpSatToOneIn.GK.a DescriptiveComplexity.SharpSatToOneIn.GI.tf = true
- DescriptiveComplexity.SharpSatToOneIn.gateIn DescriptiveComplexity.SharpSatToOneIn.GK.b DescriptiveComplexity.SharpSatToOneIn.GI.tt = true
- DescriptiveComplexity.SharpSatToOneIn.gateIn DescriptiveComplexity.SharpSatToOneIn.GK.b DescriptiveComplexity.SharpSatToOneIn.GI.ft = true
- DescriptiveComplexity.SharpSatToOneIn.gateIn DescriptiveComplexity.SharpSatToOneIn.GK.c x✝ = true
- DescriptiveComplexity.SharpSatToOneIn.gateIn x✝¹ x✝ = false
Instances For
Dependency graph
Tags of the interpretation.
- var : OTag
(.var, (x, x))is the copy of the propositional variablex. - pre (s : Bool) : OTag
- g
(i : GI)
(s : Bool)
: OTag
A case variable of the gate of an occurrence.
- gk
(k : GK)
(s : Bool)
: OTag
A clause of the gate of an occurrence that has a predecessor.
- kd
(s : Bool)
: OTag
The clause
{¬z, ℓ}of the first occurrence of a clause. - top
(s : Bool)
: OTag
The unit clause
{z}of the last occurrence of a clause. - empty : OTag
(.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.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.var DescriptiveComplexity.SharpSatToOneIn.OTag.var = isTrue ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.var (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.var (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.var (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.var (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.var (DescriptiveComplexity.SharpSatToOneIn.OTag.top s) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s) DescriptiveComplexity.SharpSatToOneIn.OTag.var = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s) (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s) (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s) (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s) (DescriptiveComplexity.SharpSatToOneIn.OTag.top s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s) DescriptiveComplexity.SharpSatToOneIn.OTag.empty = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s) DescriptiveComplexity.SharpSatToOneIn.OTag.var = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s) (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s) (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s) (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s) (DescriptiveComplexity.SharpSatToOneIn.OTag.top s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s) DescriptiveComplexity.SharpSatToOneIn.OTag.empty = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s) DescriptiveComplexity.SharpSatToOneIn.OTag.var = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s) (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s) (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s) (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s) (DescriptiveComplexity.SharpSatToOneIn.OTag.top s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s) DescriptiveComplexity.SharpSatToOneIn.OTag.empty = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s) DescriptiveComplexity.SharpSatToOneIn.OTag.var = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s) (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s) (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s) (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s) (DescriptiveComplexity.SharpSatToOneIn.OTag.top s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s) DescriptiveComplexity.SharpSatToOneIn.OTag.empty = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.top s) DescriptiveComplexity.SharpSatToOneIn.OTag.var = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.top s) (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.top s) (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.top s) (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.top s) (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s_1) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq (DescriptiveComplexity.SharpSatToOneIn.OTag.top s) DescriptiveComplexity.SharpSatToOneIn.OTag.empty = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.empty (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.empty (DescriptiveComplexity.SharpSatToOneIn.OTag.g i s) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.empty (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.empty (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.empty (DescriptiveComplexity.SharpSatToOneIn.OTag.top s) = isFalse ⋯
- DescriptiveComplexity.SharpSatToOneIn.instDecidableEqOTag.decEq DescriptiveComplexity.SharpSatToOneIn.OTag.empty DescriptiveComplexity.SharpSatToOneIn.OTag.empty = isTrue ⋯
Instances For
Dependency graph
Dependency graph
Equations
- One or more equations did not get rendered due to their size.
Dependency graph
Dependency graph
Defining formula for satIsClause.
Equations
- DescriptiveComplexity.SharpSatToOneIn.isClauseF (DescriptiveComplexity.SharpSatToOneIn.OTag.gk k s) = DescriptiveComplexity.SatOcc.chainedF s (0, 0) (0, 1)
- DescriptiveComplexity.SharpSatToOneIn.isClauseF (DescriptiveComplexity.SharpSatToOneIn.OTag.kd s) = DescriptiveComplexity.SatOcc.minOccF s (0, 0) (0, 1)
- DescriptiveComplexity.SharpSatToOneIn.isClauseF (DescriptiveComplexity.SharpSatToOneIn.OTag.top s) = DescriptiveComplexity.SatOcc.maxOccF s (0, 0) (0, 1)
- DescriptiveComplexity.SharpSatToOneIn.isClauseF DescriptiveComplexity.SharpSatToOneIn.OTag.empty = DescriptiveComplexity.SatOcc.eqF (0, 0) (0, 1) ⊓ DescriptiveComplexity.SatOcc.emptyClF (0, 0)
- DescriptiveComplexity.SharpSatToOneIn.isClauseF x✝ = ⊥
Instances For
Dependency graph
Defining formula for satPosIn.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.SharpSatToOneIn.posInF x✝¹ x✝ = ⊥
Instances For
Dependency graph
Defining formula for satNegIn.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.SharpSatToOneIn.negInF x✝¹ x✝ = ⊥
Instances For
Dependency graph
The parsimonious interpretation of 1-in-SAT instances in ordered CNF instances.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
Characterization of the interpreted relations #
The literals of each clause #
The copy of the variable x.
Equations
- DescriptiveComplexity.SharpSatToOneIn.varP x = (DescriptiveComplexity.SharpSatToOneIn.OTag.var, fun (x_1 : Fin 2) => x)
Instances For
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Exactly-one assignments, read as gate valuations #
A gate valuation of the assignment ν: prefix values Z and case
values G, each forced by ν along the occurrences of every clause, with the
prefix value true at the last occurrence and no empty clause.
At a first occurrence the prefix value is the literal.
- gate (c y : A) (t : Bool) (x : A) (s : Bool) : SatOcc.SuccOcc c y t x s → (G GI.tt c x s ↔ Z c y t ∧ SatOcc.LitTrue ν x s) ∧ (G GI.tf c x s ↔ Z c y t ∧ ¬SatOcc.LitTrue ν x s) ∧ (G GI.ft c x s ↔ ¬Z c y t ∧ SatOcc.LitTrue ν x s) ∧ (Z c x s ↔ Z c y t ∨ SatOcc.LitTrue ν x s)
At an occurrence with a predecessor, the case values name the cases of the previous prefix value and the literal, and the prefix value is their disjunction.
The prefix value at the last occurrence of a clause is true.
No clause is empty.
Instances For
Dependency graph
The assignment read on the variable copies.
Equations
Instances For
Dependency graph
The assignment read on the prefix variables.
Equations
Instances For
Dependency graph
The assignment read on the case variables.
Equations
- DescriptiveComplexity.SharpSatToOneIn.gVal μ i c x s = μ (DescriptiveComplexity.SharpSatToOneIn.gP i s c x)
Instances For
Dependency graph
Dependency graph
Every clause of the interpreted instance has exactly one true literal exactly when the assignment is a gate valuation, read on the variable copies, the prefix variables and the case variables.
Dependency graph
The variables of the interpreted instance #
Exactly-one models of the interpreted instance are models of the input #
The assignment of the interpreted instance determined by an assignment of the input, before its restriction to the variables of the instance.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.SharpSatToOneIn.canon ν (DescriptiveComplexity.SharpSatToOneIn.OTag.var, w) = ν (w 0)
- DescriptiveComplexity.SharpSatToOneIn.canon ν (DescriptiveComplexity.SharpSatToOneIn.OTag.pre s, w) = DescriptiveComplexity.SatOcc.PrefixOr ν (w 0) (w 1) s
- DescriptiveComplexity.SharpSatToOneIn.canon ν x✝ = False
Instances For
Dependency graph
Dependency graph
A satisfying assignment has a gate valuation.
Dependency graph
The exactly-one models of the interpreted instance are the models of the input, bijectively.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
Correctness of the interpretation, for counting: the interpreted instance has as many exactly-one models as the input has models.
Dependency graph
#SAT reduces parsimoniously to #1-in-SAT.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
#1-in-SAT is parsimoniously #P-hard.
Dependency graph
#1-in-SAT is parsimoniously #P-complete.
Registered in the Lax archive as
Lax280166.OneInSATComplete.sharpOneInSat_sharpP_parsimoniousComplete.
Dependency graph
SharpOneInSAT is #P-complete: parsimoniously, hence under subtractive
reductions.