示例#1
0
    def test_00_new_node_type(self):
        self.assertEqual(len(CUSTOM_NODE_TYPES), 0, "Initially there should be no custom types")
        idx = new_node_type()
        self.assertIsNotNone(idx)
        with self.assertRaises(AssertionError):
            new_node_type(idx)

        n = new_node_type(idx+100)
        self.assertEqual(n, idx+100)
示例#2
0
    def test_00_new_node_type(self):
        self.assertEqual(len(CUSTOM_NODE_TYPES), 0, "Initially there should be no custom types")
        idx = new_node_type()
        self.assertIsNotNone(idx)
        with self.assertRaises(AssertionError):
            new_node_type(idx)

        n = new_node_type(idx+100)
        self.assertEqual(n, idx+100)
示例#3
0
    def test_00_new_node_type(self):
        self.assertNotIn(199, CUSTOM_NODE_TYPES,
                        "Initially there should be no custom node with id 199")
        idx = new_node_type(node_id=199)
        self.assertIsNotNone(idx)
        with self.assertRaises(AssertionError):
            new_node_type(idx)

        n = new_node_type(idx+100)
        self.assertEqual(n, idx+100)
示例#4
0
    def test_00_new_node_type(self):
        self.assertNotIn(
            199, CUSTOM_NODE_TYPES,
            "Initially there should be no custom node with id 199")
        idx = new_node_type(node_id=199)
        self.assertIsNotNone(idx)
        with self.assertRaises(AssertionError):
            new_node_type(idx)

        n = new_node_type(idx + 100)
        self.assertEqual(n, idx + 100)
示例#5
0
    def test_01_dwf(self):
        # Ad-hoc method to handle printing of the new node
        def hrprinter_walk_XOR(self, formula):
            self.stream.write("(")
            yield formula.arg(0)
            self.stream.write(" *+* ")
            yield formula.arg(1)
            self.stream.write(")")

        # Shortcuts for function in env
        add_dwf = get_env().add_dynamic_walker_function
        create_node = get_env().formula_manager.create_node

        # Define the new node type and register the walkers in the env
        XOR = new_node_type()
        add_dwf(XOR, SimpleTypeChecker, SimpleTypeChecker.walk_bool_to_bool)
        add_dwf(XOR, HRPrinter, hrprinter_walk_XOR)

        # Create a test node (This implicitely calls the Type-checker)
        x = Symbol("x")
        f1 = create_node(node_type=XOR, args=(x,x))
        self.assertIsNotNone(f1)

        # String conversion should use the function defined above.
        s_f1 = str(f1)
        self.assertEqual(s_f1, "(x *+* x)")

        # We did not define an implementation for the Simplifier
        with self.assertRaises(UnsupportedOperatorError):
            f1.simplify()
示例#6
0
    def test_01_dwf(self):
        # Ad-hoc method to handle printing of the new node
        def hrprinter_walk_XOR(self, formula):
            self.stream.write("(")
            self.walk(formula.arg(0))
            self.stream.write(" *+* ")
            self.walk(formula.arg(1))
            self.stream.write(")")
            return

        # Shortcuts for function in env
        add_dwf = get_env().add_dynamic_walker_function
        create_node = get_env().formula_manager.create_node

        # Define the new node type and register the walkers in the env
        XOR = new_node_type()
        add_dwf(XOR, SimpleTypeChecker, SimpleTypeChecker.walk_bool_to_bool)
        add_dwf(XOR, HRPrinter, hrprinter_walk_XOR)

        # Create a test node (This implicitely calls the Type-checker)
        x = Symbol("x")
        f1 = create_node(node_type=XOR, args=(x,x))
        self.assertIsNotNone(f1)

        # String conversion should use the function defined above.
        s_f1 = str(f1)
        self.assertEqual(s_f1, "(x *+* x)")

        # We did not define an implementation for the Simplifier
        with self.assertRaises(NotImplementedError):
            f1.simplify()
示例#7
0
    def test_conversion_error(self):
        from pysmt.type_checker import SimpleTypeChecker
        add_dwf = get_env().add_dynamic_walker_function
        create_node = get_env().formula_manager.create_node

        # Create a node that is not supported by any solver
        idx = op.new_node_type()
        x = Symbol("x")
        add_dwf(idx, SimpleTypeChecker, SimpleTypeChecker.walk_bool_to_bool)
        invalid_node = create_node(idx, args=(x, x))

        for sname in get_env().factory.all_solvers(logic=QF_BOOL):
            with self.assertRaises(ConvertExpressionError):
                is_sat(invalid_node, solver_name=sname, logic=QF_BOOL)
示例#8
0
    def test_conversion_error(self):
        from pysmt.type_checker import SimpleTypeChecker
        add_dwf = get_env().add_dynamic_walker_function
        create_node = get_env().formula_manager.create_node

        # Create a node that is not supported by any solver
        idx = op.new_node_type()
        x = Symbol("x")
        add_dwf(idx, SimpleTypeChecker, SimpleTypeChecker.walk_bool_to_bool)
        invalid_node = create_node(idx, args=(x,x))

        for sname in get_env().factory.all_solvers(logic=QF_BOOL):
            with self.assertRaises(ConvertExpressionError):
                is_sat(invalid_node, solver_name=sname, logic=QF_BOOL)
