// rw3sat_oo.scala
 
 
  }
    def apply
(index
: Int, flag
: Boolean
) = new Literal
(index, flag
)   }
 
  class Clause
(val literals
: Seq
[Literal
]) {     def apply
(x
: Seq
[Boolean
]) = this.
literals.
exists(_(x
))   }
    def apply
(literals
: Literal
*) = new Clause
(literals
)   }
 
    def apply
(x
: Seq
[Boolean
]) = this.
clauses.
forall(_(x
))   }
    def apply
(clauses
: Clause
*) = new CNF
(clauses
)   }
 
  def sample
[A
](a
: Seq
[A
]): A 
= a
(Random.
nextInt(a.
length))  
  def w4
(n
: Int
): Seq
[Boolean
] = for (_ <- 
0 until n
) yield Random.
nextBoolean  // W4  
  def rw3sat
(f
: CNF, n
: Int, r
: Int
): String 
= {     @annotation.tailrec
    def loop
(k
: Int, r
: Int, x
: Seq
[Boolean
]): Option
[Seq
[Boolean
]] =          case (_, 
0, 
0) => None                                      
// W17         case (_, 
0, 
_) => loop
(n 
* 3, r - 
1, w4
(n
))                 // W15,W16           val c 
= sample
(f.
clauses.
filterNot(_(x
)))                 // W10           val index 
= sample
(c.
literals).
index                      // W11           val x2 
= x.
updated(index, 
!x
(index
))                      // W12           loop(k - 1, r, x2)                                        // W13,W14
        }
      }
 
    loop
(n 
* 3, r, w4
(n
)) match {                               // W2,W3,W5,W6      case Some
(x
) => "Satisfiable with [" + x.
mkString(",") + 
"]"   // "充足可能である"       case _ => "Probably Unsatisfiable"    // "おそらく充足不可能である"     }
  }
 
  def main
