feat(kernel, library/elaborator, frontends/lean): improve how elaborator_exceptions are displayed in the Lean frontend

This commit affects different modules.
I used the following approach:
1- I store the metavariable environment at unification_failure_justifications. The idea is to capture the set of instantiated metavariables at the time of failure.
2- I added a remove_detail function. It removes propagation steps from the justification tree object. I also remove the backtracking search space associated with higher-order unificiation. I keep only the search related to case-splits due to coercions and overloads.

3- I use the metavariable environment captured at step 1 when pretty printing the justification of an elaborator_exception.

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2014-01-03 17:13:10 -08:00
parent 03cf9be8b5
commit 9eb4dc4a81
18 changed files with 315 additions and 991 deletions

View file

@ -80,9 +80,9 @@ class coercion_justification_cell : public justification_cell {
public:
coercion_justification_cell(context const & c, expr const & src):m_ctx(c), m_src(src) {}
virtual ~coercion_justification_cell() {}
virtual format pp_header(formatter const & fmt, options const & opts) const {
virtual format pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const {
unsigned indent = get_pp_indent(opts);
format expr_fmt = fmt(m_ctx, m_src, false, opts);
format expr_fmt = fmt(m_ctx, instantiate_metavars(menv, m_src), false, opts);
format r;
r += format("Coercion for");
r += nest(indent, compose(line(), expr_fmt));
@ -99,9 +99,9 @@ class overload_justification_cell : public justification_cell {
public:
overload_justification_cell(context const & c, expr const & app):m_ctx(c), m_app(app) {}
virtual ~overload_justification_cell() {}
virtual format pp_header(formatter const & fmt, options const & opts) const {
virtual format pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const {
unsigned indent = get_pp_indent(opts);
format expr_fmt = fmt(m_ctx, m_app, false, opts);
format expr_fmt = fmt(m_ctx, instantiate_metavars(menv, m_app), false, opts);
format r;
r += format("Overloading at");
r += nest(indent, compose(line(), expr_fmt));

View file

@ -7,6 +7,7 @@ Author: Leonardo de Moura
#include <utility>
#include "kernel/kernel_exception.h"
#include "library/io_state_stream.h"
#include "library/elaborator/elaborator_justification.h"
#include "frontends/lean/parser_imp.h"
namespace lean {
@ -69,7 +70,9 @@ void parser_imp::display_error(elaborator_exception const & ex) {
formatter fmt = m_io_state.get_formatter();
options opts = m_io_state.get_options();
lean_pos_info_provider pos_provider(*this);
regular(m_io_state) << mk_pair(ex.get_justification().pp(fmt, opts, &pos_provider, true), opts) << endl;
auto j = ex.get_justification();
j = remove_detail(j);
regular(m_io_state) << mk_pair(j.pp(fmt, opts, &pos_provider, true), opts) << endl;
}
void parser_imp::display_error(script_exception const & ex) {

View file

@ -7,6 +7,7 @@ Author: Leonardo de Moura
#include <vector>
#include "util/buffer.h"
#include "kernel/justification.h"
#include "kernel/metavar.h"
namespace lean {
void justification_cell::add_pos_info(format & r, optional<expr> const & e, pos_info_provider const * p) {
@ -19,16 +20,17 @@ void justification_cell::add_pos_info(format & r, optional<expr> const & e, pos_
r += space();
}
format justification_cell::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool display_children) const {
format justification_cell::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool display_children,
optional<metavar_env> const & menv) const {
format r;
add_pos_info(r, get_main_expr(), p);
r += pp_header(fmt, opts);
r += pp_header(fmt, opts, menv);
if (display_children) {
buffer<justification_cell *> children;
get_children(children);
unsigned indent = get_pp_indent(opts);
for (justification_cell * child : children) {
r += nest(indent, compose(line(), child->pp(fmt, opts, p, display_children)));
r += nest(indent, compose(line(), child->pp(fmt, opts, p, display_children, menv)));
}
}
return r;
@ -39,14 +41,24 @@ bool justification::has_children() const {
get_children(r);
return !r.empty();
}
format justification::pp(formatter const & fmt, options const & opts, pos_info_provider const * p,
bool display_children, optional<metavar_env> const & menv) const {
lean_assert(m_ptr);
return m_ptr->pp(fmt, opts, p, display_children, menv);
}
format justification::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool display_children) const {
lean_assert(m_ptr);
return m_ptr->pp(fmt, opts, p, display_children, optional<metavar_env>());
}
assumption_justification::assumption_justification(unsigned idx):m_idx(idx) {}
void assumption_justification::get_children(buffer<justification_cell*> &) const {}
optional<expr> assumption_justification::get_main_expr() const { return none_expr(); }
format assumption_justification::pp_header(formatter const &, options const &) const {
format assumption_justification::pp_header(formatter const &, options const &, optional<metavar_env> const &) const {
return format{format("Assumption"), space(), format(m_idx)};
}
bool depends_on(justification const & t, justification const & d) {
buffer<justification_cell *> todo;
buffer<justification_cell *> children;

View file

@ -15,6 +15,7 @@ Author: Leonardo de Moura
#include "kernel/pos_info_provider.h"
namespace lean {
class metavar_env;
class justification;
/**
\brief Base class used to represent justification objects.
@ -30,8 +31,9 @@ protected:
public:
justification_cell():m_rc(0) {}
virtual ~justification_cell() {}
virtual format pp_header(formatter const & fmt, options const & opts) const = 0;
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool display_children) const;
virtual format pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const = 0;
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p,
bool display_children, optional<metavar_env> const & menv) const;
virtual void get_children(buffer<justification_cell*> & r) const = 0;
virtual optional<expr> get_main_expr() const { return none_expr(); }
bool is_shared() const { return get_rc() > 1; }
@ -46,7 +48,7 @@ public:
assumption_justification(unsigned idx);
virtual void get_children(buffer<justification_cell*> &) const;
virtual optional<expr> get_main_expr() const;
virtual format pp_header(formatter const &, options const &) const;
virtual format pp_header(formatter const &, options const &, optional<metavar_env> const & menv) const;
};
/**
@ -69,10 +71,9 @@ public:
justification & operator=(justification const & s) { LEAN_COPY_REF(s); }
justification & operator=(justification && s) { LEAN_MOVE_REF(s); }
format pp(formatter const & fmt, options const & opts, pos_info_provider const * p = nullptr, bool display_children = true) const {
lean_assert(m_ptr);
return m_ptr->pp(fmt, opts, p, display_children);
}
format pp(formatter const & fmt, options const & opts, pos_info_provider const * p,
bool display_children, optional<metavar_env> const & menv) const;
format pp(formatter const & fmt, options const & opts, pos_info_provider const * p = nullptr, bool display_children = true) const;
optional<expr> get_main_expr() const { return m_ptr ? m_ptr->get_main_expr() : none_expr(); }
void get_children(buffer<justification_cell*> & r) const { if (m_ptr) m_ptr->get_children(r); }
bool has_children() const;

View file

@ -35,9 +35,9 @@ public:
std::reverse(m_jsts.begin(), m_jsts.end());
}
virtual format pp_header(formatter const & fmt, options const & opts) const {
virtual format pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const {
unsigned indent = get_pp_indent(opts);
format expr_fmt = fmt(m_ctx, m_expr, false, opts);
format expr_fmt = fmt(instantiate_metavars(menv, m_ctx), instantiate_metavars(menv, m_expr), false, opts);
format r;
r += format("Normalize assignment");
r += nest(indent, compose(line(), expr_fmt));
@ -406,6 +406,24 @@ expr metavar_env_cell::instantiate_metavars(expr const & e, buffer<justification
}
}
context metavar_env_cell::instantiate_metavars(context const & ctx) const {
buffer<context_entry> new_entries;
auto it = ctx.begin();
auto end = ctx.end();
for (; it != end; ++it) {
auto n = it->get_name();
auto d = it->get_domain();
auto b = it->get_body();
if (d && b)
new_entries.emplace_back(n, instantiate_metavars(*d), instantiate_metavars(*b));
else if (d)
new_entries.emplace_back(n, instantiate_metavars(*d));
else
new_entries.emplace_back(n, none_expr(), instantiate_metavars(*b));
}
return context(new_entries.size(), new_entries.data());
}
bool cached_metavar_env::update(optional<metavar_env> const & menv) {
if (!menv) {
m_menv = none_menv();

View file

@ -131,7 +131,7 @@ public:
\pre !is_assigned(m)
\remark The method returns false if the assignment cannot be performed
because \c t contain free variables that are not available in the context
because \c t contain free variables that are not available in the context
associated with \c m.
*/
bool assign(name const & m, expr const & t, justification const & j);
@ -141,9 +141,9 @@ public:
\brief Assign metavariable \c m to \c t.
\remark The method returns false if the assignment cannot be performed
because \c t contain free variables that are not available in the context
because \c t contain free variables that are not available in the context
associated with \c m.
\pre is_metavar(m)
\pre !has_meta_context(m)
\pre !is_assigned(m)
@ -193,6 +193,7 @@ public:
buffer<justification> tmp;
return instantiate_metavars(e, tmp);
}
context instantiate_metavars(context const & ctx) const;
};
/**
@ -224,6 +225,20 @@ inline optional<metavar_env> none_menv() { return optional<metavar_env>(); }
inline optional<metavar_env> some_menv(metavar_env const & e) { return optional<metavar_env>(e); }
inline optional<metavar_env> some_menv(metavar_env && e) { return optional<metavar_env>(std::forward<metavar_env>(e)); }
inline expr instantiate_metavars(optional<metavar_env> const & menv, expr const & e) {
if (menv)
return (*menv)->instantiate_metavars(e);
else
return e;
}
inline context instantiate_metavars(optional<metavar_env> const & menv, context const & ctx) {
if (menv)
return (*menv)->instantiate_metavars(ctx);
else
return ctx;
}
/**
\brief Read-only reference to metavariable environment (cell).
*/

View file

@ -5,15 +5,15 @@ Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#include "kernel/type_checker_justification.h"
#include "kernel/metavar.h"
namespace lean {
function_expected_justification_cell::~function_expected_justification_cell() {
}
format function_expected_justification_cell::pp_header(formatter const & fmt, options const & opts) const {
format function_expected_justification_cell::pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const {
unsigned indent = get_pp_indent(opts);
format expr_fmt = fmt(m_ctx, m_app, false, opts);
format expr_fmt = fmt(instantiate_metavars(menv, m_ctx), instantiate_metavars(menv, m_app), false, opts);
format r;
r += format("Function expected at");
r += nest(indent, compose(line(), expr_fmt));
@ -30,13 +30,14 @@ optional<expr> function_expected_justification_cell::get_main_expr() const {
app_type_match_justification_cell::~app_type_match_justification_cell() {
}
format app_type_match_justification_cell::pp_header(formatter const & fmt, options const & opts) const {
format app_type_match_justification_cell::pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const {
unsigned indent = get_pp_indent(opts);
format r;
r += format("Type of argument ");
r += format(m_i);
r += format(" must be convertible to the expected type in the application of");
r += nest(indent, compose(line(), fmt(m_ctx, arg(m_app, 0), false, opts)));
expr new_app = instantiate_metavars(menv, m_app);
r += nest(indent, compose(line(), fmt(instantiate_metavars(menv, m_ctx), arg(new_app, 0), false, opts)));
unsigned num = num_args(m_app);
r += line();
if (num == 2)
@ -44,7 +45,7 @@ format app_type_match_justification_cell::pp_header(formatter const & fmt, optio
else
r += format("with arguments:");
for (unsigned i = 1; i < num; i++)
r += nest(indent, compose(line(), fmt(m_ctx, arg(m_app, i), false, opts)));
r += nest(indent, compose(line(), fmt(m_ctx, arg(new_app, i), false, opts)));
return r;
}
@ -58,9 +59,9 @@ optional<expr> app_type_match_justification_cell::get_main_expr() const {
type_expected_justification_cell::~type_expected_justification_cell() {
}
format type_expected_justification_cell::pp_header(formatter const & fmt, options const & opts) const {
format type_expected_justification_cell::pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const {
unsigned indent = get_pp_indent(opts);
format expr_fmt = fmt(m_ctx, m_type, false, opts);
format expr_fmt = fmt(instantiate_metavars(menv, m_ctx), instantiate_metavars(menv, m_type), false, opts);
format r;
r += format("Type expected at");
r += nest(indent, compose(line(), expr_fmt));
@ -77,7 +78,7 @@ optional<expr> type_expected_justification_cell::get_main_expr() const {
def_type_match_justification_cell::~def_type_match_justification_cell() {
}
format def_type_match_justification_cell::pp_header(formatter const &, options const &) const {
format def_type_match_justification_cell::pp_header(formatter const &, options const &, optional<metavar_env> const &) const {
format r;
r += format("Type of definition '");
r += format(get_name());
@ -95,7 +96,7 @@ optional<expr> def_type_match_justification_cell::get_main_expr() const {
type_match_justification_cell::~type_match_justification_cell() {
}
format type_match_justification_cell::pp_header(formatter const &, options const &) const {
format type_match_justification_cell::pp_header(formatter const &, options const &, optional<metavar_env> const &) const {
return format("Type of expression must be convertible to expected type.");
}

View file

@ -10,6 +10,7 @@ Author: Leonardo de Moura
#include "kernel/context.h"
namespace lean {
class metavar_env;
/**
\brief Justification produced by the type checker when the application \c m_app
is an application <tt>(f ...)</tt>, the type \c T of \c f contains metavariables, and
@ -27,7 +28,7 @@ class function_expected_justification_cell : public justification_cell {
public:
function_expected_justification_cell(context const & c, expr const & app):m_ctx(c), m_app(app) {}
virtual ~function_expected_justification_cell();
virtual format pp_header(formatter const & fmt, options const & opts) const;
virtual format pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const;
virtual void get_children(buffer<justification_cell*> &) const;
virtual optional<expr> get_main_expr() const;
context const & get_context() const { return m_ctx; }
@ -52,7 +53,7 @@ class app_type_match_justification_cell : public justification_cell {
public:
app_type_match_justification_cell(context const & c, expr const & a, unsigned i):m_ctx(c), m_app(a), m_i(i) {}
virtual ~app_type_match_justification_cell();
virtual format pp_header(formatter const & fmt, options const & opts) const;
virtual format pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const;
virtual void get_children(buffer<justification_cell*> &) const;
virtual optional<expr> get_main_expr() const;
context const & get_context() const { return m_ctx; }
@ -75,7 +76,7 @@ class type_expected_justification_cell : public justification_cell {
public:
type_expected_justification_cell(context const & c, expr const & t):m_ctx(c), m_type(t) {}
virtual ~type_expected_justification_cell();
virtual format pp_header(formatter const & fmt, options const & opts) const;
virtual format pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const;
virtual void get_children(buffer<justification_cell*> &) const;
virtual optional<expr> get_main_expr() const;
context const & get_context() const { return m_ctx; }
@ -112,7 +113,7 @@ class def_type_match_justification_cell : public justification_cell {
public:
def_type_match_justification_cell(context const & c, name const & n, expr const & v):m_ctx(c), m_name(n), m_value(v) {}
virtual ~def_type_match_justification_cell();
virtual format pp_header(formatter const & fmt, options const & opts) const;
virtual format pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const;
virtual void get_children(buffer<justification_cell*> &) const;
virtual optional<expr> get_main_expr() const;
context const & get_context() const { return m_ctx; }
@ -131,7 +132,7 @@ class type_match_justification_cell : public justification_cell {
public:
type_match_justification_cell(context const & c, expr const & t, expr const & v):m_ctx(c), m_type(t), m_value(v) {}
virtual ~type_match_justification_cell();
virtual format pp_header(formatter const & fmt, options const & opts) const;
virtual format pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const;
virtual void get_children(buffer<justification_cell*> &) const;
virtual optional<expr> get_main_expr() const;
context const & get_context() const { return m_ctx; }

View file

@ -5,6 +5,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#include "kernel/unification_constraint.h"
#include "kernel/metavar.h"
namespace lean {
unification_constraint_cell::unification_constraint_cell(unification_constraint_kind k, context const & c, justification const & j):
@ -16,25 +17,26 @@ void unification_constraint_cell::dealloc() {
delete this;
}
static format add_context(formatter const & fmt, options const & opts, context const & ctx, format const & body) {
static format add_context(formatter const & fmt, options const & opts, context const & ctx, format const & body, optional<metavar_env> const & menv) {
bool unicode = get_pp_unicode(opts);
format ctx_fmt = fmt(ctx, opts);
format ctx_fmt = fmt(instantiate_metavars(menv, ctx), opts);
format turnstile = unicode ? format("\u22A2") /* ⊢ */ : format("|-");
return group(format{ctx_fmt, space(), turnstile, line(), body});
}
static format add_justification(formatter const & fmt, options const & opts, format const & body, justification const & jst, pos_info_provider const * p, bool include_justification) {
static format add_justification(formatter const & fmt, options const & opts, format const & body, justification const & jst, pos_info_provider const * p, bool include_justification, optional<metavar_env> const & menv) {
if (jst && include_justification) {
unsigned indent = get_pp_indent(opts);
return format{body, line(), format("Justification:"), nest(indent, compose(line(), jst.pp(fmt, opts, p)))};
return format{body, line(), format("Justification:"), nest(indent, compose(line(), jst.pp(fmt, opts, p, true, menv)))};
} else {
return body;
}
}
static format mk_binary(formatter const & fmt, options const & opts, context const & ctx, expr const & lhs, expr const & rhs, format const & op) {
format lhs_fmt = fmt(ctx, lhs, false, opts);
format rhs_fmt = fmt(ctx, rhs, false, opts);
static format mk_binary(formatter const & fmt, options const & opts, context const & ctx, expr const & lhs, expr const & rhs, format const & op,
optional<metavar_env> const & menv) {
format lhs_fmt = fmt(ctx, instantiate_metavars(menv, lhs), false, opts);
format rhs_fmt = fmt(ctx, instantiate_metavars(menv, rhs), false, opts);
return group(format{lhs_fmt, space(), op, line(), rhs_fmt});
}
@ -52,11 +54,12 @@ unification_constraint_eq::unification_constraint_eq(context const & c, expr con
unification_constraint_eq::~unification_constraint_eq() {
}
format unification_constraint_eq::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification) const {
format unification_constraint_eq::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification,
optional<metavar_env> const & menv) const {
format op = mk_unification_op(opts);
format body = mk_binary(fmt, opts, m_ctx, m_lhs, m_rhs, op);
body = add_context(fmt, opts, m_ctx, body);
return add_justification(fmt, opts, body, m_justification, p, include_justification);
format body = mk_binary(fmt, opts, m_ctx, m_lhs, m_rhs, op, menv);
body = add_context(fmt, opts, m_ctx, body, menv);
return add_justification(fmt, opts, body, m_justification, p, include_justification, menv);
}
unification_constraint_convertible::unification_constraint_convertible(context const & c, expr const & from, expr const & to, justification const & j):
@ -68,12 +71,13 @@ unification_constraint_convertible::unification_constraint_convertible(context c
unification_constraint_convertible::~unification_constraint_convertible() {
}
format unification_constraint_convertible::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification) const {
format unification_constraint_convertible::pp(formatter const & fmt, options const & opts, pos_info_provider const * p,
bool include_justification, optional<metavar_env> const & menv) const {
bool unicode = get_pp_unicode(opts);
format op = unicode ? format("\u227A") /* ≺ */ : format("<<");
format body = mk_binary(fmt, opts, m_ctx, m_from, m_to, op);
body = add_context(fmt, opts, m_ctx, body);
return add_justification(fmt, opts, body, m_justification, p, include_justification);
format body = mk_binary(fmt, opts, m_ctx, m_from, m_to, op, menv);
body = add_context(fmt, opts, m_ctx, body, menv);
return add_justification(fmt, opts, body, m_justification, p, include_justification, menv);
}
unification_constraint_max::unification_constraint_max(context const & c, expr const & lhs1, expr const & lhs2, expr const & rhs, justification const & j):
@ -86,14 +90,15 @@ unification_constraint_max::unification_constraint_max(context const & c, expr c
unification_constraint_max::~unification_constraint_max() {
}
format unification_constraint_max::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification) const {
format unification_constraint_max::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification,
optional<metavar_env> const & menv) const {
format op = mk_unification_op(opts);
format lhs1_fmt = fmt(m_ctx, m_lhs1, false, opts);
format lhs2_fmt = fmt(m_ctx, m_lhs2, false, opts);
format rhs_fmt = fmt(m_ctx, m_rhs, false, opts);
format lhs1_fmt = fmt(m_ctx, instantiate_metavars(menv, m_lhs1), false, opts);
format lhs2_fmt = fmt(m_ctx, instantiate_metavars(menv, m_lhs2), false, opts);
format rhs_fmt = fmt(m_ctx, instantiate_metavars(menv, m_rhs), false, opts);
format body = group(format{format("max"), lp(), lhs1_fmt, comma(), nest(4, compose(line(), lhs2_fmt)), rp(), space(), op, line(), rhs_fmt});
body = add_context(fmt, opts, m_ctx, body);
return add_justification(fmt, opts, body, m_justification, p, include_justification);
body = add_context(fmt, opts, m_ctx, body, menv);
return add_justification(fmt, opts, body, m_justification, p, include_justification, menv);
}
unification_constraint_choice::unification_constraint_choice(context const & c, expr const & mvar, unsigned num, expr const * choices, justification const & j):
@ -105,20 +110,30 @@ unification_constraint_choice::unification_constraint_choice(context const & c,
unification_constraint_choice::~unification_constraint_choice() {
}
format unification_constraint_choice::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification) const {
format unification_constraint_choice::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification,
optional<metavar_env> const & menv) const {
bool unicode = get_pp_unicode(opts);
format m_fmt = fmt(m_ctx, m_mvar, false, opts);
format eq_op = mk_unification_op(opts);
format or_op = unicode ? format("\u2295") : format("OR");
format body;
for (unsigned i = 0; i < m_choices.size(); i++) {
body += group(paren(format{m_fmt, space(), eq_op, compose(line(), fmt(m_ctx, m_choices[i], false, opts))}));
body += group(paren(format{m_fmt, space(), eq_op, compose(line(), fmt(m_ctx, instantiate_metavars(menv, m_choices[i]), false, opts))}));
if (i + 1 < m_choices.size())
body += format{space(), or_op, line()};
}
body = group(body);
body = add_context(fmt, opts, m_ctx, body);
return add_justification(fmt, opts, body, m_justification, p, include_justification);
body = add_context(fmt, opts, m_ctx, body, menv);
return add_justification(fmt, opts, body, m_justification, p, include_justification, menv);
}
format unification_constraint::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification,
optional<metavar_env> const & menv) const {
return m_ptr->pp(fmt, opts, p, include_justification, menv);
}
format unification_constraint::pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification) const {
return pp(fmt, opts, p, include_justification, optional<metavar_env>());
}
unification_constraint mk_eq_constraint(context const & c, expr const & lhs, expr const & rhs, justification const & j) {

View file

@ -12,6 +12,8 @@ Author: Leonardo de Moura
#include "kernel/justification.h"
namespace lean {
class metavar_env;
class unification_constraint;
/**
\brief There are four kinds of unification constraints in Lean
@ -47,7 +49,8 @@ public:
unification_constraint_kind kind() const { return m_kind; }
justification const & get_justification() const { return m_justification; }
context const & get_context() const { return m_ctx; }
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification) const = 0;
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification,
optional<metavar_env> const & menv) const = 0;
void set_justification(justification const & j) { lean_assert(!m_justification); m_justification = j; }
};
@ -72,10 +75,9 @@ public:
unification_constraint_kind kind() const { return m_ptr->kind(); }
format pp(formatter const & fmt, options const & opts, pos_info_provider const * p = nullptr, bool include_justification = false) const {
return m_ptr->pp(fmt, opts, p, include_justification);
}
format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification,
optional<metavar_env> const & menv) const;
format pp(formatter const & fmt, options const & opts, pos_info_provider const * p = nullptr, bool include_justification = false) const;
justification const & get_justification() const { return m_ptr->get_justification(); }
void set_justification(justification const & j) { lean_assert(!get_justification()); lean_assert(m_ptr); m_ptr->set_justification(j); }
@ -103,7 +105,8 @@ public:
virtual ~unification_constraint_eq();
expr const & get_lhs() const { return m_lhs; }
expr const & get_rhs() const { return m_rhs; }
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification) const;
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification,
optional<metavar_env> const & menv) const;
};
/**
@ -119,7 +122,8 @@ public:
virtual ~unification_constraint_convertible();
expr const & get_from() const { return m_from; }
expr const & get_to() const { return m_to; }
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification) const;
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification,
optional<metavar_env> const & menv) const;
};
/**
@ -135,7 +139,8 @@ public:
expr const & get_lhs1() const { return m_lhs1; }
expr const & get_lhs2() const { return m_lhs2; }
expr const & get_rhs() const { return m_rhs; }
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification) const;
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification,
optional<metavar_env> const & menv) const;
};
/**
@ -152,7 +157,8 @@ public:
expr const & get_choice(unsigned idx) const { return m_choices[idx]; }
std::vector<expr>::const_iterator begin_choices() const { return m_choices.begin(); }
std::vector<expr>::const_iterator end_choices() const { return m_choices.end(); }
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification) const;
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool include_justification,
optional<metavar_env> const & menv) const;
};
unification_constraint mk_eq_constraint(context const & c, expr const & lhs, expr const & rhs, justification const & j);

View file

@ -392,6 +392,10 @@ class elaborator::imp {
push_updated_constraint(c, new_a, new_b, justification(new normalize_justification(c)));
}
justification mk_failure_justification(unification_constraint const & c) {
return justification(new unification_failure_justification(c, m_state.m_menv.copy()));
}
/**
\brief Assign \c v to \c m with justification \c tr in the current state.
*/
@ -403,7 +407,7 @@ class elaborator::imp {
justification jst(new assignment_justification(c));
metavar_env const & menv = m_state.m_menv;
if (!menv->assign(m, v, jst)) {
m_conflict = justification(new unification_failure_justification(c));
m_conflict = mk_failure_justification(c);
return false;
}
if (menv->has_type(m)) {
@ -453,7 +457,7 @@ class elaborator::imp {
if (!has_local_context(a)) {
// Case 2
if (has_metavar(b, a)) {
m_conflict = justification(new unification_failure_justification(c));
m_conflict = mk_failure_justification(c);
return Failed;
} else if (is_eq(c) || is_proposition(b, ctx)) {
// At this point, we only assign metavariables if the constraint is an equational constraint,
@ -464,7 +468,7 @@ class elaborator::imp {
}
} else {
if (!is_metavar(b) && has_metavar(b, a)) {
m_conflict = justification(new unification_failure_justification(c));
m_conflict = mk_failure_justification(c);
return Failed;
}
local_entry const & me = head(metavar_lctx(a));
@ -496,7 +500,7 @@ class elaborator::imp {
} else if (!has_metavar(b)) {
// Failure, there is no way to unify
// ?m[lift:s:n, ...] with a term that contains variables in [s, s+n]
m_conflict = justification(new unification_failure_justification(c));
m_conflict = mk_failure_justification(c);
return Failed;
}
}
@ -1312,7 +1316,7 @@ class elaborator::imp {
if (m_type_inferer.is_convertible(a, b, ctx)) {
return true;
} else {
m_conflict = justification(new unification_failure_justification(c));
m_conflict = mk_failure_justification(c);
return false;
}
}
@ -1402,14 +1406,14 @@ class elaborator::imp {
if (a == b) {
return true;
} else {
m_conflict = justification(new unification_failure_justification(c));
m_conflict = mk_failure_justification(c);
return false;
}
case expr_kind::Type:
if ((!eq && m_env->is_ge(ty_level(b), ty_level(a))) || (eq && a == b)) {
return true;
} else {
m_conflict = justification(new unification_failure_justification(c));
m_conflict = mk_failure_justification(c);
return false;
}
case expr_kind::App:
@ -1420,7 +1424,7 @@ class elaborator::imp {
push_new_eq_constraint(ctx, arg(a, i), arg(b, i), new_jst);
return true;
} else {
m_conflict = justification(new unification_failure_justification(c));
m_conflict = mk_failure_justification(c);
return false;
}
}
@ -1449,7 +1453,7 @@ class elaborator::imp {
if (a.kind() != b.kind() && !is_metavar(a) && !is_metavar(b) &&
!(is_app(a) && has_metavar(arg(a, 0))) && !(is_app(b) && has_metavar(arg(b, 0)))) {
// std::cout << "CONFLICT: "; display(std::cout, c); std::cout << "\n";
m_conflict = justification(new unification_failure_justification(c));
m_conflict = mk_failure_justification(c);
return false;
}
@ -1528,7 +1532,7 @@ class elaborator::imp {
if ((!has_metavar(lhs1) && !is_type(lhs1)) ||
(!has_metavar(lhs2) && !is_type(lhs2))) {
m_conflict = justification(new unification_failure_justification(c));
m_conflict = mk_failure_justification(c);
return false;
}
// std::cout << "Postponed: "; display(std::cout, c);
@ -1577,7 +1581,8 @@ class elaborator::imp {
return true;
} else {
m_conflict = justification(new unification_failure_by_cases_justification(choice, s.m_failed_justifications.size(),
s.m_failed_justifications.data()));
s.m_failed_justifications.data(),
s.m_prev_state.m_menv));
return false;
}
}
@ -1592,7 +1597,8 @@ class elaborator::imp {
return true;
} else {
m_conflict = justification(new unification_failure_by_cases_justification(s.m_constraint, s.m_failed_justifications.size(),
s.m_failed_justifications.data()));
s.m_failed_justifications.data(),
s.m_prev_state.m_menv));
return false;
}
}
@ -1611,7 +1617,8 @@ class elaborator::imp {
return true;
} catch (exception & ex) {
m_conflict = justification(new unification_failure_by_cases_justification(s.m_constraint, s.m_failed_justifications.size(),
s.m_failed_justifications.data()));
s.m_failed_justifications.data(),
s.m_prev_state.m_menv));
return false;
}
}

View file

@ -21,18 +21,19 @@ void propagation_justification::get_children(buffer<justification_cell*> & r) co
optional<expr> propagation_justification::get_main_expr() const {
return none_expr();
}
format propagation_justification::pp_header(formatter const & fmt, options const & opts) const {
format propagation_justification::pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const {
format r;
r += format(get_prop_name());
r += compose(line(), get_constraint().pp(fmt, opts, nullptr, false));
r += compose(line(), get_constraint().pp(fmt, opts, nullptr, false, menv));
return r;
}
// -------------------------
// Unification failure (by cases)
// -------------------------
unification_failure_by_cases_justification::unification_failure_by_cases_justification(unification_constraint const & c, unsigned num, justification const * cs):
unification_failure_justification(c),
unification_failure_by_cases_justification::unification_failure_by_cases_justification(
unification_constraint const & c, unsigned num, justification const * cs, metavar_env const & menv):
unification_failure_justification(c, menv),
m_cases(cs, cs + num) {
}
unification_failure_by_cases_justification::~unification_failure_by_cases_justification() {
@ -79,7 +80,7 @@ typeof_mvar_justification::typeof_mvar_justification(context const & ctx, expr c
}
typeof_mvar_justification::~typeof_mvar_justification() {
}
format typeof_mvar_justification::pp_header(formatter const & fmt, options const & opts) const {
format typeof_mvar_justification::pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const & menv) const {
format r;
unsigned indent = get_pp_indent(opts);
r += format("Propagate type,");
@ -88,7 +89,7 @@ format typeof_mvar_justification::pp_header(formatter const & fmt, options const
body += fmt(m_context, m_mvar, false, opts);
body += space();
body += colon();
body += nest(indent, compose(line(), fmt(m_context, m_typeof_mvar, false, opts)));
body += nest(indent, compose(line(), fmt(m_context, instantiate_metavars(menv, m_typeof_mvar), false, opts)));
r += nest(indent, compose(line(), body));
}
return group(r);
@ -105,7 +106,7 @@ next_solution_justification::next_solution_justification(unsigned num, justifica
}
next_solution_justification::~next_solution_justification() {
}
format next_solution_justification::pp_header(formatter const &, options const &) const {
format next_solution_justification::pp_header(formatter const &, options const &, optional<metavar_env> const &) const {
return format("next solution");
}
void next_solution_justification::get_children(buffer<justification_cell*> & r) const {
@ -114,4 +115,44 @@ void next_solution_justification::get_children(buffer<justification_cell*> & r)
optional<expr> next_solution_justification::get_main_expr() const {
return none_expr();
}
bool is_derived_constraint(unification_constraint const & uc) {
auto j = uc.get_justification();
return j && dynamic_cast<propagation_justification*>(j.raw());
}
unification_constraint const & get_non_derived_constraint(unification_constraint const & uc) {
auto jcell = uc.get_justification().raw();
if (auto pcell = dynamic_cast<propagation_justification*>(jcell)) {
return get_non_derived_constraint(pcell->get_constraint());
} else {
return uc;
}
}
justification remove_detail(justification const & j) {
auto jcell = j.raw();
if (auto fc_cell = dynamic_cast<unification_failure_by_cases_justification*>(jcell)) {
auto uc = fc_cell->get_constraint();
if (is_derived_constraint(uc)) {
// we usually don't care about internal case-splits
unification_constraint const & new_uc = get_non_derived_constraint(uc);
return justification(new unification_failure_justification(new_uc, fc_cell->get_menv()));
} else {
buffer<justification> new_js;
for (auto const & j : fc_cell->get_cases())
new_js.push_back(remove_detail(j));
return justification(new unification_failure_by_cases_justification(uc, new_js.size(), new_js.data(), fc_cell->get_menv()));
}
return j;
} else if (auto f_cell = dynamic_cast<unification_failure_justification*>(jcell)) {
unification_constraint const & new_uc = get_non_derived_constraint(f_cell->get_constraint());
return justification(new unification_failure_justification(new_uc, f_cell->get_menv()));
} else if (auto p_cell = dynamic_cast<propagation_justification*>(jcell)) {
return remove_detail(p_cell->get_constraint().get_justification());
} else {
return j;
}
}
}

View file

@ -7,6 +7,7 @@ Author: Leonardo de Moura
#include <vector>
#include "kernel/justification.h"
#include "kernel/unification_constraint.h"
#include "kernel/metavar.h"
namespace lean {
/**
@ -22,7 +23,7 @@ public:
virtual ~propagation_justification();
virtual void get_children(buffer<justification_cell*> & r) const;
virtual optional<expr> get_main_expr() const;
virtual format pp_header(formatter const &, options const &) const;
virtual format pp_header(formatter const &, options const &, optional<metavar_env> const &) const;
unification_constraint const & get_constraint() const { return m_constraint; }
};
@ -31,9 +32,20 @@ public:
*/
class unification_failure_justification : public propagation_justification {
protected:
// We store the menv at the time of failure. We use it to produce less cryptic error messages.
metavar_env m_menv;
virtual char const * get_prop_name() const { return "Failed to solve"; }
public:
unification_failure_justification(unification_constraint const & c):propagation_justification(c) {}
unification_failure_justification(unification_constraint const & c, metavar_env const & menv):
propagation_justification(c), m_menv(menv) {}
virtual format pp_header(formatter const & fmt, options const & opts, optional<metavar_env> const &) const {
return propagation_justification::pp_header(fmt, opts, optional<metavar_env>(m_menv));
}
virtual format pp(formatter const & fmt, options const & opts, pos_info_provider const * p, bool display_children,
optional<metavar_env> const &) const {
return propagation_justification::pp(fmt, opts, p, display_children, optional<metavar_env>(m_menv));
}
metavar_env get_menv() const { return m_menv; }
};
/**
@ -44,9 +56,10 @@ public:
class unification_failure_by_cases_justification : public unification_failure_justification {
std::vector<justification> m_cases; // why each case failed
public:
unification_failure_by_cases_justification(unification_constraint const & c, unsigned num, justification const * cs);
unification_failure_by_cases_justification(unification_constraint const & c, unsigned num, justification const * cs, metavar_env const & menv);
virtual ~unification_failure_by_cases_justification();
virtual void get_children(buffer<justification_cell*> & r) const;
std::vector<justification> const & get_cases() const { return m_cases; }
};
/**
@ -149,7 +162,7 @@ class typeof_mvar_justification : public justification_cell {
public:
typeof_mvar_justification(context const & ctx, expr const & m, expr const & mt, expr const & t, justification const & tr);
virtual ~typeof_mvar_justification();
virtual format pp_header(formatter const &, options const &) const;
virtual format pp_header(formatter const &, options const &, optional<metavar_env> const & menv) const;
virtual void get_children(buffer<justification_cell*> & r) const;
};
@ -161,8 +174,16 @@ class next_solution_justification : public justification_cell {
public:
next_solution_justification(unsigned num, justification const * as);
virtual ~next_solution_justification();
virtual format pp_header(formatter const &, options const &) const;
virtual format pp_header(formatter const &, options const &, optional<metavar_env> const & menv) const;
virtual void get_children(buffer<justification_cell*> & r) const;
virtual optional<expr> get_main_expr() const;
};
/**
\brief Create a new justification object where we eliminate
intermediate steps and assignment justifications. This function
produces a new justification object that is better for
pretty printing.
*/
justification remove_detail(justification const & j);
};

View file

@ -1,476 +1,11 @@
Set: pp::colors
Set: pp::unicode
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢
(?M::3 ≈ (Type U)) ⊕ (?M::3 ≈ (Type M)) ⊕ (?M::3 ≈ (Type 1)) ⊕ (?M::3 ≈ Type) ⊕ (?M::3 ≈ Bool)
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≺ (Type U)
Normalize
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≺ TypeU
(line: 1: pos: 44) Type of argument 1 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::5 ≈ (Type U)) ⊕ (?M::5 ≈ (Type U+1))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U) ≺ ?M::5
Propagate type, ?M::2 : ?M::5
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ A' ≈ ?M::2
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ A == A' ≺ ?M::1 == ?M::2
(line: 1: pos: 44) Type of argument 4 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::0 ≈ (Type U)) ⊕ (?M::0 ≈ (Type U+1))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U) ≺ ?M::0
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≺ ?M::0
(line: 1: pos: 44) Type of argument 3 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≈ (Type U)
Assumption 1
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ (Type U)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U)
Assumption 3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type U)
Assumption 0
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ (Type U)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+1)
Assumption 4
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type U)
Assumption 0
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::0 ≈ (Type U+1)) ⊕ (?M::0 ≈ (Type U+2))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ ?M::0
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≺ ?M::0
(line: 1: pos: 44) Type of argument 3 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≈ (Type U+1)
Assumption 5
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ (Type U)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+1)
Assumption 7
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type U)
Assumption 0
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+3) ≺ (Type U)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+3) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+2)
Assumption 8
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type U)
Assumption 0
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::5 ≈ (Type U)) ⊕ (?M::5 ≈ (Type U+1))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U) ≺ ?M::5
Propagate type, ?M::2 : ?M::5
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ A' ≈ ?M::2
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ A == A' ≺ ?M::1 == ?M::2
(line: 1: pos: 44) Type of argument 4 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::0 ≈ (Type U)) ⊕ (?M::0 ≈ (Type U+1))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U) ≺ ?M::0
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≺ ?M::0
(line: 1: pos: 44) Type of argument 3 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≈ (Type U)
Assumption 10
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ (Type M)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U)
Assumption 12
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type M)
Assumption 9
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ (Type M)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+1)
Assumption 13
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type M)
Assumption 9
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::0 ≈ (Type U+1)) ⊕ (?M::0 ≈ (Type U+2))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ ?M::0
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≺ ?M::0
(line: 1: pos: 44) Type of argument 3 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≈ (Type U+1)
Assumption 14
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ (Type M)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+1)
Assumption 16
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type M)
Assumption 9
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+3) ≺ (Type M)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+3) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+2)
Assumption 17
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type M)
Assumption 9
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::5 ≈ (Type U)) ⊕ (?M::5 ≈ (Type U+1))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U) ≺ ?M::5
Propagate type, ?M::2 : ?M::5
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ A' ≈ ?M::2
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ A == A' ≺ ?M::1 == ?M::2
(line: 1: pos: 44) Type of argument 4 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::0 ≈ (Type U)) ⊕ (?M::0 ≈ (Type U+1))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U) ≺ ?M::0
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≺ ?M::0
(line: 1: pos: 44) Type of argument 3 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≈ (Type U)
Assumption 19
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ (Type 1)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U)
Assumption 21
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type 1)
Assumption 18
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ (Type 1)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+1)
Assumption 22
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type 1)
Assumption 18
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::0 ≈ (Type U+1)) ⊕ (?M::0 ≈ (Type U+2))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ ?M::0
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≺ ?M::0
(line: 1: pos: 44) Type of argument 3 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≈ (Type U+1)
Assumption 23
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ (Type 1)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+1)
Assumption 25
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type 1)
Assumption 18
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+3) ≺ (Type 1)
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+3) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+2)
Assumption 26
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ (Type 1)
Assumption 18
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::5 ≈ (Type U)) ⊕ (?M::5 ≈ (Type U+1))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U) ≺ ?M::5
Propagate type, ?M::2 : ?M::5
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ A' ≈ ?M::2
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ A == A' ≺ ?M::1 == ?M::2
(line: 1: pos: 44) Type of argument 4 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::0 ≈ (Type U)) ⊕ (?M::0 ≈ (Type U+1))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U) ≺ ?M::0
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≺ ?M::0
(line: 1: pos: 44) Type of argument 3 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≈ (Type U)
Assumption 28
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ Type
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U)
Assumption 30
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ Type
Assumption 27
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ Type
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+1)
Assumption 31
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ Type
Assumption 27
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::0 ≈ (Type U+1)) ⊕ (?M::0 ≈ (Type U+2))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ ?M::0
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≺ ?M::0
(line: 1: pos: 44) Type of argument 3 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≈ (Type U+1)
Assumption 32
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ Type
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+1)
Assumption 34
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ Type
Assumption 27
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+3) ≺ Type
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+3) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+2)
Assumption 35
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ Type
Assumption 27
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::5 ≈ (Type U)) ⊕ (?M::5 ≈ (Type U+1))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U) ≺ ?M::5
Propagate type, ?M::2 : ?M::5
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ A' ≈ ?M::2
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ A == A' ≺ ?M::1 == ?M::2
(line: 1: pos: 44) Type of argument 4 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::0 ≈ (Type U)) ⊕ (?M::0 ≈ (Type U+1))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U) ≺ ?M::0
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≺ ?M::0
(line: 1: pos: 44) Type of argument 3 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≈ (Type U)
Assumption 37
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ Bool
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U)
Assumption 39
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ Bool
Assumption 36
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ Bool
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+1)
Assumption 40
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ Bool
Assumption 36
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (?M::0 ≈ (Type U+1)) ⊕ (?M::0 ≈ (Type U+2))
Destruct/Decompose
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+1) ≺ ?M::0
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≺ ?M::0
(line: 1: pos: 44) Type of argument 3 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
?M::1
?M::2
H
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::5 ≈ (Type U+1)
Assumption 41
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ Bool
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+2) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+1)
Assumption 43
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ Bool
Assumption 36
Failed to solve
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+3) ≺ Bool
Substitution
A : (Type U), A' : (Type U), H : A == A' ⊢ (Type U+3) ≺ ?M::3
Propagate type, ?M::0 : ?M::3
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::0 ≈ (Type U+2)
Assumption 44
Assignment
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≈ Bool
Assumption 36
A : (Type U), A' : (Type U), H : A == A' ⊢ ?M::3 ≺ TypeU
(line: 1: pos: 44) Type of argument 1 must be convertible to the expected type in the application of
@Symm
with arguments:
?M::0
A
A'
H

