lib/prop_logic/minisat.rb in prop_logic-minisat-0.1.0 vs lib/prop_logic/minisat.rb in prop_logic-minisat-0.2.0
- old
+ new
@@ -1,62 +1,16 @@
require 'prop_logic'
require 'minisat'
-require "prop_logic/minisat/version"
+require 'prop_logic/minisat/version'
+require 'prop_logic/minisat/incremental_solver'
module PropLogic
module Minisat
- class Solver
+ module Solver
def self.call(term)
- new.sat?(term)
+ IncrementalSolver.new(term).sat?
end
-
- private_class_method :new
-
- def initialize
- @solver = ::MiniSat::Solver.new
- end
-
- def parse_variable_or_not(term)
- if term.is_a?(Variable)
- @variable_map[term]
- else
- -(@variable_map[term.terms[0]])
- end
- end
-
- def parse_or_term(term)
- if term.is_a?(OrTerm)
- @solver << term.terms.map{ |t| parse_variable_or_not(t) }
- else
- @solver << parse_variable_or_not(term)
- end
- end
-
- def sat?(term)
- cnf = term.to_cnf
- orig_variables = term.variables
- # no need to use SAT solver
- return false if cnf == False
- if cnf == True
- return True if orig_variables.length == 0
- return PropLogic.all_and(*orig_variables)
- end
- #prepare for solver
- using_variables = cnf.variables
- @variable_map = {}
- using_variables.each{ |v| @variable_map[v] = @solver.new_var }
- if cnf.is_a?(AndTerm)
- cnf.terms.each{ |t| parse_or_term t}
- else
- parse_or_term term
- end
- return false unless @solver.solve
- # return value generation
- assign_variables = using_variables & orig_variables
- extra_variables = orig_variables - assign_variables
- PropLogic.all_and(*assign_variables.map{ |v| @solver[@variable_map[v]] ? v : -v }, *extra_variables)
- end
-
end
end
PropLogic.sat_solver = Minisat::Solver
+ PropLogic.incremental_solver = Minisat::IncrementalSolver
end