(args
: Array
[String
]): Unit 
= {  
    val f 
= CNF
(p1, p2, p3, p4, p5, p6, p7, p8
)     // val f = CNF(p1, p2, p3, p4, p5, p6, p8)
    println(rw3sat(f, 4, 3))
    // => Probably Unsatisfiable
  }
}
				Ly8gcnczc2F0X29vLnNjYWxhCgppbXBvcnQgc2NhbGEudXRpbC5SYW5kb20KCm9iamVjdCBNYWluIHsKICBjbGFzcyBMaXRlcmFsKHZhbCBpbmRleDogSW50LCB2YWwgZmxhZzogQm9vbGVhbikgewogICAgZGVmIGFwcGx5KHg6IFNlcVtCb29sZWFuXSkgPSB0aGlzLmZsYWcgXiB4KHRoaXMuaW5kZXgpCiAgfQogIG9iamVjdCBMaXRlcmFsIHsKICAgIGRlZiBhcHBseShpbmRleDogSW50LCBmbGFnOiBCb29sZWFuKSA9IG5ldyBMaXRlcmFsKGluZGV4LCBmbGFnKQogIH0KCiAgY2xhc3MgQ2xhdXNlKHZhbCBsaXRlcmFsczogU2VxW0xpdGVyYWxdKSB7CiAgICBkZWYgYXBwbHkoeDogU2VxW0Jvb2xlYW5dKSA9IHRoaXMubGl0ZXJhbHMuZXhpc3RzKF8oeCkpCiAgfQogIG9iamVjdCBDbGF1c2UgewogICAgZGVmIGFwcGx5KGxpdGVyYWxzOiBMaXRlcmFsKikgPSBuZXcgQ2xhdXNlKGxpdGVyYWxzKQogIH0KCiAgY2xhc3MgQ05GKHZhbCBjbGF1c2VzOiBTZXFbQ2xhdXNlXSkgewogICAgZGVmIGFwcGx5KHg6IFNlcVtCb29sZWFuXSkgPSB0aGlzLmNsYXVzZXMuZm9yYWxsKF8oeCkpCiAgfQogIG9iamVjdCBDTkYgewogICAgZGVmIGFwcGx5KGNsYXVzZXM6IENsYXVzZSopID0gbmV3IENORihjbGF1c2VzKQogIH0KCiAgZGVmIHNhbXBsZVtBXShhOiBTZXFbQV0pOiBBID0gYShSYW5kb20ubmV4dEludChhLmxlbmd0aCkpCgogIGRlZiB3NChuOiBJbnQpOiBTZXFbQm9vbGVhbl0gPSBmb3IgKF8gPC0gMCB1bnRpbCBuKSB5aWVsZCBSYW5kb20ubmV4dEJvb2xlYW4gIC8vIFc0CgogIGRlZiBydzNzYXQoZjogQ05GLCBuOiBJbnQsIHI6IEludCk6IFN0cmluZyA9IHsKICAgIEBhbm5vdGF0aW9uLnRhaWxyZWMKICAgIGRlZiBsb29wKGs6IEludCwgcjogSW50LCB4OiBTZXFbQm9vbGVhbl0pOiBPcHRpb25bU2VxW0Jvb2xlYW5dXSA9IAogICAgICAoZih4KSwgaywgcikgbWF0Y2ggewogICAgICAgIGNhc2UgKHRydWUsIF8sIF8pID0+IFNvbWUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFc3LFc4CiAgICAgICAgY2FzZSAoXywgMCwgMCkgPT4gTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVzE3CiAgICAgICAgY2FzZSAoXywgMCwgXykgPT4gbG9vcChuICogMywgciAtIDEsIHc0KG4pKSAgICAgICAgICAgICAgICAgLy8gVzE1LFcxNgogICAgICAgIGNhc2UgXyA9PiB7CiAgICAgICAgICB2YWwgYyA9IHNhbXBsZShmLmNsYXVzZXMuZmlsdGVyTm90KF8oeCkpKSAgICAgICAgICAgICAgICAgLy8gVzEwCiAgICAgICAgICB2YWwgaW5kZXggPSBzYW1wbGUoYy5saXRlcmFscykuaW5kZXggICAgICAgICAgICAgICAgICAgICAgLy8gVzExCiAgICAgICAgICB2YWwgeDIgPSB4LnVwZGF0ZWQoaW5kZXgsICF4KGluZGV4KSkgICAgICAgICAgICAgICAgICAgICAgLy8gVzEyCiAgICAgICAgICBsb29wKGsgLSAxLCByLCB4MikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVzEzLFcxNAogICAgICAgIH0KICAgICAgfQoKICAgIGxvb3AobiAqIDMsIHIsIHc0KG4pKSBtYXRjaCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFcyLFczLFc1LFc2CiAgICAgIGNhc2UgU29tZSh4KSA9PiAiU2F0aXNmaWFibGUgd2l0aCBbIiArIHgubWtTdHJpbmcoIiwiKSArICJdIiAgIC8vICLlhYXotrPlj6/og73jgafjgYLjgosiCiAgICAgIGNhc2UgXyA9PiAiUHJvYmFibHkgVW5zYXRpc2ZpYWJsZSIgICAgLy8gIuOBiuOBneOCieOBj+WFhei2s+S4jeWPr+iDveOBp+OBguOCiyIKICAgIH0KICB9CgogIGRlZiBtYWluKGFyZ3M6IEFycmF5W1N0cmluZ10pOiBVbml0ID0gewogICAgdmFsIHAxID0gQ2xhdXNlKExpdGVyYWwoMCwgZmFsc2UpLCBMaXRlcmFsKDEsIGZhbHNlKSwgTGl0ZXJhbCgyLCBmYWxzZSkpCiAgICB2YWwgcDIgPSBDbGF1c2UoTGl0ZXJhbCgzLCBmYWxzZSksIExpdGVyYWwoMSwgZmFsc2UpLCBMaXRlcmFsKDIsIHRydWUgKSkKICAgIHZhbCBwMyA9IENsYXVzZShMaXRlcmFsKDAsIHRydWUgKSwgTGl0ZXJhbCgzLCBmYWxzZSksIExpdGVyYWwoMiwgZmFsc2UpKQogICAgdmFsIHA0ID0gQ2xhdXNlKExpdGVyYWwoMCwgdHJ1ZSApLCBMaXRlcmFsKDMsIHRydWUgKSwgTGl0ZXJhbCgxLCBmYWxzZSkpCiAgICB2YWwgcDUgPSBDbGF1c2UoTGl0ZXJhbCgzLCB0cnVlICksIExpdGVyYWwoMSwgdHJ1ZSApLCBMaXRlcmFsKDIsIGZhbHNlKSkKICAgIHZhbCBwNiA9IENsYXVzZShMaXRlcmFsKDAsIHRydWUgKSwgTGl0ZXJhbCgxLCB0cnVlICksIExpdGVyYWwoMiwgdHJ1ZSApKQogICAgdmFsIHA3ID0gQ2xhdXNlKExpdGVyYWwoMCwgZmFsc2UpLCBMaXRlcmFsKDMsIHRydWUgKSwgTGl0ZXJhbCgyLCB0cnVlICkpCiAgICB2YWwgcDggPSBDbGF1c2UoTGl0ZXJhbCgwLCBmYWxzZSksIExpdGVyYWwoMywgZmFsc2UpLCBMaXRlcmFsKDEsIHRydWUgKSkKCiAgICB2YWwgZiA9IENORihwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpCiAgICAvLyB2YWwgZiA9IENORihwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwOCkKICAgIHByaW50bG4ocnczc2F0KGYsIDQsIDMpKQogICAgLy8gPT4gUHJvYmFibHkgVW5zYXRpc2ZpYWJsZQogIH0KfQ==