View file

@ -3,22 +3,12 @@
Assumed: f
Failed to solve
⊢ Bool ≺
Substitution
⊢ Bool ≺ ?M::0
(line: 4: pos: 6) Type of argument 3 must be convertible to the expected type in the application of
@f
with arguments:
?M::0
10
Assignment
≺ ?M::0
(line: 4: pos: 6) Type of argument 2 must be convertible to the expected type in the application of
@f
with arguments:
?M::0
10
(line: 4: pos: 6) Type of argument 3 must be convertible to the expected type in the application of
@f
with arguments:
10
Assumed: g
Error (line: 7, pos: 8) invalid expression, it still contains metavariables after elaboration, metavariable: ?M::1, type:
Type
@ -44,244 +34,34 @@ A : Type, B : Type, a : ?M::0, b : ?M::1, C : Type ⊢ ?M::0[lift:0:3] ≺ C
Assumed: H
Failed to solve
⊢ ?M::0 ⇒ ?M::3 ∧ a ≺ b
Substitution
⊢ ?M::0 ⇒ ?M::1 ≺ b
(line: 20: pos: 18) Type of definition 't1' must be convertible to expected type.
Assignment
H1 : ?M::2 ⊢ ?M::3 ∧ a ≺ ?M::1
Substitution
H1 : ?M::2 ⊢ ?M::3 ∧ ?M::4 ≺ ?M::1
Destruct/Decompose
⊢ Π H1 : ?M::2, ?M::3 ∧ ?M::4 ≺ Π a : ?M::0, ?M::1
(line: 20: pos: 18) Type of argument 3 must be convertible to the expected type in the application of
@Discharge
with arguments:
?M::0
?M::1
λ H1 : ?M::2, Conj H1 (Conjunct1 H)
Assignment
H1 : ?M::2 ⊢ a ≺ ?M::4
Substitution
H1 : ?M::2 ⊢ ?M::5 ≺ ?M::4
(line: 20: pos: 37) Type of argument 4 must be convertible to the expected type in the application of
@Conj
with arguments:
?M::3
?M::4
H1
Conjunct1 H
Assignment
H1 : ?M::2 ⊢ a ≈ ?M::5
Destruct/Decompose
H1 : ?M::2 ⊢ a ∧ b ≺ ?M::5 ∧ ?M::6
(line: 20: pos: 45) Type of argument 3 must be convertible to the expected type in the application of
@Conjunct1
with arguments:
?M::5
?M::6
H
(line: 20: pos: 18) Type of definition 't1' must be convertible to expected type.
Failed to solve
⊢ b ≈ a
Substitution
⊢ b ≈ ?M::3
Destruct/Decompose
⊢ b == b ≺ ?M::3 == ?M::4
(line: 22: pos: 22) Type of argument 6 must be convertible to the expected type in the application of
@Trans
with arguments:
?M::1
?M::2
?M::3
?M::4
Refl a
Refl b
Assignment
⊢ a ≈ ?M::3
Destruct/Decompose
⊢ a == a ≺ ?M::2 == ?M::3
(line: 22: pos: 22) Type of argument 5 must be convertible to the expected type in the application of
@Trans
with arguments:
?M::1
?M::2
?M::3
?M::4
Refl a
Refl b
⊢ b == b ≺ a == b
(line: 22: pos: 22) Type of argument 6 must be convertible to the expected type in the application of
@Trans
with arguments:
?M::1
a
a
b
Refl a
Refl b
Failed to solve
⊢ (?M::1 ≈ Type) ⊕ (?M::1 ≈ Bool)
Destruct/Decompose
⊢ ?M::1 ≺ Type
(line: 24: pos: 6) Type of argument 1 must be convertible to the expected type in the application of
@f
with arguments:
?M::0
Bool
Bool
Failed to solve
⊢ (?M::0 ≈ Type) ⊕ (?M::0 ≈ (Type 1)) ⊕ (?M::0 ≈ (Type M)) ⊕ (?M::0 ≈ (Type U))
Destruct/Decompose
⊢ Type ≺ ?M::0
(line: 24: pos: 6) Type of argument 2 must be convertible to the expected type in the application of
@f
with arguments:
?M::0
Bool
Bool
Failed to solve
⊢ (Type 1) ≺ Type
Substitution
⊢ (Type 1) ≺ ?M::1
Propagate type, ?M::0 : ?M::1
Assignment
⊢ ?M::0 ≈ Type
Assumption 1
Assignment
⊢ ?M::1 ≈ Type
Assumption 0
Failed to solve
⊢ (Type 2) ≺ Type
Substitution
⊢ (Type 2) ≺ ?M::1
Propagate type, ?M::0 : ?M::1
Assignment
⊢ ?M::0 ≈ (Type 1)
Assumption 2
Assignment
⊢ ?M::1 ≈ Type
Assumption 0
Failed to solve
⊢ (Type M+1) ≺ Type
Substitution
⊢ (Type M+1) ≺ ?M::1
Propagate type, ?M::0 : ?M::1
Assignment
⊢ ?M::0 ≈ (Type M)
Assumption 3
Assignment
⊢ ?M::1 ≈ Type
Assumption 0
Failed to solve
⊢ (Type U+1) ≺ Type
Substitution
⊢ (Type U+1) ≺ ?M::1
Propagate type, ?M::0 : ?M::1
Assignment
⊢ ?M::0 ≈ (Type U)
Assumption 4
Assignment
⊢ ?M::1 ≈ Type
Assumption 0
Failed to solve
⊢ (?M::0 ≈ Type) ⊕ (?M::0 ≈ (Type 1)) ⊕ (?M::0 ≈ (Type M)) ⊕ (?M::0 ≈ (Type U))
Destruct/Decompose
⊢ Type ≺ ?M::0
(line: 24: pos: 6) Type of argument 2 must be convertible to the expected type in the application of
@f
with arguments:
?M::0
Bool
Bool
Failed to solve
⊢ (Type 1) ≺ Bool
Substitution
⊢ (Type 1) ≺ ?M::1
Propagate type, ?M::0 : ?M::1
Assignment
⊢ ?M::0 ≈ Type
Assumption 6
Assignment
⊢ ?M::1 ≈ Bool
Assumption 5
Failed to solve
⊢ (Type 2) ≺ Bool
Substitution
⊢ (Type 2) ≺ ?M::1
Propagate type, ?M::0 : ?M::1
Assignment
⊢ ?M::0 ≈ (Type 1)
Assumption 7
Assignment
⊢ ?M::1 ≈ Bool
Assumption 5
Failed to solve
⊢ (Type M+1) ≺ Bool
Substitution
⊢ (Type M+1) ≺ ?M::1
Propagate type, ?M::0 : ?M::1
Assignment
⊢ ?M::0 ≈ (Type M)
Assumption 8
Assignment
⊢ ?M::1 ≈ Bool
Assumption 5
Failed to solve
⊢ (Type U+1) ≺ Bool
Substitution
⊢ (Type U+1) ≺ ?M::1
Propagate type, ?M::0 : ?M::1
Assignment
⊢ ?M::0 ≈ (Type U)
Assumption 9
Assignment
⊢ ?M::1 ≈ Bool
Assumption 5
⊢ ?M::1 ≺ Type
(line: 24: pos: 6) Type of argument 1 must be convertible to the expected type in the application of
@f
with arguments:
?M::0
Bool
Bool
Failed to solve
a : Bool, b : Bool, H : ?M::2, H_a : ?M::6 ⊢ (a ⇒ b) ⇒ a ≺ a
Substitution
a : Bool, b : Bool, H : ?M::2, H_a : ?M::6 ⊢ (a ⇒ b) ⇒ a ≺ ?M::5[lift:0:1]
Substitution
a : Bool, b : Bool, H : ?M::2, H_a : ?M::6 ⊢ ?M::2[lift:0:2] ≺ ?M::5[lift:0:1]
Destruct/Decompose
a : Bool, b : Bool, H : ?M::2 ⊢ Π H_a : ?M::6, ?M::2[lift:0:2] ≺ Π a : ?M::3, ?M::5[lift:0:1]
(line: 27: pos: 21) Type of argument 5 must be convertible to the expected type in the application of
@DisjCases
with arguments:
?M::3
?M::4
?M::5
EM a
λ H_a : ?M::6, H
λ H_na : ?M::7, NotImp1 (MT H H_na)
Normalize assignment
?M::0
Assignment
a : Bool, b : Bool ⊢ ?M::2 ≈ ?M::0
Destruct/Decompose
a : Bool, b : Bool ⊢ Π H : ?M::2, ?M::5 ≺ Π a : ?M::0, ?M::1[lift:0:1]
(line: 27: pos: 4) Type of argument 3 must be convertible to the expected type in the application of
@Discharge
with arguments:
?M::0
?M::1
λ H : ?M::2, DisjCases (EM a) (λ H_a : ?M::6, H) (λ H_na : ?M::7, NotImp1 (MT H H_na))
Assignment
a : Bool, b : Bool ⊢ ?M::0 ≈ (a ⇒ b) ⇒ a
Destruct/Decompose
a : Bool, b : Bool ⊢ ?M::0 ⇒ ?M::1 ≺ ((a ⇒ b) ⇒ a) ⇒ a
Destruct/Decompose
a : Bool ⊢ Π b : Bool, ?M::0 ⇒ ?M::1 ≺ Π b : Bool, ((a ⇒ b) ⇒ a) ⇒ a
Destruct/Decompose
⊢ Π a b : Bool, ?M::0 ⇒ ?M::1 ≺ Π a b : Bool, ((a ⇒ b) ⇒ a) ⇒ a
(line: 26: pos: 16) Type of definition 'pierce' must be convertible to expected type.
Assignment
a : Bool, b : Bool, H : ?M::2 ⊢ ?M::5 ≺ a
Substitution
a : Bool, b : Bool, H : ?M::2 ⊢ ?M::5 ≺ ?M::1[lift:0:1]
Destruct/Decompose
a : Bool, b : Bool ⊢ Π H : ?M::2, ?M::5 ≺ Π a : ?M::0, ?M::1[lift:0:1]
(line: 27: pos: 4) Type of argument 3 must be convertible to the expected type in the application of
@Discharge
with arguments:
?M::0
?M::1
λ H : ?M::2, DisjCases (EM a) (λ H_a : ?M::6, H) (λ H_na : ?M::7, NotImp1 (MT H H_na))
Assignment
a : Bool, b : Bool ⊢ ?M::1 ≈ a
Destruct/Decompose
a : Bool, b : Bool ⊢ ?M::0 ⇒ ?M::1 ≺ ((a ⇒ b) ⇒ a) ⇒ a
Destruct/Decompose
a : Bool ⊢ Π b : Bool, ?M::0 ⇒ ?M::1 ≺ Π b : Bool, ((a ⇒ b) ⇒ a) ⇒ a
Destruct/Decompose
⊢ Π a b : Bool, ?M::0 ⇒ ?M::1 ≺ Π a b : Bool, ((a ⇒ b) ⇒ a) ⇒ a
(line: 26: pos: 16) Type of definition 'pierce' must be convertible to expected type.
a : Bool, b : Bool, H : (a ⇒ b) ⇒ a ⊢ a → (a ⇒ b) ⇒ a ≺ a → a
(line: 27: pos: 21) Type of argument 5 must be convertible to the expected type in the application of
@DisjCases
with arguments:
a
¬ a
a
EM a
λ H_a : a, H
λ H_na : ¬ a, NotImp1 (MT H H_na)

