Ejemplo n.º 1
0
 def test_shared_nodes_in_different_branches(self):
     tree = self.tree
     root = tree.nodes[0]
     gen = mock_generator(('ay', 1.0), ('ax', 2.0))
     prover_util.try_tactics(root, 10, 0, 10, MOCK_PREMISE_SET, gen)
     self.assertEqual(len(tree.nodes), 3)
     self.assertEqual(str(tree.nodes[1].goal.conclusion), 'cx')
     self.assertEqual(str(tree.nodes[2].goal.conclusion), 'cy')
     gen = mock_generator(('rz', 1.0))
     prover_util.try_tactics(tree.nodes[1], 10, 0, 10, MOCK_PREMISE_SET,
                             gen)
     self.assertEqual(len(tree.nodes), 4)
     self.assertEqual(tree.nodes[3].closed, None)
     self.assertEqual(tree.nodes[2].closed, None)
     self.assertEqual(tree.nodes[1].closed, False)
     self.assertEqual(tree.nodes[0].closed, False)
     gen = mock_generator(('rz', 1.0))
     prover_util.try_tactics(tree.nodes[2], 10, 0, 10, MOCK_PREMISE_SET,
                             gen)
     self.assertEqual(len(tree.nodes), 4)
     self.assertEqual(len(tree.nodes[3].parents), 2)
     self.assertEqual(tree.nodes[3].closed, None)
     self.assertEqual(tree.nodes[2].closed, False)
     self.assertEqual(tree.nodes[1].closed, False)
     self.assertEqual(tree.nodes[0].closed, False)
     gen = mock_generator(('c', 1.0))
     prover_util.try_tactics(tree.nodes[3], 10, 0, 10, MOCK_PREMISE_SET,
                             gen)
     self.assertEqual(len(tree.nodes), 4)
     self.assertEqual(tree.nodes[3].closed, True)
     self.assertEqual(tree.nodes[2].closed, True)
     self.assertEqual(tree.nodes[1].closed, True)
     self.assertEqual(tree.nodes[0].closed, True)
     proof_search_tree.check_tree_consistency(tree)
     self.check_log_consistency()
Ejemplo n.º 2
0
 def test_apply_one_and_close(self):
     tree = self.tree
     root = tree.nodes[0]
     gen = mock_generator(('axy', 1.0))
     prover_util.try_tactics(root, 10, 0, 10, MOCK_PREMISE_SET, gen)
     self.assertEqual(len(tree.nodes), 2)
     node = tree.nodes[1]
     gen = mock_generator(('c', 1.0))
     prover_util.try_tactics(node, 10, 0, 10, MOCK_PREMISE_SET, gen)
     self.assertEqual(len(tree.nodes), 2)
     self.assertEqual(tree.nodes[1].closed, True)
     self.assertEqual(tree.nodes[0].closed, True)
     proof_search_tree.check_tree_consistency(tree)
     self.check_log_consistency()
Ejemplo n.º 3
0
    def prove_one(self, tree: proof_search_tree.ProofSearchTree,
                  task: proof_assistant_pb2.ProverTask) -> Optional[Text]:
        """Searches for a proof via BFS.

    Args:
      tree: Search tree with a single goal node to be proved.
      task: ProverTask to be performed.

    Returns:
      None on success and error message on failure.
    """
        root = tree.nodes[0]
        nodes_explored = 0
        # Note that adding new node to the tree might re-enable previous nodes
        # for tactic applications, if they were marked to be ignored by
        # failing sibling nodes.
        tree.cur_index = 0
        while not self.timed_out(
        ) and not root.closed and not root.failed and (
                nodes_explored < self.options.max_explored_nodes):
            if tree.cur_index >= len(tree.nodes):
                return 'BFS: All nodes are failed or ignored.'
            node = tree.nodes[tree.cur_index]
            tree.cur_index += 1
            if node.ignore or node.failed or node.closed or node.processed:
                continue
            nodes_explored += 1
            # Note that the following function might change tree.cur_index
            # (if a node that was ignored suddenly becomes subgoal of a new
            # tactic application).
            prover_util.try_tactics(node, self.options.max_top_suggestions,
                                    self.options.min_successful_branches,
                                    self.options.max_successful_branches,
                                    task.premise_set, self.action_gen,
                                    self.prover_options.tactic_timeout_ms)
        root_status = ' '.join([
            p[0] for p in [('closed', root.closed), ('failed', root.failed)]
            if p[1]
        ])
        tf.logging.info('Timeout: %s root status: %s explored: %d',
                        str(self.timed_out()), root_status, nodes_explored)
        if self.timed_out():
            return 'BFS: Timeout.'
        elif root.failed:
            return 'BFS: Root Failed.'
        elif nodes_explored >= self.options.max_explored_nodes and not root.closed:
            return 'BFS: Node limit reached.'
Ejemplo n.º 4
0
 def test_apply_one_tactic(self):
     tree = self.tree
     root = tree.nodes[0]
     gen = mock_generator(('axy', 1.0))
     prover_util.try_tactics(root, 10, 0, 10, MOCK_PREMISE_SET, gen)
     self.assertEqual(len(tree.nodes), 2)
     for i, node in enumerate(tree.nodes):
         self.assertEqual(node.index, i)
     node = tree.nodes[1]
     self.assertEqual(len(node.parents), 1)
     self.assertEqual(str(node.goal.conclusion), 'cxy')
     self.assertEqual(len(root.successful_attempts), 1)
     self.assertEqual(len(root.failed_attempts), 0)
     self.assertEqual(root.closed, False)
     self.assertEqual(node.closed, None)
     proof_search_tree.check_tree_consistency(tree)
     self.check_log_consistency()
