Esempio n. 1
0
def test_simplify():
    assert simplify(0) == 0
    assert simplify(And(1, 1, 1, 0, simplify=False)) == 0
    assert simplify(Or(0, 0, 0, 1, simplify=False)) == 1

    f1 = And(a, And(b, And(c, 0, simplify=False), simplify=False), simplify=False)
    f2 = Or(a, Or(b, Or(c, 1, simplify=False), simplify=False), simplify=False)
    if MAJOR >= 3:
        assert str(f1) == "a * b * c * 0"
        assert str(f2) == "a + b + c + 1"
    assert simplify(f1) == 0
    assert simplify(f2) == 1
Esempio n. 2
0
def test_implies():
    # Function
    assert Implies(-p, q).support == {p, q}

    # Expression
    assert Implies(0, 0) == 1
    assert Implies(0, 1) == 1
    assert Implies(1, 0) == 0
    assert Implies(1, 1) == 1

    assert (0 >> p) == 1
    assert (1 >> p) == p
    assert (p >> 0) == -p
    assert (p >> 1) == 1

    assert (p >> p) == 1
    assert (p >> -p) == -p
    assert (-p >> p) == p

    assert str(p >> q) == "p => q"
    assert str((a * b) >> (c + d)) == "(a * b) => (c + d)"

    assert (p >> q).restrict({p: 0}) == 1
    assert (p >> q).compose({q: a}).equivalent(p >> a)
    assert (p >> q).invert().equivalent(p * -q)
    assert ((a * b) >> (c + d)).depth == 2

    f = Implies(p, 1, simplify=False)
    assert str(f) == "p => 1"
    assert simplify(f) == 1

    assert f_implies(p, q).equivalent(-p + q)
Esempio n. 3
0
def test_ite():
    # Function
    assert ITE(s, -a, b).support == {s, a, b}

    # Expression
    assert ITE(0, 0, 0) == 0
    assert ITE(0, 0, 1) == 1
    assert ITE(0, 1, 0) == 0
    assert ITE(0, 1, 1) == 1
    assert ITE(1, 0, 0) == 0
    assert ITE(1, 0, 1) == 0
    assert ITE(1, 1, 0) == 1
    assert ITE(1, 1, 1) == 1

    assert ITE(0, 0, b) == b
    assert ITE(0, a, 0) == 0
    assert ITE(0, 1, b) == b
    assert ITE(0, a, 1) == 1
    assert ITE(1, 0, b) == 0
    assert ITE(1, a, 0) == a
    assert ITE(1, 1, b) == 1
    assert ITE(1, a, 1) == a

    assert ITE(s, 0, 0) == 0
    assert ITE(s, 0, 1) == -s
    assert ITE(s, 1, 0) == s
    assert ITE(s, 1, 1) == 1
    assert ITE(s, 0, b).equivalent(-s * b)
    assert ITE(s, a, 0).equivalent(s * a)
    assert ITE(s, 1, b).equivalent(s + b)
    assert ITE(s, a, 1).equivalent(-s + a)

    assert ITE(s, -a, -a) == -a
    assert ITE(s, a, a) == a

    assert str(ITE(s, a, b)) == "s ? a : b"
    assert str(ITE(s, a * b, c + d)) == "s ? (a * b) : (c + d)"

    assert ITE(s, a, b).restrict({a: 1, b: 1}) == 1
    assert ITE(s, a, b).compose({a: b, b: a}).equivalent(s * b + -s * a)
    assert ITE(s, a, b).invert().equivalent((-s + -a) * (s + -b))
    assert ITE(s, a * b, c + d).depth == 3

    f = ITE(s, 1, 1, simplify=False)
    assert str(f) == "s ? 1 : 1"
    assert simplify(f) == 1

    assert f_ite(s, a, b).equivalent(s * a + -s * b)