View file

@ -6,39 +6,19 @@ myeq Bool
Assumed: a
Failed to solve
⊢ Bool ≺ T
Substitution
⊢ Bool ≺ ?M::0
(line: 5: pos: 6) Type of argument 2 must be convertible to the expected type in the application of
myeq
with arguments:
?M::0
a
Assignment
⊢ T ≺ ?M::0
(line: 5: pos: 6) Type of argument 3 must be convertible to the expected type in the application of
myeq
with arguments:
?M::0
a
(line: 5: pos: 6) Type of argument 2 must be convertible to the expected type in the application of
myeq
with arguments:
T
a
Assumed: myeq2
Set: lean::pp::implicit
Failed to solve
⊢ Bool ≺ T
Substitution
⊢ Bool ≺ ?M::0
(line: 9: pos: 15) Type of argument 2 must be convertible to the expected type in the application of
@myeq2
with arguments:
?M::0
a
Assignment
⊢ T ≺ ?M::0
(line: 9: pos: 15) Type of argument 3 must be convertible to the expected type in the application of
@myeq2
with arguments:
?M::0
a
(line: 9: pos: 15) Type of argument 2 must be convertible to the expected type in the application of
@myeq2
with arguments:
T
a

View file

@ -11,55 +11,15 @@ Failed to solve
(Int::add | Nat::add) i p
Failed to solve
Substitution
≺ ?M::2
Type of argument 1 must be convertible to the expected type in the application of
?M::0
with arguments:
i
p
Assignment
≈ ?M::2
Destruct/Decompose
≈ Π x : ?M::2, ?M::3
Substitution
⊢ ?M::1 ≈ Π x : ?M::2, ?M::3
Function expected at
?M::0 i p
Assignment
≺ ?M::1
Propagate type, ?M::0 : ?M::1
Assignment
⊢ ?M::0 ≈ Nat::add
Assumption 0
Type of argument 1 must be convertible to the expected type in the application of
Nat::add
with arguments:
i
p
Failed to solve
⊢ Bool ≺
Substitution
⊢ Bool ≺ ?M::4
Type of argument 2 must be convertible to the expected type in the application of
?M::0
with arguments:
i
p
Assignment
≈ ?M::4
Destruct/Decompose
≈ Π x : ?M::4, ?M::5
Substitution
⊢ ?M::3[inst:0 i] ≈ Π x : ?M::4, ?M::5
Function expected at
?M::0 i p
Assignment
a : ≈ ?M::3
Destruct/Decompose
≈ Π x : ?M::2, ?M::3
Substitution
⊢ ?M::1 ≈ Π x : ?M::2, ?M::3
Function expected at
?M::0 i p
Assignment
≺ ?M::1
Propagate type, ?M::0 : ?M::1
Assignment
⊢ ?M::0 ≈ Int::add
Assumption 1
Type of argument 2 must be convertible to the expected type in the application of
Int::add
with arguments:
i
p

