Skip to content
Snippets Groups Projects
Commit 43182d14 authored by Ali Sinan Köksal's avatar Ali Sinan Köksal
Browse files

Sat solver as in paper

parent fcde1045
No related branches found
No related tags found
No related merge requests found
...@@ -9,22 +9,32 @@ object SatSolver { ...@@ -9,22 +9,32 @@ object SatSolver {
List(4) List(4)
) )
def satSolve(problem : Seq[Seq[Int]]) = {
problem.map(l => l.map(i => {
val id = scala.math.abs(i)
val isPos = i > 0
val c : Constraint1[Map[Int,Boolean]] = ((m : Map[Int,Boolean]) => m(id) == isPos)
c
}).reduceLeft(_ || _)).reduceLeft(_ && _).find
}
def main(args: Array[String]): Unit = { def main(args: Array[String]): Unit = {
val problem: List[List[Int]] = if (args.length > 0 ) (for (line <- Source.fromFile(args(0)).getLines if (!line.startsWith("c") && !line.startsWith("p"))) yield { val problem: List[List[Int]] = if (args.length > 0 ) (for (line <- Source.fromFile(args(0)).getLines if (!line.startsWith("c") && !line.startsWith("p"))) yield {
line.split(" ").toList.map(_.toInt) line.split(" ").toList.map(_.toInt)
}).toList else defaultProblem }).toList else defaultProblem
type CM = Constraint1[Map[Int,Boolean]] // type CM = Constraint1[Map[Int,Boolean]]
val solution : CM = // val solution : CM =
problem.foldLeft[CM]((m:Map[Int,Boolean]) => true)((cons:CM,clause:List[Int]) => cons && clause.foldLeft[CM]((m:Map[Int,Boolean]) => false)((cons:CM,lit:Int) => { // problem.foldLeft[CM]((m:Map[Int,Boolean]) => true)((cons:CM,clause:List[Int]) => cons && clause.foldLeft[CM]((m:Map[Int,Boolean]) => false)((cons:CM,lit:Int) => {
val isPos = lit > 0 // val isPos = lit > 0
val abs = scala.math.abs(lit) // val abs = scala.math.abs(lit)
cons || ((m:Map[Int,Boolean]) => m(abs) == isPos) // cons || ((m:Map[Int,Boolean]) => m(abs) == isPos)
})) // }))
val answer = solution.solve // val answer = solution.solve
println("Solution map : " + answer) // println("Solution map : " + answer)
(1 to 4).foreach(i => println("i : " + answer(i))) // (1 to 4).foreach(i => println("i : " + answer(i)))
println("satSolve(p)", satSolve(problem))
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment