feat(kernel/trace): add function depends_on for trace objects

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2013-10-14 11:50:51 -07:00
parent 42edc4a72d
commit 8663ac550f
4 changed files with 48 additions and 11 deletions

View file

@ -4,12 +4,42 @@ Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura Author: Leonardo de Moura
*/ */
#include <set>
#include "util/buffer.h"
#include "kernel/trace.h" #include "kernel/trace.h"
namespace lean { namespace lean {
bool trace::has_children() const { bool trace::has_children() const {
buffer<trace> r; buffer<trace_cell *> r;
get_children(r); get_children(r);
return !r.empty(); return !r.empty();
} }
bool depends_on(trace const & t, trace const & d) {
buffer<trace_cell *> todo;
std::set<trace_cell *> visited;
buffer<trace_cell *> children;
todo.push_back(t.raw());
while (todo.empty()) {
trace_cell * curr = todo.back();
todo.pop_back();
if (curr == d.raw()) {
return true;
} else {
children.clear();
curr->get_children(children);
for (trace_cell * child : children) {
if (child->is_shared()) {
if (visited.find(child) == visited.end()) {
visited.insert(child);
todo.push_back(child);
}
} else {
todo.push_back(child);
}
}
}
}
return false;
}
} }

View file

@ -28,8 +28,9 @@ public:
trace_cell():m_rc(0) {} trace_cell():m_rc(0) {}
virtual ~trace_cell() {} virtual ~trace_cell() {}
virtual format pp(formatter const & fmt, options const & opts) const = 0; virtual format pp(formatter const & fmt, options const & opts) const = 0;
virtual void get_children(buffer<trace> & r) const = 0; virtual void get_children(buffer<trace_cell*> & r) const = 0;
virtual expr const & get_main_expr() const { return expr::null(); } virtual expr const & get_main_expr() const { return expr::null(); }
bool is_shared() const { return get_rc() > 1; }
}; };
/** /**
@ -54,7 +55,13 @@ public:
trace & operator=(trace && s) { LEAN_MOVE_REF(trace, s); } trace & operator=(trace && s) { LEAN_MOVE_REF(trace, s); }
format pp(formatter const & fmt, options const & opts) const { lean_assert(m_ptr); return m_ptr->pp(fmt, opts); } format pp(formatter const & fmt, options const & opts) const { lean_assert(m_ptr); return m_ptr->pp(fmt, opts); }
expr const & get_main_expr() const { return m_ptr ? m_ptr->get_main_expr() : expr::null(); } expr const & get_main_expr() const { return m_ptr ? m_ptr->get_main_expr() : expr::null(); }
void get_children(buffer<trace> & r) const { if (m_ptr) m_ptr->get_children(r); } void get_children(buffer<trace_cell*> & r) const { if (m_ptr) m_ptr->get_children(r); }
bool has_children() const; bool has_children() const;
}; };
/**
\brief Return true iff \c t depends on \c d.
That is \c t is a descendant of \c d.
*/
bool depends_on(trace const & t, trace const & d);
} }

View file

