def test_constraint_context_sigma(self): fsm = master_be_fsm() _true = Node.from_ptr(parse_ltl_spec("TRUE")) _true = bmcutils.make_nnf_boolean_wff(_true) _truen= _true.to_node() cond = Wff(parse_ltl_spec("G !(mouse = hover)"))\ .to_boolean_wff()\ .to_negation_normal_form() off_1 = 0 off_2 = 2 length= 1 # sigma1 problem = diagnosability.generate_sat_problem([], (_truen, _truen), length, _true, cond.to_node(), _truen) tm_cond = ltlspec.bounded_semantics_at_offset(fsm, cond.to_node(), length, off_1) canonical_p = tests.canonical_cnf(problem) canonical_f = tests.canonical_cnf(tm_cond) self.assertTrue(all(clause in canonical_p for clause in canonical_f)) # sigma2 problem = diagnosability.generate_sat_problem([], (_truen, _truen), length, _true, _truen, cond.to_node()) tm_cond = ltlspec.bounded_semantics_at_offset(fsm, cond.to_node(), length, off_2) canonical_p = tests.canonical_cnf(problem) canonical_f = tests.canonical_cnf(tm_cond) self.assertTrue(all(clause in canonical_p for clause in canonical_f))
def test_generate_sat_problem(self): theta = Node.from_ptr(parse_simple_expression("TRUE")) theta = bmcutils.make_nnf_boolean_wff(theta) sigma_12= Node.from_ptr(parse_ltl_spec("TRUE")) sigma_12= bmcutils.make_nnf_boolean_wff(sigma_12).to_node() observable = diagnosability.mk_observable_vars(["mouse"]) f1 = Node.from_ptr(parse_simple_expression("status = active")) f2 = Node.from_ptr(parse_simple_expression("status = inactive")) for i in range(5): problem = diagnosability.generate_sat_problem(observable, (f1, f2), i, theta, sigma_12, sigma_12) solver = SatSolverFactory.create() cnf = problem.to_cnf() solver += cnf solver.polarity(cnf, Polarity.POSITIVE) self.assertEqual(SatSolverResult.UNSATISFIABLE, solver.solve()) f1 = Node.from_ptr(parse_simple_expression("status = active")) f2 = Node.from_ptr(parse_simple_expression("status = highlight")) for i in range(1, 4): # length zero has no input => only an initial state and the # diagnosability condition is not checked problem = diagnosability.generate_sat_problem(observable, (f1, f2), i, theta, sigma_12, sigma_12) solver = SatSolverFactory.create() cnf = problem.to_cnf() solver += cnf solver.polarity(cnf, Polarity.POSITIVE) self.assertEqual(SatSolverResult.SATISFIABLE, solver.solve())