Ejemplo n.º 5
0
    def prove_one(self, tree: proof_search_tree.ProofSearchTree,
                  task: proof_assistant_pb2.ProverTask) -> Optional[Text]:
        """Searches for a proof without backtracking.

    Args:
      tree: Search tree with a single goal node to be proved.
      task: ProverTask to be performed.

    Returns:
      None on success and error message on failure.
    """
        root = tree.nodes[0]
        budget = NO_BACKTRACK_SEARCH_NODES
        cur_index = 0
        while not root.closed and not self.timed_out():
            if cur_index >= len(tree.nodes):
                # This situation can happen only if the tactics succeed, but end up
                # reconstructing an earlier node.
                return 'NoBacktrack: Loop.'
            node = tree.nodes[cur_index]
            cur_index += 1
            prover_util.try_tactics(node, budget, 0, 1, task.premise_set,
                                    self.action_gen,
                                    self.prover_options.tactic_timeout_ms)
            if not node.successful_attempts:
                return (
                    'NoBacktrack: No successful tactic applications within '
                    'limit %d' % budget)
            else:
                if len(node.successful_attempts) != 1:
                    tf.logging.info('%d successful attempts.',
                                    len(node.successful_attempts))
                    for tac_app in node.successful_attempts:
                        tf.logging.info('attempt: %s', tac_app.tactic)
                assert len(node.successful_attempts) == 1
                budget -= len(node.failed_attempts) + 1
        if not root.closed:
            if self.timed_out():
                return 'Timed out.'
            else:
                return 'NoBacktrack: Could not find proof.'
Ejemplo n.º 6
0
 def test_apply_two_in_a_row_and_close(self):
     tree = self.tree
     root = tree.nodes[0]
     gen = mock_generator(('axy', 1.0))
     prover_util.try_tactics(root, 10, 0, 10, MOCK_PREMISE_SET, gen)
     self.assertEqual(len(tree.nodes), 2)
     node = tree.nodes[1]
     gen = mock_generator(('az', 1.0))
     prover_util.try_tactics(node, 10, 0, 10, MOCK_PREMISE_SET, gen)
     self.assertEqual(len(tree.nodes), 3)
     node = tree.nodes[2]
     self.assertEqual(str(node.goal.conclusion), 'cxyz')
     gen = mock_generator(('c', 1.0))
     prover_util.try_tactics(node, 10, 0, 10, MOCK_PREMISE_SET, gen)
     self.assertEqual(len(tree.nodes), 3)
     self.assertEqual(tree.nodes[2].closed, True)
     self.assertEqual(tree.nodes[1].closed, True)
     self.assertEqual(tree.nodes[0].closed, True)
     proof_search_tree.check_tree_consistency(tree)
     self.check_log_consistency()
Ejemplo n.º 7
0
 def test_apply_two_different_and_close_one(self):
     tree = self.tree
     root = tree.nodes[0]
     gen = mock_generator(('ay', 1.0), ('ax', 2.0))
     prover_util.try_tactics(root, 10, 0, 10, MOCK_PREMISE_SET, gen)
     self.assertEqual(len(tree.nodes), 3)
     self.assertEqual(str(tree.nodes[1].goal.conclusion), 'cx')
     self.assertEqual(str(tree.nodes[2].goal.conclusion), 'cy')
     gen = mock_generator(('c', 1.0))
     prover_util.try_tactics(tree.nodes[1], 10, 0, 10, MOCK_PREMISE_SET,
                             gen)
     self.assertEqual(tree.nodes[2].closed, None)
     self.assertEqual(tree.nodes[1].closed, True)
     self.assertEqual(tree.nodes[0].closed, True)
     gen = mock_generator(('c', 1.0))
     prover_util.try_tactics(tree.nodes[2], 10, 0, 10, MOCK_PREMISE_SET,
                             gen)
     self.assertEqual(tree.nodes[2].closed, True)
     self.assertEqual(tree.nodes[0].closed, True)
     proof_search_tree.check_tree_consistency(tree)
     self.check_log_consistency()
 def test_apply_two_in_parallel_and_close_both(self):
     tree = self.tree
     root = tree.nodes[0]
     gen = mock_generator(('bxy', 1.0))
     prover_util.try_tactics(root, 10, 0, 10, MOCK_PREMISE_SET, gen,
                             PER_TACTIC_TIMEOUT_MS)
     self.assertEqual(len(tree.nodes), 3)
     self.assertEqual(str(tree.nodes[1].goal.conclusion), 'cx')
     self.assertEqual(str(tree.nodes[2].goal.conclusion), 'cy')
     gen = mock_generator(('c', 1.0))
     prover_util.try_tactics(tree.nodes[1], 10, 0, 10, MOCK_PREMISE_SET,
                             gen, PER_TACTIC_TIMEOUT_MS)
     self.assertEqual(tree.nodes[2].closed, None)
     self.assertEqual(tree.nodes[1].closed, True)
     self.assertEqual(tree.nodes[0].closed, False)
     gen = mock_generator(('c', 1.0))
     prover_util.try_tactics(tree.nodes[2], 10, 0, 10, MOCK_PREMISE_SET,
                             gen, PER_TACTIC_TIMEOUT_MS)
     self.assertEqual(tree.nodes[2].closed, True)
     self.assertEqual(tree.nodes[0].closed, True)
     proof_search_tree.check_tree_consistency(tree)
     self.check_log_consistency()