Module clingo.tests.test_atoms

Tests for theory and symbolic atoms.

Classes

class TestAtoms (methodName='runTest')
Expand source code
class TestAtoms(TestCase):
    """
    Tests for theory and symbolic atoms.
    """

    def setUp(self):
        self.ctl = Control()

    def test_symbolic_atom(self):
        """
        Test symbolic atom.
        """
        self.ctl.add("base", [], "p(1). {p(2)}. #external p(3).")
        self.ctl.ground([("base", [])])

        atoms = self.ctl.symbolic_atoms

        p1 = cast(SymbolicAtom, atoms[Function("p", [Number(1)])])
        self.assertIsNotNone(p1)
        self.assertTrue(p1.is_fact)
        self.assertFalse(p1.is_external)
        self.assertTrue(p1.literal >= 1)
        self.assertEqual(p1.symbol, Function("p", [Number(1)]))
        self.assertTrue(p1.match("p", 1, True))
        self.assertFalse(p1.match("p", 2, True))

        p2 = cast(SymbolicAtom, atoms[Function("p", [Number(2)])])
        self.assertIsNotNone(p2)
        self.assertFalse(p2.is_fact)
        self.assertFalse(p2.is_external)
        self.assertTrue(p2.literal >= 2)
        self.assertEqual(p2.symbol, Function("p", [Number(2)]))
        self.assertTrue(p2.match("p", 1, True))
        self.assertFalse(p2.match("p", 2, True))

        p3 = cast(SymbolicAtom, atoms[Function("p", [Number(3)])])
        self.assertIsNotNone(p3)
        self.assertFalse(p3.is_fact)
        self.assertTrue(p3.is_external)
        self.assertTrue(p3.literal >= 2)
        self.assertEqual(p3.symbol, Function("p", [Number(3)]))
        self.assertTrue(p3.match("p", 1, True))
        self.assertFalse(p3.match("p", 2, True))

        p4 = atoms[Function("p", [Number(4)])]
        self.assertIsNone(p4)

    def test_symbolic_atoms(self):
        """
        Test symbolic atoms.
        """
        self.ctl.add(
            "base",
            [],
            "p(1). {p(2)}. #external p(3). q(1). -p(1). {q(2)}. #external q(3).",
        )
        self.ctl.ground([("base", [])])

        atoms = self.ctl.symbolic_atoms
        self.assertEqual(
            sorted(atoms.signatures), [("p", 1, False), ("p", 1, True), ("q", 1, True)]
        )

        ps = list(atoms.by_signature("p", 1, True))
        self.assertEqual(len(ps), 3)
        for p in ps:
            self.assertEqual(p.symbol.name, "p")
            self.assertTrue(p.symbol.positive)
            self.assertEqual(len(p.symbol.arguments), 1)

        nps = list(atoms.by_signature("p", 1, False))
        self.assertEqual(len(nps), 1)
        for p in nps:
            self.assertEqual(p.symbol.name, "p")
            self.assertTrue(p.symbol.negative)
            self.assertEqual(p.symbol.arguments, [Number(1)])

        self.assertEqual(len(atoms), 7)
        self.assertEqual(len(list(atoms)), 7)

        self.assertIn(Function("p", [Number(1)], True), atoms)
        self.assertIn(Function("p", [Number(1)], False), atoms)
        self.assertIn(Function("q", [Number(2)], True), atoms)
        self.assertNotIn(Function("q", [Number(2)], False), atoms)

    def test_theory_term(self):
        """
        Test theory term.
        """
        self.ctl.add("base", [], THEORY)
        self.ctl.add("base", [], "&a { 1,a,f(a),{1},(1,),[1] }.")
        self.ctl.ground([("base", [])])

        terms = next(self.ctl.theory_atoms).elements[0].terms
        self.assertEqual(
            [str(term) for term in terms], ["1", "a", "f(a)", "{1}", "(1,)", "[1]"]
        )
        num, sym, fun, set_, tup, lst = terms
        self.assertEqual(num.type, TheoryTermType.Number)
        self.assertEqual(num.number, 1)
        self.assertEqual(sym.type, TheoryTermType.Symbol)
        self.assertEqual(sym.name, "a")
        self.assertEqual(fun.type, TheoryTermType.Function)
        self.assertEqual(fun.name, "f")
        self.assertEqual(fun.arguments, [sym])
        self.assertEqual(set_.type, TheoryTermType.Set)
        self.assertEqual(set_.arguments, [num])
        self.assertEqual(tup.type, TheoryTermType.Tuple)
        self.assertEqual(tup.arguments, [num])
        self.assertEqual(lst.type, TheoryTermType.List)
        self.assertEqual(lst.arguments, [num])

        self.assertNotEqual(hash(num), hash(sym))
        self.assertEqual(hash(num), hash(lst.arguments[0]))
        self.assertNotEqual(num < sym, sym < num)

        self.assertRegex(repr(num), "TheoryTerm(.*)")

    def test_theory_element(self):
        """
        Test theory element.
        """
        self.ctl.add("base", [], THEORY)
        self.ctl.add("base", [], "{a; b}.")
        self.ctl.add("base", [], "&a { 1; 2,3: a,b }.")
        self.ctl.ground([("base", [])])

        atom = next(self.ctl.theory_atoms)
        elements = sorted(atom.elements, key=lambda elem: len(elem.terms))
        self.assertEqual([str(elem) for elem in elements], ["1", "2,3: a,b"])

        a, b = elements
        self.assertEqual(len(a.condition), 0)
        self.assertEqual(len(b.condition), 2)
        self.assertTrue(all(lit >= 1 for lit in b.condition))
        self.assertGreaterEqual(b.condition_id, 1)

        self.assertEqual(a, a)
        self.assertNotEqual(a, b)
        self.assertNotEqual(hash(a), hash(b))
        self.assertNotEqual(a < b, b < a)

        self.assertRegex(repr(a), "TheoryElement(.*)")

    def test_theory_atom(self):
        """
        Test theory atom.
        """
        self.ctl.add("base", [], THEORY)
        self.ctl.add("base", [], "&a {}.")
        self.ctl.add("base", [], "&b {} = 1.")
        self.ctl.ground([("base", [])])

        atoms = sorted(list(self.ctl.theory_atoms), key=lambda atom: atom.term.name)
        self.assertEqual([str(atom) for atom in atoms], ["&a{}", "&b{}=1"])

        a, b = atoms
        self.assertTrue(a.literal >= 1)
        self.assertIsNone(a.guard)
        self.assertIsNotNone(b.guard)
        self.assertEqual(b.guard[0], "=")
        self.assertEqual(str(b.guard[1]), "1")
        self.assertEqual(len(a.elements), 0)

        self.assertEqual(a, a)
        self.assertNotEqual(a, b)
        self.assertNotEqual(hash(a), hash(b))
        self.assertNotEqual(a < b, b < a)

        self.assertRegex(repr(a), "TheoryAtom(.*)")