示例#9
0
    def test_walker_new_operators_complete(self):
        walkerA = IdentityDagWalker(env=self.env)
        idx = op.new_node_type(node_str="fancy_new_node")
        walkerB = IdentityDagWalker(env=self.env)
        with self.assertRaises(KeyError):
            walkerA.functions[idx]
        self.assertEqual(walkerB.functions[idx], walkerB.walk_error)

        # Use a mixin to handle the node type
        class FancyNewNodeWalkerMixin(object):
            def walk_fancy_new_node(self, args, **kwargs):
                raise UnsupportedOperatorError

        class IdentityDagWalker2(IdentityDagWalker, FancyNewNodeWalkerMixin):
            pass

        walkerC = IdentityDagWalker2(env=self.env)
        self.assertEqual(walkerC.functions[idx], walkerC.walk_fancy_new_node)
示例#10
0
 def test_02_all_types(self):
     old_types_set = set(all_types())
     new_t = new_node_type()
     new_types_set = set(all_types())
     self.assertEqual(new_types_set - old_types_set, set([new_t]))
示例#11
0
文件: environment.py 项目: pllab/CoSA
import re
from typing import Set

from pysmt.shortcuts import TRUE, FALSE, And, Or, Symbol, BV, EqualsOrIff, Implies, get_env
from pysmt.typing import BOOL, BVType
from pysmt.parsing import parse, HRParser, HRLexer, PrattParser, Rule, UnaryOpAdapter, InfixOpAdapter

import pysmt.environment
import pysmt.formula

from cosa.encoders.formulae import StringParser
from cosa.utils.logger import Logger

from pysmt.operators import new_node_type

LTL_X = new_node_type(node_str="LTL_X")
LTL_F = new_node_type(node_str="LTL_F")
LTL_G = new_node_type(node_str="LTL_G")
LTL_U = new_node_type(node_str="LTL_U")
LTL_R = new_node_type(node_str="LTL_R")
LTL_O = new_node_type(node_str="LTL_O")
LTL_H = new_node_type(node_str="LTL_H")
ALL_LTL = (LTL_X, LTL_F, LTL_G, LTL_U, LTL_R, LTL_O, LTL_H)

ASSIGN = new_node_type(node_str="ASSIGN")
DEFINE = new_node_type(node_str="DEFINE")


def Assign(left, right):
    return get_env().formula_manager.Assign(left, right)
示例#12
0
文件: ltl.py 项目: mpreiner/pysmt
# Linear Temporal Logic
#
# This example shows how to extend pySMT in order to support
# additional operators. This can be achieved without modifying the
# pySMT source code.
#
# We use LTL as an example, and we define some basic operators.
#

# First we need to define the new operators, or "node types"
from pysmt.operators import new_node_type

LTL_X = new_node_type(node_str="LTL_X")
LTL_Y = new_node_type(node_str="LTL_Y")
LTL_Z = new_node_type(node_str="LTL_Z")
LTL_F = new_node_type(node_str="LTL_F")
LTL_G = new_node_type(node_str="LTL_G")
LTL_O = new_node_type(node_str="LTL_O")
LTL_H = new_node_type(node_str="LTL_H")
LTL_U = new_node_type(node_str="LTL_U")
LTL_S = new_node_type(node_str="LTL_S")
ALL_LTL = (LTL_X, LTL_Y, LTL_Z,
           LTL_F, LTL_G, LTL_O, LTL_H,
           LTL_U, LTL_S)

# The FormulaManager needs to be extended to be able to use these
# operators. Notice that additional checks, and some simplifications
# can be performed at construction time. We keep this example simple.
import pysmt.environment
import pysmt.formula
示例#13
0
#adding operators
from pysmt.operators import new_node_type

SIN = new_node_type(node_str="sin")
COS = new_node_type(node_str="cos")
ALL_TRANS = (SIN, COS)

#Extending FormulaManager
import pysmt.environment
import pysmt.formula


class ExtendedFormulaManager(pysmt.formula.FormulaManager):
    def Sin(self, arg):
        return self.create_node(node_type=SIN, args=(arg, ))

    def Cos(self, arg):
        return self.create_node(node_type=COS, args=(arg, ))


#updating some walkers with first approach
from pysmt.type_checker import SimpleTypeChecker
SimpleTypeChecker.set_handler(SimpleTypeChecker.walk_real_to_real, *ALL_TRANS)

from pysmt.oracles import FreeVarsOracle, QuantifierOracle
FreeVarsOracle.set_handler(FreeVarsOracle.walk_simple_args, *ALL_TRANS)
QuantifierOracle.set_handler(QuantifierOracle.walk_all, *ALL_TRANS)

