Example #1
0
class Goviaji:
    def __init__(self, file_name):
        self.proof_steps_budget = 10000
        self.max_eval_steps = 1000
        self.prover_cache = {}
        self.compiler = Compiler()
        self.compiler.compile_file(file_name)
        self.compiler.finalize()
        self.syntax_predicate_name = self.compiler.rules_db.constants["term"] \
            if "term" in self.compiler.rules_db.constants else None

        self.value_predicate_name = self.compiler.rules_db.constants["value"] \
            if "value" in self.compiler.rules_db.constants else None

        self.eval_predicate_name = self.compiler.rules_db.constants["eval"] \
            if "eval" in self.compiler.rules_db.constants else None

        print("%d rules loaded: %s" %
              (len(self.compiler.rules_db.rules_by_name), ", ".join(
                  rn.name
                  for rn in self.compiler.rules_db.rules_by_name.keys())))

        print("%d defs loaded: %s" %
              (len(self.compiler.rules_db.definitions), ", ".join(
                  rn.name
                  for rn in self.compiler.rules_db.definitions.keys())))

        print("%d outputs loaded: %s" %
              (len(self.compiler.expressions_to_print), ", ".join(
                  rn.name
                  for rn in self.compiler.expressions_to_print.keys())))

    def property_check(self, expr, property_name):
        test_proposition = [expression_from_list([property_name, expr])]
        steps, subs = next(
            prover.prove_dfs(self.compiler.rules_db, test_proposition,
                             self.proof_steps_budget, self.prover_cache))
        return steps, subs is not None

    def syntax_check(self, expr):
        return self.property_check(expr, self.syntax_predicate_name)

    def value_check(self, expr):
        return self.property_check(expr, self.value_predicate_name)

    def eval_step(self, expr):
        target_var = self.compiler.rules_db.introduce_variable()
        eval_proposition = [
            expression_from_list([self.eval_predicate_name, expr, target_var])
        ]
        steps, subs = next(
            prover.prove_dfs(self.compiler.rules_db, eval_proposition,
                             self.proof_steps_budget, self.prover_cache))

        return steps, subs.replacements[
            target_var] if subs is not None else subs

    def steps_report(self, num_steps):
        return "[%d steps%s]" % (num_steps, " - stopped" *
                                 (num_steps >= self.proof_steps_budget))

    def str_to_expression(self, s):
        tokens = tokenize(s)
        parsed_expr = parse_expression(tokens)
        return self.compiler.compile_expression(parsed_expr, tokens)