static void get_interpolant_and_maybe_check(cmd_context & ctx, expr * t, params_ref &m_params, bool check) { check_can_interpolate(ctx); // get the proof, if there is one if (!ctx.has_manager() || ctx.cs_state() != cmd_context::css_unsat) throw cmd_exception("proof is not available"); expr_ref pr(ctx.m()); pr = ctx.get_check_sat_result()->get_proof(); if (pr == 0) throw cmd_exception("proof is not available"); // get the assertions from the context ptr_vector<expr>::const_iterator it = ctx.begin_assertions(); ptr_vector<expr>::const_iterator end = ctx.end_assertions(); ptr_vector<ast> cnsts((unsigned)(end - it)); for (int i = 0; it != end; ++it, ++i) cnsts[i] = *it; // compute an interpolant ptr_vector<ast> interps; try { iz3interpolate(ctx.m(),pr.get(),cnsts,t,interps,0); } catch (iz3_bad_tree &) { throw cmd_exception("interpolation pattern contains non-asserted formula"); } catch (iz3_incompleteness &) { throw cmd_exception("incompleteness in interpolator"); } show_interpolant_and_maybe_check(ctx, cnsts, t, interps, m_params, check); }