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)