結論
先に結論から。
リテラル に対して、以下の条件 A, B, C は同値である。
- A: のうち、True であるのは 1 個以下である
- B:任意の () に対して、節 を充足する
- C:新たなリテラル の値を適切に定めたとき、以下をすべて充足する
- 1:節 ()
- 2:節 ()
- 3:節 ()
背景
リテラル のうち、True であるのは高々 1 個であるという条件を、2-SAT で記述することを考える。
なお、この条件は、 を 0-1 変数とみなしたときに、 tex: X_{0} + X_{1} + \dots + X_{N-1} \le 1] とも言い換えられる。
さて、上述の条件は、各 () について、節 をすべて追加することで表現できる。しかし、これでは節の個数が となって計算量的に厳しいことがある。実は新たな変数を用意することで、節の個数を にできる。
累積 OR を表すリテラルを用意
リテラル に対して、次のような累積 OR を表すリテラル を用意する。
このとき、次のことが言える (再掲)。
リテラル に対して、以下の条件 A, B, C は同値である。
- A: のうち、True であるのは 1 個以下である
- B:任意の () に対して、節 を充足する
- C:新たなリテラル の値を適切に定めたとき、以下をすべて充足する
- 1:節 ()
- 2:節 ()
- 3:節 ()
C について、2 番目は「 は、False, False, ..., False, True, True, ..., True の形になること」を表している。
1 番目は、2 番目と組み合わせることで「ある に対して が True であるとき、 も連鎖的に True とあること」を表している。
3 番目は、1 番目・2 番目と組み合わせることで「ある に対して が True であるとき、 も True であり、それに伴い は False となること」を表している。
ちゃんと証明
A ⇒ C
A を満たすとき、リテラル のうち True であるものは高々 1 個である。
リテラル がすべて False であるとき、 をすべて False にすることで、条件 B を満たす。
リテラル のみが True で、他はすべて False であるとき、 を False として を True とすることで、条件 B を満たす。
C ⇒ A
リテラル がすべて False であるとき、節 を充足するためには、リテラル がすべて False である必要がある。これは条件 A を満たす。
リテラル が True であるような最小の をとってくると、 は False であり、 は True である。このとき、節 と節 をすべて充足するためには、 = True として他はすべて False とする必要がある。これは条件 A を満たす。