def test_quantifier_syntax(): b = BDD() [b.add_var(var) for var in ['x', 'y']] # constants u = b.add_expr('\E x: True') assert u == b.true, u u = b.add_expr('\E x, y: True') assert u == b.true, u u = b.add_expr('\E x: False') assert u == b.false, u u = b.add_expr('\A x: True') assert u == b.true, u u = b.add_expr('\A x: False') assert u == b.false, u u = b.add_expr('\A x, y: False') assert u == b.false, u # variables u = b.add_expr('\E x: x') assert u == b.true, u u = b.add_expr('\A x: x') assert u == b.false, u u = b.add_expr('\E x, y: x') assert u == b.true, u u = b.add_expr('\E x, y: y') assert u == b.true, u u = b.add_expr('\A x: y') assert u == b.var('y'), u u = b.add_expr('\A x: ! y') u_ = b.apply('not', b.var('y')) assert u == u_, (u, u_)
def test_var(): b = BDD() with nt.assert_raises(AssertionError): b.var('x') j = b.add_var('x') u = b.var('x') assert u > 0, u level, low, high = b.succ(u) assert level == j, (level, j) assert low == b.false, low assert high == b.true, high
def test_rename_syntax(): b = BDD() [b.add_var(var) for var in ['x', 'y', 'z', 'w']] # single substitution u = b.add_expr('\S y / x: True') assert u == b.true, u u = b.add_expr('\S y / x: False') assert u == b.false, u u = b.add_expr('\S y / x: x') u_ = b.add_expr('y') assert u == u_, (u, u_) u = b.add_expr('\S y / x: z') u_ = b.add_expr('z') assert u == u_, (u, u_) u = b.add_expr('\S y / x: x & z') u_ = b.add_expr('y & z') assert u == u_, (u, u_) # multiple substitution u = b.add_expr('\S y / x, w / z: x & z') u_ = b.add_expr('y & w') assert u == u_, (u, u_) u = b.add_expr('\S y / x, w / z: z | ! x') u_ = b.add_expr('w | ! y') assert u == u_, (u, u_)
def test_add_var(): b = BDD() # # automated level selection # first var j = b.add_var('x') assert len(b.vars) == 1, b.vars assert 'x' in b.vars, b.vars assert b.vars['x'] == 0, b.vars assert j == 0, j # second var j = b.add_var('y') assert len(b.vars) == 2, b.vars assert 'y' in b.vars, b.vars assert b.vars['y'] == 1, b.vars assert j == 1, j # third var j = b.add_var('z') assert len(b.vars) == 3, b.vars assert 'z' in b.vars, b.vars assert b.vars['z'] == 2, b.vars assert j == 2, j # # explicit level selection b = BDD() j = b.add_var('x', level=35) assert len(b.vars) == 1, b.vars assert 'x' in b.vars, b.vars assert b.vars['x'] == 35, b.vars assert j == 35, j j = b.add_var('y', level=5) assert len(b.vars) == 2, b.vars assert 'y' in b.vars, b.vars assert b.vars['y'] == 5, b.vars assert j == 5, j # attempt to add var at an existing level with nt.assert_raises(AssertionError): b.add_var('z', level=35) with nt.assert_raises(AssertionError): b.add_var('z', level=5) # # mixing automated and # explicit level selection b = BDD() b.add_var('x', level=2) b.add_var('y') assert len(b.vars) == 2, b.vars assert 'x' in b.vars, b.vars assert 'y' in b.vars, b.vars assert b.vars['x'] == 2, b.vars assert b.vars['y'] == 1, b.vars with nt.assert_raises(AssertionError): b.add_var('z') b.add_var('z', level=0)