Advertisement
Guest User

SATSolver2

a guest
Jul 11th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.01 KB | None | 0 0
  1. val terms = ArrayList<Term>()
  2. val variables = HashMap<String, Boolean>()
  3. val accessTable = HashMap<String, Boolean>()
  4.  
  5. class Term {
  6.     fun addVar(name: String) {
  7.         vars.add(name)
  8.     }
  9.  
  10.     fun nextState(): Boolean {
  11.         if (++state == 1.shl(vars.size)) {
  12.             state = 1
  13.             return true
  14.         }
  15.         return false
  16.     }
  17.  
  18.     fun checkState(): Boolean {
  19.         return state < 1.shl(vars.size)
  20.     }
  21.  
  22.     fun setVariables(): Boolean {
  23.         var currentState = state
  24.         var currentPos = 0
  25.         while (currentState > 0) {
  26.             if (currentState % 2 == 1) {
  27.                 if (!setVariable(vars[currentPos], true))
  28.                     return false
  29.             } else {
  30.                 if (!setVariable(vars[currentPos], false))
  31.                     return false
  32.             }
  33.             currentState /= 2
  34.             currentPos++
  35.         }
  36.         return true
  37.     }
  38.  
  39.     fun setVariable(name: String, state: Boolean): Boolean {
  40.         val value = if (name.startsWith('-')) !state else state
  41.         val key = if (name.startsWith('-')) name.substring(1) else name
  42.         if (accessTable[key]!!) {
  43.             if (value != variables[key])
  44.                 return false
  45.         } else {
  46.             accessTable[key] = true
  47.             variables[key] = value
  48.         }
  49.         return true
  50.     }
  51.  
  52.     private val vars = ArrayList<String>()
  53.     private var state = 1
  54. }
  55.  
  56. fun main(args: Array<String>) {
  57.     val input = readLine() ?: return
  58.     var currentTerm = Term()
  59.     input.split(' ').forEach {
  60.         if (it == "0") {
  61.             terms.add(currentTerm)
  62.             currentTerm = Term()
  63.         } else {
  64.             val name = if (it.startsWith('-')) it.substring(1) else it
  65.             accessTable[name] = false
  66.             variables[name] = false
  67.             currentTerm.addVar(it)
  68.         }
  69.     }
  70.     terms.add(currentTerm)
  71.     while(terms.last().checkState()) {
  72.         var flag = true
  73.         terms.forEach {
  74.             if (!it.setVariables()) {
  75.                 flag = false
  76.                 return@forEach
  77.             }
  78.         }
  79.         if (flag) {
  80.             variables.forEach { name, value -> println("$name = $value") }
  81.             println()
  82.         }
  83.         accessTable.forEach { s, _ -> accessTable[s] = false }
  84.         var currentPos = 0
  85.         var currentItem = terms[0]
  86.         while (currentItem.nextState()) {
  87.             if (++currentPos == terms.size) return
  88.             currentItem = terms[currentPos]
  89.         }
  90.     }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement