From 1640568f6a9ba8898a8872f04b2d555a5976a449 Mon Sep 17 00:00:00 2001 From: Leonardo de Moura Date: Sat, 7 Feb 2015 17:31:53 -0800 Subject: [PATCH] refactor(library/reducible): use default_converter in reducible, and converters based on reducible hints --- src/library/reducible.cpp | 35 ++++++++++++++++++++++++----------- src/library/reducible.h | 15 +++++++++++++++ 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/library/reducible.cpp b/src/library/reducible.cpp index c02bc32c7..48017192a 100644 --- a/src/library/reducible.cpp +++ b/src/library/reducible.cpp @@ -8,7 +8,6 @@ Author: Leonardo de Moura #include "util/sstream.h" #include "kernel/environment.h" #include "kernel/type_checker.h" -#include "kernel/default_converter.h" #include "library/kernel_serializer.h" #include "library/scoped_ext.h" #include "library/reducible.h" @@ -117,21 +116,35 @@ bool is_reducible_off(environment const & env, name const & n) { return s.m_reducible_off.contains(n); } +reducible_on_converter::reducible_on_converter(environment const & env, bool relax_main_opaque, bool memoize): + default_converter(env, relax_main_opaque, memoize) { + m_reducible_on = reducible_ext::get_state(env).m_reducible_on; +} + +bool reducible_on_converter::is_opaque(declaration const & d) const { + if (!m_reducible_on.contains(d.get_name())) return true; + return default_converter::is_opaque(d); +} + +reducible_off_converter::reducible_off_converter(environment const & env, bool relax_main_opaque, bool memoize): + default_converter(env, relax_main_opaque, memoize) { + m_reducible_off = reducible_ext::get_state(env).m_reducible_off; +} + +bool reducible_off_converter::is_opaque(declaration const & d) const { + if (m_reducible_off.contains(d.get_name())) return true; + return default_converter::is_opaque(d); +} + std::unique_ptr mk_type_checker(environment const & env, name_generator const & ngen, bool relax_main_opaque, reducible_behavior rb, bool memoize) { - reducible_state const & s = reducible_ext::get_state(env); if (rb == OpaqueIfNotReducibleOn) { - name_set reducible_on = s.m_reducible_on; - name_set reducible_off = s.m_reducible_off; - extra_opaque_pred pred([=](name const & n) { return !reducible_on.contains(n); }); - return std::unique_ptr(new type_checker(env, ngen, mk_default_converter(env, relax_main_opaque, - memoize, pred))); + return std::unique_ptr(new type_checker(env, ngen, + std::unique_ptr(new reducible_on_converter(env, relax_main_opaque, memoize)))); } else { - name_set reducible_off = s.m_reducible_off; - extra_opaque_pred pred([=](name const & n) { return reducible_off.contains(n); }); - return std::unique_ptr(new type_checker(env, ngen, mk_default_converter(env, relax_main_opaque, - memoize, pred))); + return std::unique_ptr(new type_checker(env, ngen, + std::unique_ptr(new reducible_off_converter(env, relax_main_opaque, memoize)))); } } diff --git a/src/library/reducible.h b/src/library/reducible.h index c5ead2f8c..d719658c8 100644 --- a/src/library/reducible.h +++ b/src/library/reducible.h @@ -7,6 +7,7 @@ Author: Leonardo de Moura #pragma once #include #include "kernel/type_checker.h" +#include "kernel/default_converter.h" namespace lean { enum class reducible_status { On, Off, None }; @@ -33,6 +34,20 @@ bool is_reducible_on(environment const & env, name const & n); */ bool is_reducible_off(environment const & env, name const & n); +class reducible_on_converter : public default_converter { + name_set m_reducible_on; +public: + reducible_on_converter(environment const & env, bool relax_main_opaque, bool memoize); + virtual bool is_opaque(declaration const & d) const; +}; + +class reducible_off_converter : public default_converter { + name_set m_reducible_off; +public: + reducible_off_converter(environment const & env, bool relax_main_opaque, bool memoize); + virtual bool is_opaque(declaration const & d) const; +}; + enum reducible_behavior { OpaqueIfNotReducibleOn, OpaqueIfReducibleOff }; /** \brief Create a type checker that takes the "reducibility" hints into account. */