@ -20,7 +20,7 @@ format function_expected_trace_cell::pp(formatter const & fmt, options const & o
return r; return r;
} }
void function_expected_trace_cell::get_children(buffer<trace> &) const { void function_expected_trace_cell::get_children(buffer<trace_cell*> &) const {
} }
expr const & function_expected_trace_cell::get_main_expr() const { expr const & function_expected_trace_cell::get_main_expr() const {
@ -48,7 +48,7 @@ format app_type_match_trace_cell::pp(formatter const & fmt, options const & opts
return r; return r;
} }
void app_type_match_trace_cell::get_children(buffer<trace> &) const { void app_type_match_trace_cell::get_children(buffer<trace_cell*> &) const {
} }
expr const & app_type_match_trace_cell::get_main_expr() const { expr const & app_type_match_trace_cell::get_main_expr() const {
@ -67,7 +67,7 @@ format type_expected_trace_cell::pp(formatter const & fmt, options const & opts)
return r; return r;
} }
void type_expected_trace_cell::get_children(buffer<trace> &) const { void type_expected_trace_cell::get_children(buffer<trace_cell*> &) const {
} }
expr const & type_expected_trace_cell::get_main_expr() const { expr const & type_expected_trace_cell::get_main_expr() const {
@ -85,7 +85,7 @@ format def_type_match_trace_cell::pp(formatter const &, options const &) const {
return r; return r;
} }
void def_type_match_trace_cell::get_children(buffer<trace> &) const { void def_type_match_trace_cell::get_children(buffer<trace_cell*> &) const {
} }
expr const & def_type_match_trace_cell::get_main_expr() const { expr const & def_type_match_trace_cell::get_main_expr() const {

View file

@ -28,7 +28,7 @@ public:
function_expected_trace_cell(context const & c, expr const & app):m_ctx(c), m_app(app) {} function_expected_trace_cell(context const & c, expr const & app):m_ctx(c), m_app(app) {}
virtual ~function_expected_trace_cell(); virtual ~function_expected_trace_cell();
virtual format pp(formatter const & fmt, options const & opts) const; virtual format pp(formatter const & fmt, options const & opts) const;
virtual void get_children(buffer<trace> &) const; virtual void get_children(buffer<trace_cell*> &) const;
virtual expr const & get_main_expr() const; virtual expr const & get_main_expr() const;
context const & get_context() const { return m_ctx; } context const & get_context() const { return m_ctx; }
expr const & get_app() const { return m_app; } expr const & get_app() const { return m_app; }
@ -53,7 +53,7 @@ public:
app_type_match_trace_cell(context const & c, expr const & a, unsigned i):m_ctx(c), m_app(a), m_i(i) {} app_type_match_trace_cell(context const & c, expr const & a, unsigned i):m_ctx(c), m_app(a), m_i(i) {}
virtual ~app_type_match_trace_cell(); virtual ~app_type_match_trace_cell();
virtual format pp(formatter const & fmt, options const & opts) const; virtual format pp(formatter const & fmt, options const & opts) const;
virtual void get_children(buffer<trace> &) const; virtual void get_children(buffer<trace_cell*> &) const;
virtual expr const & get_main_expr() const; virtual expr const & get_main_expr() const;
context const & get_context() const { return m_ctx; } context const & get_context() const { return m_ctx; }
expr const & get_app() const { return m_app; } expr const & get_app() const { return m_app; }
@ -76,7 +76,7 @@ public:
type_expected_trace_cell(context const & c, expr const & t):m_ctx(c), m_type(t) {} type_expected_trace_cell(context const & c, expr const & t):m_ctx(c), m_type(t) {}
virtual ~type_expected_trace_cell(); virtual ~type_expected_trace_cell();
virtual format pp(formatter const & fmt, options const & opts) const; virtual format pp(formatter const & fmt, options const & opts) const;
virtual void get_children(buffer<trace> &) const; virtual void get_children(buffer<trace_cell*> &) const;
virtual expr const & get_main_expr() const; virtual expr const & get_main_expr() const;
context const & get_context() const { return m_ctx; } context const & get_context() const { return m_ctx; }
expr const & get_type() const { return m_type; } expr const & get_type() const { return m_type; }
@ -113,7 +113,7 @@ public:
def_type_match_trace_cell(context const & c, name const & n, expr const & v):m_ctx(c), m_name(n), m_value(v) {} def_type_match_trace_cell(context const & c, name const & n, expr const & v):m_ctx(c), m_name(n), m_value(v) {}
virtual ~def_type_match_trace_cell(); virtual ~def_type_match_trace_cell();
virtual format pp(formatter const & fmt, options const & opts) const; virtual format pp(formatter const & fmt, options const & opts) const;
virtual void get_children(buffer<trace> &) const; virtual void get_children(buffer<trace_cell*> &) const;
virtual expr const & get_main_expr() const; virtual expr const & get_main_expr() const;
context const & get_context() const { return m_ctx; } context const & get_context() const { return m_ctx; }
name const & get_name() const { return m_name; } name const & get_name() const { return m_name; }