def test_nc_dincry(self): fsm = self.model() c1p = eval_simple_expression(fsm, "c1.payer") c2p = eval_simple_expression(fsm, "c2.payer") c3p = eval_simple_expression(fsm, "c3.payer") c1h = eval_simple_expression(fsm, "c1.coin = head") c2h = eval_simple_expression(fsm, "c2.coin = head") c3h = eval_simple_expression(fsm, "c3.coin = head") odd = eval_simple_expression(fsm, "countsay = odd") even = eval_simple_expression(fsm, "countsay = even") unk = eval_simple_expression(fsm, "countsay = unknown") true = eval_simple_expression(fsm, "TRUE") false = eval_simple_expression(fsm, "FALSE") # nC<c1,c2> ~c3.payer ncs = nc(fsm, ["c1", "c2"], c3h) self.assertTrue(ncs.isnot_false()) state = fsm.pick_one_state(ncs) witness = explain_nc(fsm, state, ["c1", "c2"], c3h) self.assertTrue(witness[0] == state) for (s, ag, sp) in zip(witness[::2], witness[1::2], witness[2::2]): self.assertTrue(s.isnot_false()) self.assertTrue(ag in [{"c1"}, {"c2"}]) self.assertTrue(sp.isnot_false()) self.assertTrue((sp <= fsm.equivalent_states(s, {"c1"})) | (sp <= fsm.equivalent_states(s, {"c2"}))) self.assertTrue(witness[-1] <= c3h)
def test_nc_simple(self): fsm = self.simplemodel() lt = eval_simple_expression(fsm, "at.local") lf = eval_simple_expression(fsm, "af.local") g = eval_simple_expression(fsm, "global") true = eval_simple_expression(fsm, "TRUE") false = eval_simple_expression(fsm, "FALSE") # ~lt & ~lf & g |= nc<at, af> ~lt & ~lf & ~g ncs = nc(fsm, ["at"], ~lt & ~lf & g) self.assertTrue(ncs.isnot_false()) state = fsm.pick_one_state(~lt & lf & g) self.assertTrue(state <= ncs) witness = explain_nc(fsm, state, ["at"], ~lt & ~lf & g) self.assertTrue(witness[0] == state) for (s, ag, sp) in zip(witness[::2], witness[1::2], witness[2::2]): self.assertTrue(s.isnot_false()) self.assertTrue(ag in [{"at"}]) self.assertTrue(sp.isnot_false()) self.assertTrue(sp <= fsm.equivalent_states(s, {"at"})) self.assertTrue(witness[-1] <= ~lt & ~lf & g)