spot/wrap/python/tests/ltlsimple.py
Alexandre Duret-Lutz de6314ed74 Revamp the multop interface to allow some basic optimizations like
not constructing a single-child multop.
* src/ltlast/multop.hh (multop::instance(type)): Remove.
(multop::instance(type, formula*, formula*)): Return a formula*.
(multop::instance(type, vec*)): Make it public and return a formula*.
(multop::add_sorted, multop::add):
* src/ltlast/multop.cc (multop::instance(type, vec*)): Rewrite.
(multop::instance(type)): Delete.
(multop::instance(type, formula*, formula*)): Adjust.
(multop::add_sorted, multop::add): Remove.
* src/ltlvisit/clone.cc (clone_visitor::visit(multop*)) Adjust.
* src/ltlvisit/nenoform.cc
(negative_normal_form_visitor::::visit(multop*)) Adjust.
* src/ltltest/equals.test: Make sure `a & a' and `a' are equals.
* wrap/python/tests/ltlsimple.py: Adjust.
2003-08-10 16:29:49 +00:00

100 lines
2.4 KiB
Python
Executable file

import ltihooks
import spot
clone = spot.clone
e = spot.default_environment.instance()
#----------------------------------------------------------------------
a = e.require('a')
b = e.require('b')
c = e.require('c')
c2 = e.require('c')
assert c == c2
assert spot.atomic_prop.instance_count() == 3
op = spot.multop.instance(spot.multop.And, clone(a), clone(b))
op2 = spot.multop.instance(spot.multop.And, op, c)
# The symbol for a subformula which hasn't been cloned is better
# suppressed, so we don't attempt to reuse it elsewhere.
del op, c
print 'op2 =', op2
op3 = spot.multop.instance(spot.multop.And, b,
spot.multop.instance(spot.multop.And, c2, a))
del a, b, c2
print 'op3 =', op3
assert op2 == op3
op4 = spot.multop.instance(spot.multop.Or, op2, op3)
print 'op4 =', op4
assert op4 == op2
del op2, op3
assert spot.atomic_prop.instance_count() == 3
assert spot.multop.instance_count() == 1
spot.destroy(op4)
del op4
assert spot.atomic_prop.instance_count() == 0
assert spot.multop.instance_count() == 0
#----------------------------------------------------------------------
a = e.require('a')
b = e.require('b')
c = e.require('c')
T = spot.constant.true_instance()
F = spot.constant.false_instance()
f1 = spot.binop.instance(spot.binop.Equiv, T, clone(a))
f2 = spot.binop.instance(spot.binop.Implies, F, clone(b))
f3 = spot.binop.instance(spot.binop.Xor, F, clone(c))
f4 = spot.unop.instance(spot.unop.Not, f3); del f3
assert spot.atomic_prop.instance_count() == 3
assert spot.binop.instance_count() == 3
assert spot.unop.instance_count() == 1
assert spot.multop.instance_count() == 0
spot.destroy(a)
del a
spot.destroy(b)
del b
spot.destroy(c)
del c
assert spot.atomic_prop.instance_count() == 3
assert spot.binop.instance_count() == 3
assert spot.unop.instance_count() == 1
assert spot.multop.instance_count() == 0
spot.destroy(f1)
del f1
assert spot.atomic_prop.instance_count() == 2
assert spot.binop.instance_count() == 2
assert spot.unop.instance_count() == 1
assert spot.multop.instance_count() == 0
spot.destroy(f4)
del f4
assert spot.atomic_prop.instance_count() == 1
assert spot.binop.instance_count() == 1
assert spot.unop.instance_count() == 0
assert spot.multop.instance_count() == 0
spot.destroy(f2)
del f2
assert spot.atomic_prop.instance_count() == 0
assert spot.binop.instance_count() == 0
assert spot.unop.instance_count() == 0
assert spot.multop.instance_count() == 0