도구스개발

2-SAT 충족 가능성 계산기

「둘 중 하나는 참」인 조건을 여럿 넣으면 참·거짓 배정이 가능한지 판정하고 배정을 하나 찾아 줍니다. 절을 함의 두 개로 바꾸고 강한 연결 요소로 묶어 x와 ¬x가 같은 덩어리인지 보는 방식이며, 찾은 배정은 모든 절에 실제로 대입해 검산합니다.

한 줄에 「a b」처럼 둘 중 하나는 참이어야 하는 조건을 적습니다. 부정은 앞에 -를 붙입니다. 절 60개·변수 20개까지.

변수 3개 · 절 3개

배정이 있습니다

찾은 배정을 모든 절에 실제로 대입해 봤고 전부 참입니다. 절마다 변수가 둘뿐이라 이렇게 선형 시간에 풀립니다.

변수a, b, c
3개
함의 간선6개 (절마다 둘)
배정 검산모든 절이 참

찾은 배정

a = 거짓b = c = 거짓

절마다의 검산

함의로 바꾸면대입 결과
a ∨ b¬a → b, ¬b → a
¬a ∨ ca → c, ¬c → ¬a
¬b ∨ ¬cb → ¬c, c → ¬b

(a ∨ b)는 「a가 거짓이면 b가 참이어야 한다」와 같으므로 절 하나가 화살표 두 개가 됩니다. 변수마다 정점 둘(x와 ¬x)을 두고 이 화살표를 간선으로 놓은 것이 함의 그래프입니다.

리터럴이 속한 덩어리

변수x의 덩어리¬x의 덩어리판정
a01다른 덩어리
b10다른 덩어리
c01다른 덩어리

강한 연결 요소(SCC)로 묶었을 때 x와 ¬x가 같은 덩어리에 있으면 배정이 없습니다. 같은 덩어리라는 것은 서로 오갈 수 있다는 뜻이고, 곧 「x가 참이면 거짓이어야 하고 거짓이면 참이어야 한다」이기 때문입니다. 그런 변수가 하나도 없으면 반드시 배정이 있습니다.

배정은 위상 순서에서 뒤에 오는 쪽을 참으로 둡니다. 덩어리를 정점으로 본 축약 그래프에는 사이클이 없어 위상 정렬이 되는데, x와 ¬x 중 뒤에 오는 쪽을 참으로 두면 모든 함의가 지켜집니다. 화살표는 앞에서 뒤로만 가므로 「참 → 거짓」인 화살표가 생길 수 없기 때문입니다.
일반 SAT는 NP-완전인데 절마다 변수가 둘이면 선형 시간에 풀립니다. 셋만 되어도(3-SAT) 이 방법이 통하지 않습니다 — (a ∨ b ∨ c)는 「하나가 거짓이면 나머지 둘 중 하나」가 되어 함의가 아니라 또 다른 논리합이 되기 때문입니다. 둘일 때만 절이 «반드시 따라오는 것»으로 바뀝니다.
이 도구는 정리를 믿고 넘어가지 않습니다. 배정을 찾았으면 모든 절에 실제로 대입해 참인지 확인하고 그 결과를 위 표에 그대로 보입니다. 판정이 맞아도 배정을 잘못 뽑을 수 있기 때문입니다. 덩어리를 나누는 데는 dev/tarjan-scc의 구현을 그대로 씁니다.

사용 방법

  1. 1한 줄에 절 하나씩 「a b」 형식으로 적습니다. 둘 중 하나는 참이어야 한다는 뜻입니다.
  2. 2부정은 앞에 -를 붙입니다. -a는 「a가 거짓」입니다.
  3. 3배정이 있는지 확인합니다.
  4. 4「절마다의 검산」에서 찾은 배정이 모든 절을 참으로 만드는지 봅니다.
  5. 5없다고 나오면 어느 변수가 자기 부정과 같은 덩어리인지 확인합니다.

자주 묻는 질문

「둘 중 하나는 참」인 조건이 여럿 있을 때 모두를 만족하는 참·거짓 배정이 있는지 묻는 문제입니다. (a ∨ b) ∧ (¬a ∨ c)처럼 절마다 변수가 정확히 둘인 경우를 말합니다.

절마다 변수가 둘이면 절이 함의로 바뀌기 때문입니다. (a ∨ b)는 「a가 거짓이면 b가 참이어야 한다」와 같아, 절 하나가 화살표 두 개가 됩니다. 셋만 되어도(3-SAT) 이 변환이 통하지 않습니다 — (a ∨ b ∨ c)는 하나가 거짓일 때 나머지 둘 중 하나라는 또 다른 논리합이 되기 때문입니다.

함의 그래프를 강한 연결 요소로 묶었을 때 x와 ¬x가 같은 덩어리에 있으면 배정이 없습니다. 같은 덩어리라는 것은 서로 오갈 수 있다는 뜻이고, 곧 「x가 참이면 거짓이어야 하고 거짓이면 참이어야 한다」이기 때문입니다. 그런 변수가 하나도 없으면 반드시 배정이 있습니다.

덩어리를 정점으로 본 축약 그래프에는 사이클이 없어 위상 정렬이 됩니다. x와 ¬x 중 위상 순서에서 뒤에 오는 쪽을 참으로 두면 모든 함의가 지켜집니다. 화살표가 앞에서 뒤로만 가므로 「참 → 거짓」인 화살표가 생길 수 없기 때문입니다.

「A 아니면 B는 반드시」 꼴의 제약이 잔뜩 있는 배치 문제에 쓰입니다. 좌석 배정, 지도에 이름표를 겹치지 않게 놓기, 회로에서 두 값 중 하나를 고르기 같은 문제가 2-SAT으로 바뀝니다.

있습니다. 이 도구는 그중 하나를 찾아 줍니다. 위상 순서에서 뒤에 오는 쪽을 참으로 두는 규칙을 쓰므로 언제나 같은 답이 나오지만, 다른 배정도 얼마든지 있을 수 있습니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 정답지는 모든 배정을 만들어 보는 전수 탐색입니다. 변수가 n개면 2ⁿ가지뿐이라 작은 판에서는 전부 훑을 수 있고, 함의 그래프도 SCC도 쓰지 않는 방법이라 서로를 검산합니다. 무작위 절 500벌에서 판정이 같은 것을 확인했으며, 풀리는 판과 안 풀리는 판이 각각 50벌 넘게 나오는지도 함께 검사해 한쪽만 보고 지나가지 않게 했습니다.
  • 「배정이 있다」고 답했을 때는 그 배정을 모든 절에 실제로 대입해 참인지 확인합니다. 판정이 맞아도 배정을 잘못 뽑을 수 있기 때문이고, 그 결과를 화면에도 절마다 표로 보입니다.
  • 절이 함의 두 개로 제대로 바뀌는지도 테스트로 고정했습니다. (a ∨ b)는 ¬a → b와 ¬b → a가 되어야 합니다.
  • 덩어리를 나누는 데는 dev/tarjan-scc의 구현을 그대로 씁니다. 새로 짜지 않아 그쪽 테스트가 이쪽도 지켜 줍니다.
  • 부정 기호는 -, !, ~, ¬을 모두 받고 구분자로 or·∨·쉼표를 인정합니다. 낱말을 하나만 적으면 (a ∨ a)로 봅니다.
  • 절은 60개, 변수는 20개까지 다룹니다. 함의 그래프와 덩어리 표를 통째로 그리는 것이 목적이라 그보다 크면 화면이 읽히지 않습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.