犯人は誰だ SAT encoding

solver

制約

  • A:「B, Cの少なくとも一方は犯人」
    • st1 := (!A) == (B || C)
    • CNFfy (A || B || C) && (!A || !B) && (!A || !C)
  • B:「Dは犯人ではない」
    • st2 := (!B) == (!D)
    • CNFfy st2 := (B || !D) && (!B || D)
  • C:「AもDも犯人」
    • st3 := (!C) == (A && D)
    • CNFfy (!A || !C || !D) && (A || C) && (C || D)
  • D:「Aは犯人ではない」
    • st4 := (!D) == (!A)
    • CNFfy (A || !D) && (!A || D)
  • st: st1 && st2 && st3 && st4
  • solve: (A, B, C, D) = (false, false, true, false)
  • これ以外に解がないか検証したい -> 解の否定 !(!A && !B && C && !D) => A || B || !C || D を加えて解くと解なしなので唯一解

参考文献