View file

@ -8,97 +8,25 @@ Failed to solve
(Real::add | Int::add | Nat::add) 1
Failed to solve
⊢ Bool ≺
Substitution
⊢ Bool ≺ ?M::8
(line: 3: pos: 9) Type of argument 2 must be convertible to the expected type in the application of
?M::0
with arguments:
?M::1 1
Assignment
≈ ?M::8
Destruct/Decompose
≈ Π x : ?M::8, ?M::9
Substitution
⊢ ?M::7[inst:0 (?M::1 1)] ≈ Π x : ?M::8, ?M::9
(line: 3: pos: 9) Function expected at
?M::0 (?M::1 1)
Assignment
a : ≈ ?M::7
Destruct/Decompose
≈ Π x : ?M::6, ?M::7
Substitution
⊢ ?M::2 ≈ Π x : ?M::6, ?M::7
(line: 3: pos: 9) Function expected at
?M::0 (?M::1 1)
Assignment
≺ ?M::2
Propagate type, ?M::0 : ?M::2
Assignment
⊢ ?M::0 ≈ Nat::add
Assumption 0
(line: 3: pos: 9) Type of argument 2 must be convertible to the expected type in the application of
Nat::add
with arguments:
1
Failed to solve
⊢ Bool ≺
Substitution
⊢ Bool ≺ ?M::8
(line: 3: pos: 9) Type of argument 2 must be convertible to the expected type in the application of
?M::0
with arguments:
?M::1 1
Assignment
≈ ?M::8
Destruct/Decompose
≈ Π x : ?M::8, ?M::9
Substitution
⊢ ?M::7[inst:0 (?M::1 1)] ≈ Π x : ?M::8, ?M::9
(line: 3: pos: 9) Function expected at
?M::0 (?M::1 1)
Assignment
a : ≈ ?M::7
Destruct/Decompose
≈ Π x : ?M::6, ?M::7
Substitution
⊢ ?M::2 ≈ Π x : ?M::6, ?M::7
(line: 3: pos: 9) Function expected at
?M::0 (?M::1 1)
Assignment
≺ ?M::2
Propagate type, ?M::0 : ?M::2
Assignment
⊢ ?M::0 ≈ Int::add
Assumption 2
(line: 3: pos: 9) Type of argument 2 must be convertible to the expected type in the application of
Int::add
with arguments:
1
Failed to solve
⊢ Bool ≺
Substitution
⊢ Bool ≺ ?M::8
(line: 3: pos: 9) Type of argument 2 must be convertible to the expected type in the application of
?M::0
with arguments:
?M::1 1
Assignment
≈ ?M::8
Destruct/Decompose
≈ Π x : ?M::8, ?M::9
Substitution
⊢ ?M::7[inst:0 (?M::1 1)] ≈ Π x : ?M::8, ?M::9
(line: 3: pos: 9) Function expected at
?M::0 (?M::1 1)
Assignment
a : ≈ ?M::7
Destruct/Decompose
≈ Π x : ?M::6, ?M::7
Substitution
⊢ ?M::2 ≈ Π x : ?M::6, ?M::7
(line: 3: pos: 9) Function expected at
?M::0 (?M::1 1)
Assignment
≺ ?M::2
Propagate type, ?M::0 : ?M::2
Assignment
⊢ ?M::0 ≈ Real::add
Assumption 5
(line: 3: pos: 9) Type of argument 2 must be convertible to the expected type in the application of
Real::add
with arguments:
1
Assumed: R
Assumed: T
Assumed: r2t