Tests for theory and symbolic atoms.

Create an instance of the class that will use the named test method when executed. Raises a ValueError if the instance does not have a method with the specified name.

Ancestors

  • unittest.case.TestCase

Methods

def setUp(self)
Expand source code
def setUp(self):
    self.ctl = Control()

Hook method for setting up the test fixture before exercising it.

def test_symbolic_atom(self)
Expand source code
def test_symbolic_atom(self):
    """
    Test symbolic atom.
    """
    self.ctl.add("base", [], "p(1). {p(2)}. #external p(3).")
    self.ctl.ground([("base", [])])

    atoms = self.ctl.symbolic_atoms

    p1 = cast(SymbolicAtom, atoms[Function("p", [Number(1)])])
    self.assertIsNotNone(p1)
    self.assertTrue(p1.is_fact)
    self.assertFalse(p1.is_external)
    self.assertTrue(p1.literal >= 1)
    self.assertEqual(p1.symbol, Function("p", [Number(1)]))
    self.assertTrue(p1.match("p", 1, True))
    self.assertFalse(p1.match("p", 2, True))

    p2 = cast(SymbolicAtom, atoms[Function("p", [Number(2)])])
    self.assertIsNotNone(p2)
    self.assertFalse(p2.is_fact)
    self.assertFalse(p2.is_external)
    self.assertTrue(p2.literal >= 2)
    self.assertEqual(p2.symbol, Function("p", [Number(2)]))
    self.assertTrue(p2.match("p", 1, True))
    self.assertFalse(p2.match("p", 2, True))

    p3 = cast(SymbolicAtom, atoms[Function("p", [Number(3)])])
    self.assertIsNotNone(p3)
    self.assertFalse(p3.is_fact)
    self.assertTrue(p3.is_external)
    self.assertTrue(p3.literal >= 2)
    self.assertEqual(p3.symbol, Function("p", [Number(3)]))
    self.assertTrue(p3.match("p", 1, True))
    self.assertFalse(p3.match("p", 2, True))

    p4 = atoms[Function("p", [Number(4)])]
    self.assertIsNone(p4)

Test symbolic atom.

