/* Copyright (c) 2013 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #include "util/sstream.h" #include "library/tactic/proof_state.h" namespace lean { precision mk_union(precision p1, precision p2) { if (p1 == p2) return p1; else if (p1 == precision::Precise) return p2; else if (p2 == precision::Precise) return p1; else return precision::UnderOver; } bool trust_proofs(precision p) { return p == precision::Precise || p == precision::Over; } bool trust_cex(precision p) { return p == precision::Precise || p == precision::Under; } format proof_state::pp(formatter const & fmt, options const & opts) const { format r; bool first = true; for (auto const & p : get_goals()) { if (first) first = false; else r += line(); r += p.second.pp(fmt, opts); } return r; } static name g_main("main"); proof_state to_proof_state(environment const & env, context const & ctx, expr const & t) { auto gfn = to_goal(env, ctx, t); goal g = gfn.first; goal_proof_fn fn = gfn.second; proof_builder pr_builder = mk_proof_builder( [=](proof_map const & m, assignment const &) -> expr { return fn(find(m, g_main)); }); cex_builder cex_builder = mk_cex_builder( [](name const & n, optional const & cex, assignment const &) -> counterexample { if (n != g_main || !cex) throw exception(sstream() << "failed to build counterexample for '" << g_main << "' goal"); return *cex; }); return proof_state(goals(mk_pair(g_main, g)), metavar_env(), pr_builder, cex_builder); } }