Regular syntax checker for exact 3-CNF encodings #
Exact-3 shape is a regular property of the concrete CNF encoding. This module
gives a finite-state left-to-right scanner for it and proves that the scanner
accepts an encoded CNF exactly when every clause has three literals. The syntax
language deliberately need not reject every malformed word: intersecting it
with CNFSAT.language supplies well-formedness, which keeps this checker small
and makes the intended 3SAT decomposition explicit.
Main results #
ThreeSAT.Syntax.encode_mem_language_iff-- correctness on encoded CNFsThreeSAT.Syntax.language_mem_P-- exact-3 syntax is decidable in linear timeThreeSAT.language_eq_cnfsat_inter_syntax-- semantic decomposition of 3SAT
Parser state after consuming whole two-bit encoding tokens. between k
means that k complete literals have been seen in the current clause.
- between (count : Fin 4) : TokenState
- inLit (count : Fin 4) : TokenState
- invalid : TokenState
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Complexity.SAT.ThreeSAT.Syntax.instDecidableEqTokenState.decEq (Complexity.SAT.ThreeSAT.Syntax.TokenState.between count) (Complexity.SAT.ThreeSAT.Syntax.TokenState.inLit count_1) = isFalse ⋯
- Complexity.SAT.ThreeSAT.Syntax.instDecidableEqTokenState.decEq (Complexity.SAT.ThreeSAT.Syntax.TokenState.between count) Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid = isFalse ⋯
- Complexity.SAT.ThreeSAT.Syntax.instDecidableEqTokenState.decEq (Complexity.SAT.ThreeSAT.Syntax.TokenState.inLit count) (Complexity.SAT.ThreeSAT.Syntax.TokenState.between count_1) = isFalse ⋯
- Complexity.SAT.ThreeSAT.Syntax.instDecidableEqTokenState.decEq (Complexity.SAT.ThreeSAT.Syntax.TokenState.inLit count) Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid = isFalse ⋯
- Complexity.SAT.ThreeSAT.Syntax.instDecidableEqTokenState.decEq Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid (Complexity.SAT.ThreeSAT.Syntax.TokenState.between count) = isFalse ⋯
- Complexity.SAT.ThreeSAT.Syntax.instDecidableEqTokenState.decEq Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid (Complexity.SAT.ThreeSAT.Syntax.TokenState.inLit count) = isFalse ⋯
- Complexity.SAT.ThreeSAT.Syntax.instDecidableEqTokenState.decEq Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid = isTrue ⋯
Instances For
Initial token parser state: between clauses with no current literals.
Equations
Instances For
One transition of the exact-3 grammar at token granularity.
Equations
- One or more equations did not get rendered due to their size.
- Complexity.SAT.ThreeSAT.Syntax.tokenStep Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid x✝ = Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid
- Complexity.SAT.ThreeSAT.Syntax.tokenStep (Complexity.SAT.ThreeSAT.Syntax.TokenState.between count) (Complexity.SAT.EncToken.bit b) = Complexity.SAT.ThreeSAT.Syntax.TokenState.inLit count
- Complexity.SAT.ThreeSAT.Syntax.tokenStep (Complexity.SAT.ThreeSAT.Syntax.TokenState.between count) Complexity.SAT.EncToken.litSep = Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid
- Complexity.SAT.ThreeSAT.Syntax.tokenStep (Complexity.SAT.ThreeSAT.Syntax.TokenState.inLit count) (Complexity.SAT.EncToken.bit true) = Complexity.SAT.ThreeSAT.Syntax.TokenState.inLit count
- Complexity.SAT.ThreeSAT.Syntax.tokenStep (Complexity.SAT.ThreeSAT.Syntax.TokenState.inLit count) (Complexity.SAT.EncToken.bit false) = Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid
- Complexity.SAT.ThreeSAT.Syntax.tokenStep (Complexity.SAT.ThreeSAT.Syntax.TokenState.inLit count) Complexity.SAT.EncToken.clauseSep = Complexity.SAT.ThreeSAT.Syntax.TokenState.invalid
Instances For
Bit-level scanner state. half state b remembers the first bit of the
next two-bit encoding token.
- ready (state : TokenState) : BitState
- half (state : TokenState) (first : Bool) : BitState
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Complexity.SAT.ThreeSAT.Syntax.instDecidableEqBitState.decEq (Complexity.SAT.ThreeSAT.Syntax.BitState.ready state) (Complexity.SAT.ThreeSAT.Syntax.BitState.half state_1 first) = isFalse ⋯
- Complexity.SAT.ThreeSAT.Syntax.instDecidableEqBitState.decEq (Complexity.SAT.ThreeSAT.Syntax.BitState.half state first) (Complexity.SAT.ThreeSAT.Syntax.BitState.ready state_1) = isFalse ⋯
Instances For
Equations
- One or more equations did not get rendered due to their size.
Initial bit-level scanner state.
Equations
Instances For
Decode one of the four two-bit concrete token patterns.
Equations
- Complexity.SAT.ThreeSAT.Syntax.tokenOfBits false false = Complexity.SAT.EncToken.bit false
- Complexity.SAT.ThreeSAT.Syntax.tokenOfBits true true = Complexity.SAT.EncToken.bit true
- Complexity.SAT.ThreeSAT.Syntax.tokenOfBits false true = Complexity.SAT.EncToken.litSep
- Complexity.SAT.ThreeSAT.Syntax.tokenOfBits true false = Complexity.SAT.EncToken.clauseSep
Instances For
One input-bit transition of the exact-3 syntax scanner.
Equations
- One or more equations did not get rendered due to their size.
- Complexity.SAT.ThreeSAT.Syntax.bitStep (Complexity.SAT.ThreeSAT.Syntax.BitState.ready state) x✝ = Complexity.SAT.ThreeSAT.Syntax.BitState.half state x✝
Instances For
The scanner accepts precisely at a token boundary between clauses.
Equations
Instances For
The regular language recognized by the exact-3 syntax scanner.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Concrete zero-work-tape finite-state checker for exact-3 syntax.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The syntax checker decides its regular language in exactly n + 2 steps.
The exact-3 syntax language is decidable in linear time.
3SAT is CNF-SAT intersected with the regular exact-3 syntax language.