def test_get_label(self):
     g = sexpression_graphs.SExpressionGraph('(a (b a))')
     self.assertEqual(g.get_label('(a (b a))'), None)
     self.assertEqual(g.get_label('(b a)'), None)
     self.assertEqual(g.get_label('a'), 'a')
     with self.assertRaises(Exception):
         g.get_label('c')
 def test_parentheses(self):
     g = sexpression_graphs.SExpressionGraph('()')
     self.assertLen(g.labels, 1)
     self.assertLen(g.parents, 1)
     self.assertLen(g.children, 1)
     self.assertEmpty(g.get_parents('()'))
     self.assertEmpty(g.get_children('()'))
 def test_get_children(self):
     g = sexpression_graphs.SExpressionGraph('(a (b a))')
     self.assertLen(g.get_children('(a (b a))'), 2)
     self.assertLen(g.get_children('(b a)'), 2)
     self.assertEmpty(g.get_children('a'))
     with self.assertRaises(Exception):
         g.get_children('c')
 def test_post_order_skip_first_child(self):
     g = sexpression_graphs.SExpressionGraph(
         '(c (fun (bool) (fun (bool) (bool))) /\\)')
     o = g.global_post_order(skip_first_child=True)
     self.assertLen(o, 5)
     self.assertNotIn(sexpression_graphs.to_node_id('bool'),
                      o)  # ... only occurs as '(bool)'
     self.assertIn(sexpression_graphs.to_node_id('(bool)'), o)
 def test_repeated_add(self):
     g = sexpression_graphs.SExpressionGraph(
         '(v (fun (fun (prod ?0 ?0) (bool)) (bool)) P)')
     self.assertLen(g.labels, 11)
     g.add_sexp('(fun (fun (prod ?0 ?0) (bool)) (bool))')
     self.assertLen(g.labels, 11)
     g.add_sexp('(asdf)')
     self.assertLen(g.labels, 13)
 def test_add_list(self):
     g = sexpression_graphs.SExpressionGraph()
     g.add_sexp([
         '(v (fun (fun (prod ?0 ?0) (bool)) (bool)) P)',
         '(fun (fun (prod ?0 ?0) (bool)) (bool))'
     ])
     self.assertLen(g.labels, 11)
     g.add_sexp('(asdf)')
     self.assertLen(g.labels, 13)
 def test_variable_named_v(self):
     g = sexpression_graphs.SExpressionGraph('(v N v)')
     self.assertLen(g.labels, 3)
     self.assertLen(g.parents, 3)
     self.assertLen(g.children, 3)
     self.assertEmpty(g.get_parents('(v N v)'))
     self.assertLen(g.get_parents('v'), 1)  # parents pointers collapsed
     self.assertLen(g.get_children('(v N v)'), 3)  # order is important here
     self.assertTrue(g.is_leaf_node(sexpression_graphs.to_node_id('v')))
 def test_single_child_with_parens(self):
     g = sexpression_graphs.SExpressionGraph('(())')
     self.assertLen(g.labels, 2)
     self.assertLen(g.parents, 2)
     self.assertLen(g.children, 2)
     self.assertEmpty(g.get_parents('(())'))
     self.assertLen(g.get_children('(())'), 1)
     self.assertEmpty(g.get_children('()'))
     self.assertLen(g.get_parents('()'), 1)
 def test_is_empty_string(self):
     g = sexpression_graphs.SExpressionGraph()
     self.assertFalse(g.is_empty_string())
     g.add_sexp('')
     self.assertTrue(g.is_empty_string())
     g.add_sexp('')
     self.assertTrue(g.is_empty_string())
     g.add_sexp('asdf')
     self.assertFalse(g.is_empty_string())
     g.add_sexp('')
     self.assertFalse(g.is_empty_string())
 def test_two_equal_children(self):
     g = sexpression_graphs.SExpressionGraph('(asdf asdf)')
     self.assertLen(g.labels, 2)
     self.assertLen(g.parents, 2)
     self.assertLen(g.children, 2)
     self.assertEmpty(g.get_parents('(asdf asdf)'))
     self.assertLen(g.get_children('(asdf asdf)'),
                    2)  # order is important here
     self.assertEmpty(g.get_children('asdf'))
     self.assertLen(g.get_parents('asdf'),
                    1)  # order of parents not important
 def test_two_children(self):
     g = sexpression_graphs.SExpressionGraph('(asdf ())')
     self.assertLen(g.labels, 3)
     self.assertLen(g.parents, 3)
     self.assertLen(g.children, 3)
     self.assertEmpty(g.get_parents('(asdf ())'))
     self.assertLen(g.get_children('(asdf ())'), 2)
     self.assertEmpty(g.get_children('asdf'))
     self.assertLen(g.get_parents('asdf'), 1)
     self.assertEmpty(g.get_children('()'))
     self.assertLen(g.get_parents('()'), 1)
 def test_post_order_single_expr(self, sexp):
     g = sexpression_graphs.SExpressionGraph(sexp)
     o = g.global_post_order()
     self.assertLen(o, len(g))
     self.assertCountEqual(o.values(), range(len(g)))
     for n in g.nodes:
         for c in g.children[n]:
             self.assertGreater(o[n], o[c])
     roots = g.roots()
     roots.sort()
     root_pairs = zip(roots[:-1], roots[1:])
     for r1, r2 in root_pairs:
         self.assertGreater(o[r2], o[r1])
