fix(simplifier): missing simp rule in prop simplifier fix(library/unfold_macros): do not look for untrusted macros when using sufficient trust level
52 lines
1.8 KiB
C++
52 lines
1.8 KiB
C++
/*
|
|
Copyright (c) 2015 Daniel Selsam. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Author: Daniel Selsam
|
|
*/
|
|
#include "library/tactic/simp_result.h"
|
|
#include "library/app_builder.h"
|
|
#include "library/util.h"
|
|
|
|
namespace lean {
|
|
|
|
simp_result finalize(type_context & tctx, name const & rel, simp_result const & r) {
|
|
if (r.has_proof()) return r;
|
|
expr pf = mk_refl(tctx, rel, r.get_new());
|
|
return simp_result(r.get_new(), pf);
|
|
}
|
|
|
|
simp_result join(type_context & tctx, name const & rel, simp_result const & r1, simp_result const & r2) {
|
|
/* Assumes that both simp_results are with respect to the same relation */
|
|
if (!r1.has_proof()) {
|
|
return r2;
|
|
} else if (!r2.has_proof()) {
|
|
lean_assert(r1.has_proof());
|
|
return simp_result(r2.get_new(), r1.get_proof());
|
|
} else {
|
|
/* If they both have proofs, we need to glue them together with transitivity. */
|
|
lean_assert(r1.has_proof() && r2.has_proof());
|
|
expr trans = mk_trans(tctx, rel, r1.get_proof(), r2.get_proof());
|
|
return simp_result(r2.get_new(), trans);
|
|
}
|
|
}
|
|
|
|
simp_result finalize_eq(abstract_type_context & tctx, simp_result const & r) {
|
|
if (r.has_proof()) return r;
|
|
expr pf = mk_eq_refl(tctx, r.get_new());
|
|
return simp_result(r.get_new(), pf);
|
|
}
|
|
|
|
simp_result join_eq(abstract_type_context & tctx, simp_result const & r1, simp_result const & r2) {
|
|
if (!r1.has_proof()) {
|
|
return r2;
|
|
} else if (!r2.has_proof()) {
|
|
lean_assert(r1.has_proof());
|
|
return simp_result(r2.get_new(), r1.get_proof());
|
|
} else {
|
|
lean_assert(r1.has_proof() && r2.has_proof());
|
|
expr trans = mk_eq_trans(tctx, r1.get_proof(), r2.get_proof());
|
|
return simp_result(r2.get_new(), trans);
|
|
}
|
|
}
|
|
|
|
}
|