lean4-htt/src/library/tactic/simp_result.cpp
Daniel Selsam 4f8db64e23 refactor(simplifier): many fixes, extensions, and tests
fix(simplifier): missing simp rule in prop simplifier
fix(library/unfold_macros): do not look for untrusted macros when using sufficient trust level
2016-08-19 14:57:03 -07:00

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);
}
}
}