3SAT 问题
3SAT 问题基于 SAT 问题添加了一个额外约束,即要求每一个项集合由三个元素组成 ∣Ci∣=3。
实例
布尔变量集合
U={u1,u2,⋯,un},
项集合(也就是多个布尔变量或其取反后的布尔变量构成的集合)
C={C1,C2,⋯,Cm},
其中
Ci={u[i,1],⋯,u[i,ki]}⊆U∪U,Uˉ={uˉ1,⋯,uˉn},∣Ci∣=3
询问 是否存在 U 的真值指派:
U→{F,T}, 满足
i=1⋀m(j=1∑kiu[i,j])=T
该问题首先是 NP 问题,接下来,通过将 SAT 问题归约到 3SAT 问题来证明 3SAT 是 NPC。
归约的核心思路是对 SAT 问题实例中的项集合中的项元素进行变换,使得大小不是 3 的项元素通过某种方式转变为 1个或多个大小为 3 的项元素
NPC 证明
将不是由 3 个布尔变量组成的项被转换为等价的、由 3 个布尔变量组成的等价项,需要分情况讨论。
K=1
C1={z1}
对这种情况,可以在布尔变量集合中增加两个布尔变量 y11,y12,把 C1 变换为 4 个包含三个布尔变量的项(注意四恰好是两个布尔变量的可能性组合数,即构造方法):
{z1,yj(1),yj(2)},{z1,yj(1),yˉj(2)},{z1,yˉj(1),yj(2)},{z1,yˉj(1),yˉj(2)}
k=2
C1={z1,z2}
新增 1 个布尔变量,拆成两项:
{z1,z2,yj(1)},{z1,z2,yˉj(1)}
k=3
保持原样
k=4
C1={z1,z2,z3,z4}
增加一个布尔变量,拆成两项(2-2 分到两个项中):
{z1,z2,yj(1)},{z3,z4,yˉj(1)}
k=5
C1={z1,z2,...,z5}
增加两个布尔变量,拆成3项(上述的5个元素分别分 2,2,1 个到这三项中):
{z1,z2,yj(1)},{z4,z5,yˉj(2)},{z3,yj(2),yˉj(1)}
k>3
发现 k>3 以上的情况可以进行归纳,即新增 k−3 个布尔变量,从头尾各自拆出两个元素和一个新增布尔变量的一种情况分在一起,然后中间的元素每一个和两个新增布尔变量的一种情况分在一起,即
C′[j]={{z1,z2,yj(1)},{yˉj(k−3),zk−1,zk}}∪{{yˉj(i),zi+2,yj(i+1)}∣1⩽i⩽k−4}
通过更具体的证明可得,对于上述的所有情况:
- 存在真值指派使 SAT 项满足<==>则存在真值指派使 3SAT 所有项满足
- 存在真值指派使 3SAT 项满足<==>则存在真值指派使 SAT 所有项满足