示例#13
0
def normalize_genpvars(expr: Text):
    """Recursive function for replacement of variable names; slow but simple."""
    sys.setrecursionlimit(2000)

    def recursive_helper(expr_dag: sexpr.SExpressionGraph, node: sexpr.NodeID,
                         context):
        """Traverses DAG as if it was a tree.

    This function exploits that GEN%PVARs cannot have the same names to begin
    with unless they are normalized already.

    Args:
      expr_dag: dag of the S-expression
      node: current node
      context: A stack of variable renamings; i.e. functions from Text to Text
    """
        if expr_dag.is_leaf_node(node):
            label = expr_dag.labels[node]
            if len(label) <= 9 or not label.startswith('GEN'):
                # Cannot be GEN%PVAR%<num>
                return
            # Apply renaming context; this is a hack as it changes the internal state
            # of the DAG.
            for renaming in context:
                label = renaming(label)
            expr_dag.labels[node] = label
        else:
            if expr_dag.labels[expr_dag.children[node][0]] in ['fun', 'c']:
                # cannot contain genpvar, can be skipped; efficiency hack
                return
            var_name = expr_dag.get_bound_variable(node)
            if var_name and is_genpvar(var_name):
                # GENPVAR indices by nesting depth
                new_name = 'GEN%%PVAR%%%d' % len(context)
                context = extend_context(context, var_name, new_name)
            for child in expr_dag.children[node][1:]:  # can ignore first child
                recursive_helper(expr_dag, child, context)
        return

    # Traverse expression and rename bound GEN%PVARs
    expr_dag = sexpr.SExpressionGraph(expr)
    roots = expr_dag.roots()
    if len(roots) != 1:
        raise ValueError(
            'Attempting to normalize S-expression without root: %s' % expr)
    recursive_helper(expr_dag, roots[0], [])
    return expr_dag.to_text(roots[0])
    def test_real_expression(self):
        """Test parsing expressions taken from the HOL Light theorem prover.

    The string below is a statement on some property of sets taken from the HOL
    Light theorem prover in //third_party/hol_light. The test checks if we can
    parse a 'typical' expression from the data source this parser is targeted
    for.
    """
        g = sexpression_graphs.SExpressionGraph(
            '(a (c (fun (fun (fun (fun (prod ?0 ?0) (bool)) (bool)) (bool)) '
            '(bool)) !) (l (v (fun (fun (prod ?0 ?0) (bool)) (bool)) P) (a (c (fun '
            '(fun (fun (prod A A) (bool)) (bool)) (bool)) !) (l (v (fun (prod A A) '
            '(bool)) l) (a (a (c (fun (bool) (fun (bool) (bool))) =) (a (a (c (fun '
            '(fun (prod ?0 ?0) (bool)) (fun ?0 (bool))) fl) (a (c (fun (fun (fun '
            '(prod ?0 ?0) (bool)) (bool)) (fun (prod ?0 ?0) (bool))) UNIONS) (v '
            '(fun (fun (prod ?0 ?0) (bool)) (bool)) P))) (v ?0 x))) (a (c (fun '
            '(fun (fun (prod ?0 ?0) (bool)) (bool)) (bool)) ?) (l (v (fun (prod ?0 '
            '?0) (bool)) l) (a (a (c (fun (bool) (fun (bool) (bool))) /\\) (a (v '
            '(fun (fun (prod ?0 ?0) (bool)) (bool)) P) (v (fun (prod ?0 ?0) '
            '(bool)) l))) (a (a (c (fun (fun (prod ?0 ?0) (bool)) (fun ?0 (bool))) '
            'fl) (v (fun (prod ?0 ?0) (bool)) l)) (v ?0 x))))))))))')
        self.assertLen(g.labels, 59)
 def test_to_text_reconstruction(self, sexp):
     """Check if expressions are the same after parsing and printing to str."""
     g = sexpression_graphs.SExpressionGraph(sexp)
     node_id = sexpression_graphs.to_node_id(sexp)
     self.assertEqual(g.to_text(node_id), sexp)
 def test_two_sexps_not_accepted(self):
     with self.assertRaises(Exception):
         sexpression_graphs.SExpressionGraph('(asdf) ()')
 def test_single_bare_words_accepted(self):
     g = sexpression_graphs.SExpressionGraph('asdf')
     self.assertLen(g.labels, 1)
 def test_bare_words_not_accepted(self):
     with self.assertRaises(Exception):
         sexpression_graphs.SExpressionGraph('asdf asdf')
 def test_no_argument(self):
     g = sexpression_graphs.SExpressionGraph()  # should be the same as None
     self.assertEmpty(g.labels)
     self.assertEmpty(g.parents)
     self.assertEmpty(g.children)
    def test_multiple_expressions(self):
        """A canary for interpretation changes and performance problems.

    The expressions here were taken from the HOL Light theorem prover, the
    anticipated source of data for this parser. See also //third_party/hol_light

    This test checks for the number of graph nodes after parsing and
    deduplicating subexpressions.
    """
        g = sexpression_graphs.SExpressionGraph()
        g.add_sexp(
            '(a (a (c (fun (bool) (fun (bool) (bool))) ==>) (a (c (fun (fun ?0 '
            '(bool)) (bool)) ?) (l (v ?0 a) (a (a (c (fun (fun ?0 (bool)) (fun '
            '(fun ?0 (bool)) (bool))) SUBSET) (v (fun ?0 (bool)) s)) (a (a (c (fun '
            '?0 (fun (fun ?0 (bool)) (fun ?0 (bool)))) INSERT) (v ?0 a)) (c (fun '
            '?0 (bool)) EMPTY)))))) (a (c (fun (fun ?0 (bool)) (bool)) FINITE) (v '
            '(fun ?0 (bool)) s)))')
        g.add_sexp(
            '(a (a (c (fun (fun ?0 (bool)) (fun (fun ?0 (bool)) (bool))) =) (a (c '
            '(fun (fun ?0 (bool)) (fun ?0 (bool))) GSPEC) (l (v ?0 GEN%PVAR%0) (a '
            '(c (fun (fun ?0 (bool)) (bool)) ?) (l (v ?0 x) (a (a (a (c (fun ?0 '
            '(fun (bool) (fun ?0 (bool)))) SETSPEC) (v ?0 GEN%PVAR%0)) (a (a (c '
            '(fun (bool) (fun (bool) (bool))) /\\) (a (v (fun ?0 (bool)) P) (v '
            '?0 x))) (a (c (fun (bool) (bool)) ~) (a (v (fun ?0 (bool)) Q) (v ?0 '
            'x))))) (v ?0 x))))))) (a (a (c (fun (fun ?0 (bool)) (fun (fun ?0 '
            '(bool)) (fun ?0 (bool)))) DIFF) (a (c (fun (fun ?0 (bool)) (fun ?0 '
            '(bool))) GSPEC) (l (v ?0 GEN%PVAR%0) (a (c (fun (fun ?0 (bool)) '
            '(bool)) ?) (l (v ?0 x) (a (a (a (c (fun ?0 (fun (bool) (fun ?0 '
            '(bool)))) SETSPEC) (v ?0 GEN%PVAR%0)) (a (v (fun ?0 (bool)) P) '
            '(v ?0 x))) (v ?0 x))))))) (a (c (fun (fun ?0 (bool)) (fun ?0 '
            '(bool))) GSPEC) (l (v ?0 GEN%PVAR%0) (a (c (fun (fun ?0 (bool)) '
            '(bool)) ?) (l (v ?0 x) (a (a (a (c (fun ?0 (fun (bool) (fun ?0 '
            '(bool)))) SETSPEC) (v ?0 GEN%PVAR%0)) (a (a (c (fun (bool) (fun '
            '(bool) (bool))) /\\) (a (v (fun ?0 (bool)) P) (v ?0 x))) (a (v '
            '(fun ?0 (bool)) Q) (v ?0 x)))) (v ?0 x))))))))')
        g.add_sexp(
            '(a (c (fun (fun (fun (cart (real) M) (cart (real) N)) (bool)) (bool)) '
            '!) (l (v (fun (cart (real) M) (cart (real) N)) f) (a (c (fun (fun '
            '(fun (cart (real) M) (bool)) (bool)) (bool)) !) (l (v (fun (cart '
            '(real) M) (bool)) s) (a (c (fun (fun (fun (cart (real) M) (bool)) '
            '(bool)) (bool)) !) (l (v (fun (cart (real) M) (bool)) u) (a (c (fun '
            '(fun (cart (real) M) (bool)) (bool)) !) (l (v (cart (real) M) x) (a '
            '(a (c (fun (bool) (fun (bool) (bool))) ==>) (a (a (c (fun (bool) (fun '
            '(bool) (bool))) /\\) (a (a (c (fun (cart (real) M) (fun (fun (cart '
            '(real) M) (bool)) (bool))) limit_point_of) (v (cart (real) M) x)) (v '
            '(fun (cart (real) M) (bool)) s))) (a (a (c (fun (bool) (fun (bool) '
            '(bool))) /\\) (a (a (c (fun (fun (cart (real) M) (cart (real) N)) '
            '(fun (net (cart (real) M)) (bool))) continuous) (v (fun (cart (real) '
            'M) (cart (real) N)) f)) (a (a (c (fun (net (cart (real) M)) (fun '
            '(fun (cart (real) M) (bool)) (net (cart (real) M)))) within) (a (c '
            '(fun (cart (real) M) (net (cart (real) M))) at) (v (cart (real) M) '
            'x))) (v (fun (cart (real) M) (bool)) s)))) (a (a (c (fun (bool) '
            '(fun (bool) (bool))) /\\) (a (c (fun (fun (cart (real) M) (bool)) '
            '(bool)) open) (v (fun (cart (real) M) (bool)) u))) (a (a (c (fun '
            '(bool) (fun (bool) (bool))) /\\) (a (a (c (fun (cart (real) M) (fun '
            '(fun (cart (real) M) (bool)) (bool))) IN) (v (cart (real) M) x)) (v '
            '(fun (cart (real) M) (bool)) u))) (a (c (fun (fun (cart (real) M) '
            '(bool)) (bool)) FINITE) (a (c (fun (fun (cart (real) M) (bool)) (fun '
            '(cart (real) M) (bool))) GSPEC) (l (v (cart (real) M) GEN%PVAR%0) (a '
            '(c (fun (fun (cart (real) M) (bool)) (bool)) ?) (l (v (cart (real) M) '
            'z) (a (a (a (c (fun (cart (real) M) (fun (bool) (fun (cart (real) M) '
            '(bool)))) SETSPEC) (v (cart (real) M) GEN%PVAR%0)) (a (a (c (fun '
            '(bool) (fun (bool) (bool))) /\\) (a (a (c (fun (cart (real) M) (fun '
            '(fun (cart (real) M) (bool)) (bool))) IN) (v (cart (real) M) z)) (a '
            '(a (c (fun (fun (cart (real) M) (bool)) (fun (fun (cart (real) M) '
            '(bool)) (fun (cart (real) M) (bool)))) INTER) (v (fun (cart (real) M) '
            '(bool)) s)) (v (fun (cart (real) M) (bool)) u)))) (a (a (c (fun (cart '
            '(real) N) (fun (cart (real) N) (bool))) =) (a (v (fun (cart (real) M) '
            '(cart (real) N)) f) (v (cart (real) M) z))) (a (v (fun (cart (real) M)'
            ' (cart (real) N)) f) (v (cart (real) M) x))))) (v (cart (real) M) '
            'z)))))))))))) (a (a (c (fun (cart (real) N) (fun (fun (cart (real) '
            'N) (bool)) (bool))) limit_point_of) (a (v (fun (cart (real) M) (cart '
            '(real) N)) f) (v (cart (real) M) x))) (a (a (c (fun (fun (cart (real) '
            'M) (cart (real) N)) (fun (fun (cart (real) M) (bool)) (fun (cart '
            '(real) N) (bool)))) IMAGE) (v (fun (cart (real) M) (cart (real) N)) '
            'f)) (v (fun (cart (real) M) (bool)) s))))))))))))')
        g.add_sexp(
            '(a (c (fun (fun (fun (cart (real) M) (cart (real) N)) (bool)) (bool)) '
            '!) (l (v (fun (cart (real) M) (cart (real) N)) f) (a (c (fun (fun '
            '(fun (cart (real) M) (bool)) (bool)) (bool)) !) (l (v (fun (cart '
            '(real) M) (bool)) s) (a (c (fun (fun (cart (real) M) (bool)) (bool)) '
            '!) (l (v (cart (real) M) x) (a (a (c (fun (bool) (fun (bool) (bool))) '
            '==>) (a (a (c (fun (bool) (fun (bool) (bool))) /\\) (a (a (c (fun '
            '(cart (real) M) (fun (fun (cart (real) M) (bool)) (bool))) '
            'limit_point_of) (v (cart (real) M) x)) (v (fun (cart (real) M) '
            '(bool)) s))) (a (a (c (fun (bool) (fun (bool) (bool))) /\\) (a (a '
            '(c (fun (fun (cart (real) M) (cart (real) N)) (fun (net (cart (real) '
            'M)) (bool))) continuous) (v (fun (cart (real) M) (cart (real) N)) '
            'f)) (a (a (c (fun (net (cart (real) M)) (fun (fun (cart (real) M) '
            '(bool)) (net (cart (real) M)))) within) (a (c (fun (cart (real) M) '
            '(net (cart (real) M))) at) (v (cart (real) M) x))) (v (fun (cart '
            '(real) M) (bool)) s)))) (a (c (fun (fun (cart (real) M) (bool)) '
            '(bool)) !) (l (v (cart (real) M) x) (a (c (fun (fun (cart (real) M) '
            '(bool)) (bool)) !) (l (v (cart (real) M) y) (a (a (c (fun (bool) (fun '
            '(bool) (bool))) ==>) (a (a (c (fun (bool) (fun (bool) (bool))) /\\) '
            '(a (a (c (fun (cart (real) M) (fun (fun (cart (real) M) (bool)) '
            '(bool))) IN) (v (cart (real) M) x)) (v (fun (cart (real) M) (bool)) '
            's))) (a (a (c (fun (bool) (fun (bool) (bool))) /\\) (a (a (c (fun '
            '(cart (real) M) (fun (fun (cart (real) M) (bool)) (bool))) IN) (v '
            '(cart (real) M) y)) (v (fun (cart (real) M) (bool)) s))) (a (a (c '
            '(fun (cart (real) N) (fun (cart (real) N) (bool))) =) (a (v (fun '
            '(cart (real) M) (cart (real) N)) f) (v (cart (real) M) x))) (a (v '
            '(fun (cart (real) M) (cart (real) N)) f) (v (cart (real) M) y)))))) '
            '(a (a (c (fun (cart (real) M) (fun (cart (real) M) (bool))) =) (v '
            '(cart (real) M) x)) (v (cart (real) M) y)))))))))) (a (a (c (fun '
            '(cart (real) N) (fun (fun (cart (real) N) (bool)) (bool))) '
            'limit_point_of) (a (v (fun (cart (real) M) (cart (real) N)) f) '
            '(v (cart (real) M) x))) (a (a (c (fun (fun (cart (real) M) (cart '
            '(real) N)) (fun (fun (cart (real) M) (bool)) (fun (cart (real) N) '
            '(bool)))) IMAGE) (v (fun (cart (real) M) (cart (real) N)) f)) (v '
            '(fun (cart (real) M) (bool)) s))))))))))')
        g.add_sexp(
            '(a (c (fun (fun (fun ?0 (bool)) (bool)) (bool)) !) (l (v (fun ?0 '
            '(bool)) s) (a (a (c (fun (bool) (fun (bool) (bool))) ==>) (a (a (c '
            '(fun (bool) (fun (bool) (bool))) /\\) (a (a (c (fun (fun ?0 (bool)) '
            '(fun (fun ?0 (bool)) (bool))) SUBSET) (v (fun ?0 (bool)) s)) (v (fun '
            '?0 (bool)) t))) (a (a (c (fun ?0 (fun (fun ?0 (bool)) (bool))) IN) (v '
            '?0 x)) (v (fun ?0 (bool)) s)))) (a (a (c (fun ?0 (fun (fun ?0 (bool)) '
            '(bool))) IN) (v ?0 x)) (v (fun ?0 (bool)) t)))))')
        g.add_sexp(
            '(a (c (fun (fun (fun (cart (real) M) (cart (real) N)) (bool)) (bool)) '
            '!) (l (v (fun (cart (real) M) (cart (real) N)) f) (a (c (fun (fun '
            '(fun (num) (fun (cart (real) M) (bool))) (bool)) (bool)) !) (l (v '
            '(fun (num) (fun (cart (real) M) (bool))) s) (a (a (c (fun (bool) '
            '(fun (bool) (bool))) ==>) (a (a (c (fun (bool) (fun (bool) (bool))) '
            '/\\) (a (a (c (fun (fun (cart (real) M) (cart (real) N)) (fun (fun '
            '(cart (real) M) (bool)) (bool))) continuous_on) (v (fun (cart (real) '
            'M) (cart (real) N)) f)) (a (v (fun (num) (fun (cart (real) M) '
            '(bool))) s) (a (c (fun (num) (num)) NUMERAL) (c (num) _0))))) (a (a '
            '(c (fun (bool) (fun (bool) (bool))) /\\) (a (c (fun (fun (num) '
            '(bool)) (bool)) !) (l (v (num) n) (a (c (fun (fun (cart (real) M) '
            '(bool)) (bool)) compact) (a (v (fun (num) (fun (cart (real) M) '
            '(bool))) s) (v (num) n)))))) (a (c (fun (fun (num) (bool)) (bool)) '
            '!) (l (v (num) n) (a (a (c (fun (fun (cart (real) M) (bool)) (fun '
            '(fun (cart (real) M) (bool)) (bool))) SUBSET) (a (v (fun (num) '
            '(fun (cart (real) M) (bool))) s) (a (c (fun (num) (num)) SUC) (v '
            '(num) n)))) (a (v (fun (num) (fun (cart (real) M) (bool))) s) (v ('
            'num) n)))))))) (a (a (c (fun (fun (cart (real) N) (bool)) (fun (fu'
            'n (cart (real) N) (bool)) (bool))) =) (a (a (c (fun (fun (cart (re'
            'al) M) (cart (real) N)) (fun (fun (cart (real) M) (bool)) (fun (ca'
            'rt (real) N) (bool)))) IMAGE) (v (fun (cart (real) M) (cart (real) '
            'N)) f)) (a (c (fun (fun (fun (cart (real) M) (bool)) (bool)) (fun '
            '(cart (real) M) (bool))) INTERS) (a (c (fun (fun (fun (cart (real) '
            'M) (bool)) (bool)) (fun (fun (cart (real) M) (bool)) (bool))) GSPEC'
            ') (l (v (fun (cart (real) M) (bool)) GEN%PVAR%0) (a (c (fun (fun (n'
            'um) (bool)) (bool)) ?) (l (v (num) n) (a (a (a (c (fun (fun (cart ('
            'real) M) (bool)) (fun (bool) (fun (fun (cart (real) M) (bool)) (boo'
            'l)))) SETSPEC) (v (fun (cart (real) M) (bool)) GEN%PVAR%0)) (a (a '
            '(c (fun (num) (fun (fun (num) (bool)) (bool))) IN) (v (num) n)) (c '
            '(fun (num) (bool)) UNIV))) (a (v (fun (num) (fun (cart (real) M) '
            '(bool))) s) (v (num) n)))))))))) (a (c (fun (fun (fun (cart (real) '
            'N) (bool)) (bool)) (fun (cart (real) N) (bool))) INTERS) (a (c ('
            'fun (fun (fun (cart (real) N) (bool)) (bool)) (fun (fun (cart (real) '
            'N) (bool)) (bool))) GSPEC) (l (v (fun (cart (real) N) (bool)) '
            'GEN%PVAR%0) (a (c (fun (fun (num) (bool)) (bool)) ?) (l (v (num) '
            'n) (a (a (a (c (fun (fun (cart (real) N) (bool)) (fun (bool) (fun '
            '(fun (cart (real) N) (bool)) (bool)))) SETSPEC) (v (fun (cart (real'
            ') N) (bool)) GEN%PVAR%0)) (a (a (c (fun (num) (fun (fun (num) (bool'
            ')) (bool))) IN) (v (num) n)) (c (fun (num) (bool)) UNIV))) (a (a (c '
            '(fun (fun (cart (real) M) (cart (real) N)) (fun (fun (cart (real) M) '
            '(bool)) (fun (cart (real) N) (bool)))) IMAGE) (v (fun (cart (real) M) '
            '(cart (real) N)) f)) (a (v (fun (num) (fun (cart (real) M) (bool))) '
            's) (v (num) n)))))))))))))))')
        g.add_sexp(
            '(a (c (fun (fun (fun (cart (real) M) (cart (real) N)) (bool)) (bool)) '
            '!) (l (v (fun (cart (real) M) (cart (real) N)) f) (a (c (fun (fun ('
            'fun (num) (fun (cart (real) M) (bool))) (bool)) (bool)) !) (l (v ('
            'fun (num) (fun (cart (real) M) (bool))) s) (a (c (fun (fun (num) (boo'
            'l)) (bool)) !) (l (v (num) m) (a (a (c (fun (bool) (fun (bool) (bool'
            '))) ==>) (a (a (c (fun (bool) (fun (bool) (bool))) /\\) (a (a (c (fu'
            'n (fun (cart (real) M) (cart (real) N)) (fun (fun (cart (real) M) (b'
            'ool)) (bool))) continuous_on) (v (fun (cart (real) M) (cart (real) '
            'N)) f)) (a (v (fun (num) (fun (cart (real) M) (bool))) s) (v (num) '
            'm)))) (a (a (c (fun (bool) (fun (bool) (bool))) /\\) (a (c (fun ('
            'fun (num) (bool)) (bool)) !) (l (v (num) n) (a (a (c (fun (bool) ('
            'fun (bool) (bool))) ==>) (a (a (c (fun (num) (fun (num) (bool))) '
            '<=) (v (num) m)) (v (num) n))) (a (c (fun (fun (cart (real) M) '
            '(bool)) (bool)) compact) (a (v (fun (num) (fun (cart (real) M) (bool'
            '))) s) (v (num) n))))))) (a (c (fun (fun (num) (bool)) (bool)) !) ('
            'l (v (num) n) (a (a (c (fun (bool) (fun (bool) (bool))) ==>) (a (a '
            '(c (fun (num) (fun (num) (bool))) <=) (v (num) m)) (v (num) n))) (a '
            '(a (c (fun (fun (cart (real) M) (bool)) (fun (fun (cart (real) M) '
            '(bool)) (bool))) SUBSET) (a (v (fun (num) (fun (cart (real) M) (bool'
            '))) s) (a (c (fun (num) (num)) SUC) (v (num) n)))) (a (v (fun (num) '
            '(fun (cart (real) M) (bool))) s) (v (num) n))))))))) (a (a (c (fun ('
            'fun (cart (real) N) (bool)) (fun (fun (cart (real) N) (bool)) (bool)'
            ')) =) (a (a (c (fun (fun (cart (real) M) (cart (real) N)) (fun (fun '
            '(cart (real) M) (bool)) (fun (cart (real) N) (bool)))) IMAGE) (v (fun '
            '(cart (real) M) (cart (real) N)) f)) (a (c (fun (fun (fun (cart (real'
            ') M) (bool)) (bool)) (fun (cart (real) M) (bool))) INTERS) (a (c ('
            'fun (fun (fun (cart (real) M) (bool)) (bool)) (fun (fun (cart (real) '
            'M) (bool)) (bool))) GSPEC) (l (v (fun (cart (real) M) (bool)) GEN%PVA'
            'R%0) (a (c (fun (fun (num) (bool)) (bool)) ?) (l (v (num) n) (a (a (a '
            '(c (fun (fun (cart (real) M) (bool)) (fun (bool) (fun (fun (cart (real'
            ') M) (bool)) (bool)))) SETSPEC) (v (fun (cart (real) M) (bool)) GEN%PV'
            'AR%0)) (a (a (c (fun (num) (fun (num) (bool))) <=) (v (num) m)) (v (nu'
            'm) n))) (a (v (fun (num) (fun (cart (real) M) (bool))) s) (v (num) n))'
            ')))))))) (a (c (fun (fun (fun (cart (real) N) (bool)) (bool)) (fun (c'
            'art (real) N) (bool))) INTERS) (a (c (fun (fun (fun (cart (real) N) (b'
            'ool)) (bool)) (fun (fun (cart (real) N) (bool)) (bool))) GSPEC) (l (v '
            '(fun (cart (real) N) (bool)) GEN%PVAR%0) (a (c (fun (fun (num) (bool)'
            ') (bool)) ?) (l (v (num) n) (a (a (a (c (fun (fun (cart (real) N) (boo'
            'l)) (fun (bool) (fun (fun (cart (real) N) (bool)) (bool)))) SETSPEC) '
            '(v (fun (cart (real) N) (bool)) GEN%PVAR%0)) (a (a (c (fun (num) (fun '
            '(num) (bool))) <=) (v (num) m)) (v (num) n))) (a (a (c (fun (fun '
            '(cart (real) M) (cart (real) N)) (fun (fun (cart (real) M) (bool)) ('
            'fun (cart (real) N) (bool)))) IMAGE) (v (fun (cart (real) M) (cart ('
            'real) N)) f)) (a (v (fun (num) (fun (cart (real) M) (bool))) s) (v (n'
            'um) n)))))))))))))))))')
        g.add_sexp(
            '(a (c (fun (fun (net ?0) (bool)) (bool)) !) (l (v (net ?0) net) (a (c '
            '(fun (fun (cart (real) ?1) (bool)) (bool)) !) (l (v (cart (real) ?1) '
            'c) (a (a (c (fun (fun ?0 (cart (real) ?1)) (fun (net ?0) (bool))) cont'
            'inuous) (l (v ?0 x) (v (cart (real) ?1) c))) (v (net ?0) net))))))'
        )
        g.add_sexp(
            '(a (c (fun (fun (fun ?0 (cart (real) ?1)) (bool)) (bool)) !) (l (v '
            '(fun ?0 (cart (real) ?1)) f) (a (c (fun (fun (real) (bool)) (bool)) '
            '!) (l (v (real) c) (a (c (fun (fun (net ?0) (bool)) (bool)) !) (l (v '
            '(net ?0) net) (a (a (c (fun (bool) (fun (bool) (bool))) ==>) (a (a (c '
            '(fun (fun ?0 (cart (real) ?1)) (fun (net ?0) (bool))) continuous) (v ('
            'fun ?0 (cart (real) ?1)) f)) (v (net ?0) net))) (a (a (c (fun (fun ?0 '
            '(cart (real) ?1)) (fun (net ?0) (bool))) continuous) (l (v ?0 x) (a ('
            'a (c (fun (real) (fun (cart (real) ?1) (cart (real) ?1))) %) (v (real'
            ') c)) (a (v (fun ?0 (cart (real) ?1)) f) (v ?0 x))))) (v (net ?0) net)'
            '))))))))')
        g.add_sexp(
            '(a (c (fun (fun (fun ?0 (cart (real) ?1)) (bool)) (bool)) !) (l (v (fu'
            'n ?0 (cart (real) ?1)) f) (a (c (fun (fun (net ?0) (bool)) (bool)) !) '
            '(l (v (net ?0) net) (a (a (c (fun (bool) (fun (bool) (bool))) ==>) (a '
            '(a (c (fun (fun ?0 (cart (real) ?1)) (fun (net ?0) (bool))) continuous'
            ') (v (fun ?0 (cart (real) ?1)) f)) (v (net ?0) net))) (a (a (c (fun (f'
            'un ?0 (cart (real) ?1)) (fun (net ?0) (bool))) continuous) (l (v ?0 x'
            ') (a (c (fun (cart (real) ?1) (cart (real) ?1)) vector_neg) (a (v (fu'
            'n ?0 (cart (real) ?1)) f) (v ?0 x))))) (v (net ?0) net)))))))')
        g.add_sexp(
            '(a (c (fun (fun (fun ?0 (cart (real) ?1)) (bool)) (bool)) !) (l (v (fu'
            'n ?0 (cart (real) ?1)) f) (a (c (fun (fun (fun ?0 (cart (real) ?1)) (b'
            'ool)) (bool)) !) (l (v (fun ?0 (cart (real) ?1)) g) (a (c (fun (fun (n'
            'et ?0) (bool)) (bool)) !) (l (v (net ?0) net) (a (a (c (fun (bool) (fu'
            'n (bool) (bool))) ==>) (a (a (c (fun (bool) (fun (bool) (bool))) /\\) '
            '(a (a (c (fun (fun ?0 (cart (real) ?1)) (fun (net ?0) (bool))) continu'
            'ous) (v (fun ?0 (cart (real) ?1)) f)) (v (net ?0) net))) (a (a (c (fun'
            ' (fun ?0 (cart (real) ?1)) (fun (net ?0) (bool))) continuous) (v (fun '
            '?0 (cart (real) ?1)) g)) (v (net ?0) net)))) (a (a (c (fun (fun ?0 (ca'
            'rt (real) ?1)) (fun (net ?0) (bool))) continuous) (l (v ?0 x) (a (a (c'
            ' (fun (cart (real) ?1) (fun (cart (real) ?1) (cart (real) ?1))) vector'
            '_add) (a (v (fun ?0 (cart (real) ?1)) f) (v ?0 x))) (a (v (fun ?0 (car'
            't (real) ?1)) g) (v ?0 x))))) (v (net ?0) net)))))))))')
        self.assertLen(g.labels, 479)
    def test_add_theorem(self, theorem, expected_val):

        g = sexpression_graphs.SExpressionGraph(theorem)
        self.assertLen(g.roots(), 1)
        self.assertEqual(g.to_text(g.roots()[0]), expected_val)
 def test_is_not_empty_string(self):
     g = sexpression_graphs.SExpressionGraph()
     g.add_sexp(['asdf', ''])
     self.assertFalse(g.is_empty_string())
 def test_empty_post_order(self):
     o = sexpression_graphs.SExpressionGraph().global_post_order()
     self.assertEmpty(o)
 def test_to_text_subexpressions(self):
     """Check if subexpressions can be retrieved."""
     g = sexpression_graphs.SExpressionGraph('(fun (prod A A) (bool))')
     subexpression = '(prod A A)'
     subexp_id = sexpression_graphs.to_node_id(subexpression)
     self.assertEqual(g.to_text(subexp_id), subexpression)
 def test_init_empty_list(self):
     g = sexpression_graphs.SExpressionGraph([])
     self.assertEmpty(g.labels)
     self.assertEmpty(g.parents)
     self.assertEmpty(g.children)
 def test_none(self):
     g = sexpression_graphs.SExpressionGraph(None)
     self.assertEmpty(g.labels)
     self.assertEmpty(g.parents)
     self.assertEmpty(g.children)