from pysmt.rewritings import PrenexNormalizer
PrenexNormalizer.set_handler(PrenexNormalizer.walk_theory_op, *ALL_TRANS)
示例#14
0
    def test_new_node_type(self):
        old = list(all_types())
        idx = new_node_type(node_str="xor")
        self.assertIsNotNone(idx)
        self.assertNotIn(idx, old)
        with self.assertRaises(AssertionError):
            new_node_type(idx)
        XOR = idx

        # Ad-hoc method to handle printing of the new node
        def hrprinter_walk_xor(self, formula):
            self.stream.write("(")
            yield formula.arg(0)
            self.stream.write(" *+* ")
            yield formula.arg(1)
            self.stream.write(")")

        SimpleTypeChecker.walk_xor = SimpleTypeChecker.walk_bool_to_bool
        HRPrinter.walk_xor = hrprinter_walk_xor

        # Reset the env to recreate the TypeChecker and HRPrinter
        reset_env()

        # Shortcuts for function in env
        create_node = get_env().formula_manager.create_node
        # Create a test node (This implicitly calls the Type-checker)
        x = Symbol("x")
        f1 = create_node(node_type=XOR, args=(x,x))
        self.assertIsNotNone(f1)

        # String conversion should use the function defined above.
        s_f1 = str(f1)
        self.assertEqual(s_f1, "(x *+* x)")

        # We did not define an implementation for the Simplifier
        with self.assertRaises(UnsupportedOperatorError):
            f1.simplify()

        # Clean-up
        del SimpleTypeChecker.walk_xor
        del HRPrinter.walk_xor

        class MySimpleTypeChecker(SimpleTypeChecker):
            walk_xor = SimpleTypeChecker.walk_bool_to_bool

        class MyHRPrinter(HRPrinter):
            def walk_xor(self, formula):
                return self.walk_nary(formula, " *+* ")

        class MyHRSerializer(HRSerializer):
            PrinterClass = MyHRPrinter

        class MyEnv(Environment):
            TypeCheckerClass = MySimpleTypeChecker
            HRSerializerClass = MyHRSerializer

        with MyEnv() as myenv:
            create_node = myenv.formula_manager.create_node
            # Create a test node (This implicitly calls the Type-checker)
            x = Symbol("x")
            f1 = create_node(node_type=XOR, args=(x,x))
            self.assertIsNotNone(f1)

            # String conversion should use the function defined above.
            s_f1 = str(f1)
            self.assertEqual(s_f1, "(x *+* x)")

            # We did not define an implementation for the Simplifier
            with self.assertRaises(UnsupportedOperatorError):
                f1.simplify()

        return
示例#15
0
# Linear Temporal Logic
#
# This example shows how to extend pySMT in order to support
# additional operators. This can be achieved without modifying the
# pySMT source code.
#
# We use LTL as an example, and we define some basic operators.
#

# First we need to define the new operators, or "node types"
from pysmt.operators import new_node_type

LTL_X = new_node_type(node_str="LTL_X")
LTL_Y = new_node_type(node_str="LTL_Y")
LTL_Z = new_node_type(node_str="LTL_Z")
LTL_F = new_node_type(node_str="LTL_F")
LTL_G = new_node_type(node_str="LTL_G")
LTL_O = new_node_type(node_str="LTL_O")
LTL_H = new_node_type(node_str="LTL_H")
LTL_U = new_node_type(node_str="LTL_U")
LTL_S = new_node_type(node_str="LTL_S")
ALL_LTL = (LTL_X, LTL_Y, LTL_Z, LTL_F, LTL_G, LTL_O, LTL_H, LTL_U, LTL_S)

# The FormulaManager needs to be extended to be able to use these
# operators. Notice that additional checks, and some simplifications
# can be performed at construction time. We keep this example simple.
import pysmt.environment
import pysmt.formula


class FormulaManager(pysmt.formula.FormulaManager):
示例#16
0
 def test_02_all_types(self):
     old_types_set = set(all_types())
     new_t = new_node_type()
     new_types_set = set(all_types())
     self.assertEqual(new_types_set - old_types_set, set([new_t]))
示例#17
0
from pysmt.typing import BOOL, BVType
from pysmt.parsing import parse, HRParser, HRLexer, PrattParser, Rule, UnaryOpAdapter, InfixOpAdapter

import pysmt.environment
import pysmt.formula

from cosa.representation import HTS, TS
from cosa.encoders.formulae import StringParser
from cosa.utils.logger import Logger
from cosa.utils.formula_mngm import get_free_variables, substitute
from cosa.problem import VerificationType
from cosa.utils.formula_mngm import quote_names

from pysmt.operators import new_node_type

LTL_X = new_node_type(node_str="LTL_X")
LTL_F = new_node_type(node_str="LTL_F")
LTL_G = new_node_type(node_str="LTL_G")
LTL_U = new_node_type(node_str="LTL_U")
LTL_R = new_node_type(node_str="LTL_R")
LTL_O = new_node_type(node_str="LTL_O")
LTL_H = new_node_type(node_str="LTL_H")
ALL_LTL = (LTL_X, LTL_F, LTL_G, LTL_U, LTL_R, LTL_O, LTL_H)


class FormulaManager(pysmt.formula.FormulaManager):
    """Extension of FormulaManager to handle LTL Operators."""
    def X(self, formula):
        return self.create_node(node_type=LTL_X, args=(formula, ))

    def F(self, formula):