def test_symbolic_atoms(self)
Expand source code
def test_symbolic_atoms(self):
    """
    Test symbolic atoms.
    """
    self.ctl.add(
        "base",
        [],
        "p(1). {p(2)}. #external p(3). q(1). -p(1). {q(2)}. #external q(3).",
    )
    self.ctl.ground([("base", [])])

    atoms = self.ctl.symbolic_atoms
    self.assertEqual(
        sorted(atoms.signatures), [("p", 1, False), ("p", 1, True), ("q", 1, True)]
    )

    ps = list(atoms.by_signature("p", 1, True))
    self.assertEqual(len(ps), 3)
    for p in ps:
        self.assertEqual(p.symbol.name, "p")
        self.assertTrue(p.symbol.positive)
        self.assertEqual(len(p.symbol.arguments), 1)

    nps = list(atoms.by_signature("p", 1, False))
    self.assertEqual(len(nps), 1)
    for p in nps:
        self.assertEqual(p.symbol.name, "p")
        self.assertTrue(p.symbol.negative)
        self.assertEqual(p.symbol.arguments, [Number(1)])

    self.assertEqual(len(atoms), 7)
    self.assertEqual(len(list(atoms)), 7)

    self.assertIn(Function("p", [Number(1)], True), atoms)
    self.assertIn(Function("p", [Number(1)], False), atoms)
    self.assertIn(Function("q", [Number(2)], True), atoms)
    self.assertNotIn(Function("q", [Number(2)], False), atoms)

Test symbolic atoms.

def test_theory_atom(self)
Expand source code
def test_theory_atom(self):
    """
    Test theory atom.
    """
    self.ctl.add("base", [], THEORY)
    self.ctl.add("base", [], "&a {}.")
    self.ctl.add("base", [], "&b {} = 1.")
    self.ctl.ground([("base", [])])

    atoms = sorted(list(self.ctl.theory_atoms), key=lambda atom: atom.term.name)
    self.assertEqual([str(atom) for atom in atoms], ["&a{}", "&b{}=1"])

    a, b = atoms
    self.assertTrue(a.literal >= 1)
    self.assertIsNone(a.guard)
    self.assertIsNotNone(b.guard)
    self.assertEqual(b.guard[0], "=")
    self.assertEqual(str(b.guard[1]), "1")
    self.assertEqual(len(a.elements), 0)

    self.assertEqual(a, a)
    self.assertNotEqual(a, b)
    self.assertNotEqual(hash(a), hash(b))
    self.assertNotEqual(a < b, b < a)

    self.assertRegex(repr(a), "TheoryAtom(.*)")

Test theory atom.

def test_theory_element(self)
Expand source code
def test_theory_element(self):
    """
    Test theory element.
    """
    self.ctl.add("base", [], THEORY)
    self.ctl.add("base", [], "{a; b}.")
    self.ctl.add("base", [], "&a { 1; 2,3: a,b }.")
    self.ctl.ground([("base", [])])

    atom = next(self.ctl.theory_atoms)
    elements = sorted(atom.elements, key=lambda elem: len(elem.terms))
    self.assertEqual([str(elem) for elem in elements], ["1", "2,3: a,b"])

    a, b = elements
    self.assertEqual(len(a.condition), 0)
    self.assertEqual(len(b.condition), 2)
    self.assertTrue(all(lit >= 1 for lit in b.condition))
    self.assertGreaterEqual(b.condition_id, 1)

    self.assertEqual(a, a)
    self.assertNotEqual(a, b)
    self.assertNotEqual(hash(a), hash(b))
    self.assertNotEqual(a < b, b < a)

    self.assertRegex(repr(a), "TheoryElement(.*)")

Test theory element.

def test_theory_term(self)
Expand source code
def test_theory_term(self):
    """
    Test theory term.
    """
    self.ctl.add("base", [], THEORY)
    self.ctl.add("base", [], "&a { 1,a,f(a),{1},(1,),[1] }.")
    self.ctl.ground([("base", [])])

    terms = next(self.ctl.theory_atoms).elements[0].terms
    self.assertEqual(
        [str(term) for term in terms], ["1", "a", "f(a)", "{1}", "(1,)", "[1]"]
    )
    num, sym, fun, set_, tup, lst = terms
    self.assertEqual(num.type, TheoryTermType.Number)
    self.assertEqual(num.number, 1)
    self.assertEqual(sym.type, TheoryTermType.Symbol)
    self.assertEqual(sym.name, "a")
    self.assertEqual(fun.type, TheoryTermType.Function)
    self.assertEqual(fun.name, "f")
    self.assertEqual(fun.arguments, [sym])
    self.assertEqual(set_.type, TheoryTermType.Set)
    self.assertEqual(set_.arguments, [num])
    self.assertEqual(tup.type, TheoryTermType.Tuple)
    self.assertEqual(tup.arguments, [num])
    self.assertEqual(lst.type, TheoryTermType.List)
    self.assertEqual(lst.arguments, [num])

    self.assertNotEqual(hash(num), hash(sym))
    self.assertEqual(hash(num), hash(lst.arguments[0]))
    self.assertNotEqual(num < sym, sym < num)

    self.assertRegex(repr(num), "TheoryTerm(.*)")

Test theory term.