Make unification_problems a virtual class. Associate a 'standard' context with each metavariable in metavar_env
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
b1310bd679
commit
5a4bc331d2
3 changed files with 43 additions and 28 deletions
|
@ -12,9 +12,9 @@ Author: Leonardo de Moura
|
||||||
#include "kernel/for_each.h"
|
#include "kernel/for_each.h"
|
||||||
|
|
||||||
namespace lean {
|
namespace lean {
|
||||||
expr metavar_env::mk_metavar() {
|
expr metavar_env::mk_metavar(context const & ctx) {
|
||||||
unsigned midx = m_env.size();
|
unsigned midx = m_env.size();
|
||||||
m_env.push_back(mk_pair(expr(), expr()));
|
m_env.push_back(data(ctx));
|
||||||
return ::lean::mk_metavar(midx);
|
return ::lean::mk_metavar(midx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,34 +23,34 @@ bool metavar_env::contains(unsigned midx) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool metavar_env::is_assigned(unsigned midx) const {
|
bool metavar_env::is_assigned(unsigned midx) const {
|
||||||
return m_env[midx].first;
|
return m_env[midx].m_subst;
|
||||||
}
|
}
|
||||||
|
|
||||||
expr metavar_env::get_subst(unsigned midx) const {
|
expr metavar_env::get_subst(unsigned midx) const {
|
||||||
return m_env[midx].first;
|
return m_env[midx].m_subst;
|
||||||
}
|
}
|
||||||
|
|
||||||
expr metavar_env::get_type(unsigned midx, unification_problems & up) {
|
expr metavar_env::get_type(unsigned midx, unification_problems & up) {
|
||||||
auto p = m_env[midx];
|
auto p = m_env[midx];
|
||||||
expr t = p->second;
|
expr t = p->m_type;
|
||||||
if (t) {
|
if (t) {
|
||||||
return t;
|
return t;
|
||||||
} else {
|
} else {
|
||||||
t = mk_metavar();
|
t = mk_metavar();
|
||||||
expr s = p->first;
|
expr s = p->m_subst;
|
||||||
m_env[midx] = mk_pair(s, t);
|
m_env[midx] = data(s, t, p->m_ctx);
|
||||||
if (s)
|
if (s)
|
||||||
up.add_type_of_eq(s, t);
|
up.add_type_of_eq(p->m_ctx, s, t);
|
||||||
else
|
else
|
||||||
up.add_type_of_eq(::lean::mk_metavar(midx), t);
|
up.add_type_of_eq(p->m_ctx, ::lean::mk_metavar(midx), t);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void metavar_env::assign(unsigned midx, expr const & t) {
|
void metavar_env::assign(unsigned midx, expr const & v) {
|
||||||
lean_assert(!is_assigned(midx));
|
lean_assert(!is_assigned(midx));
|
||||||
auto p = m_env[midx];
|
auto p = m_env[midx];
|
||||||
m_env[midx] = mk_pair(t, p->second);
|
m_env[midx] = data(v, p->m_type, p->m_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
expr subst(expr const & a, unsigned i, expr const & c) {
|
expr subst(expr const & a, unsigned i, expr const & c) {
|
||||||
|
|
|
@ -5,35 +5,29 @@ Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
Author: Leonardo de Moura
|
Author: Leonardo de Moura
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <utility>
|
|
||||||
#include <vector>
|
|
||||||
#include "util/pair.h"
|
#include "util/pair.h"
|
||||||
#include "util/pvector.h"
|
#include "util/pvector.h"
|
||||||
#include "kernel/expr.h"
|
#include "kernel/expr.h"
|
||||||
|
#include "kernel/context.h"
|
||||||
|
|
||||||
namespace lean {
|
namespace lean {
|
||||||
/**
|
/**
|
||||||
\brief Set of unification problems that need to be solved.
|
\brief Set of unification problems that need to be solved.
|
||||||
It store two kinds of problems:
|
It store two kinds of problems:
|
||||||
1. <tt>lhs == rhs</tt>
|
1. <tt>ctx |- lhs == rhs</tt>
|
||||||
2. <tt>typeof(n) == t</tt>
|
2. <tt>ctx |- typeof(n) == t</tt>
|
||||||
*/
|
*/
|
||||||
class unification_problems {
|
class unification_problems {
|
||||||
std::vector<std::pair<expr, expr>> m_eqs;
|
|
||||||
std::vector<std::pair<expr, expr>> m_type_of_eqs;
|
|
||||||
public:
|
public:
|
||||||
|
virtual ~unification_problems() {}
|
||||||
/**
|
/**
|
||||||
\brief Add a new unification problem of the form <tt>lhs == rhs</tt>
|
\brief Add a new unification problem of the form <tt>ctx |- lhs == rhs</tt>
|
||||||
*/
|
*/
|
||||||
void add_eq(expr const & lhs, expr const & rhs) { m_eqs.push_back(mk_pair(lhs, rhs)); }
|
virtual void add_eq(context const & ctx, expr const & lhs, expr const & rhs) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Add a new unification problem of the form <tt>typeof(n) == t</tt>
|
\brief Add a new unification problem of the form <tt>ctx |- typeof(n) == t</tt>
|
||||||
*/
|
*/
|
||||||
void add_type_of_eq(expr const & n, expr const & t) { m_type_of_eqs.push_back(mk_pair(n, t)); }
|
virtual void add_type_of_eq(context const & ctx, expr const & n, expr const & t) = 0;
|
||||||
|
|
||||||
std::vector<std::pair<expr, expr>> const & eqs() const { return m_eqs; }
|
|
||||||
std::vector<std::pair<expr, expr>> const & type_of_eqs() const { return m_type_of_eqs; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -41,12 +35,19 @@ public:
|
||||||
from metavariables to assignments and types.
|
from metavariables to assignments and types.
|
||||||
*/
|
*/
|
||||||
class metavar_env {
|
class metavar_env {
|
||||||
pvector<std::pair<expr, expr>> m_env;
|
struct data {
|
||||||
|
expr m_subst;
|
||||||
|
expr m_type;
|
||||||
|
context m_ctx;
|
||||||
|
data(context const & ctx):m_ctx(ctx) {}
|
||||||
|
data(expr const & s, expr const & t, context const & ctx):m_subst(s), m_type(t), m_ctx(ctx) {}
|
||||||
|
};
|
||||||
|
pvector<data> m_env;
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
\brief Create new metavariable in this environment.
|
\brief Create new metavariable in this environment.
|
||||||
*/
|
*/
|
||||||
expr mk_metavar();
|
expr mk_metavar(context const & ctx = context());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Return true if this environment contains a metavariable
|
\brief Return true if this environment contains a metavariable
|
||||||
|
|
|
@ -5,6 +5,8 @@ Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
Author: Leonardo de Moura
|
Author: Leonardo de Moura
|
||||||
*/
|
*/
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
|
#include <utility>
|
||||||
#include "util/test.h"
|
#include "util/test.h"
|
||||||
#include "kernel/metavar.h"
|
#include "kernel/metavar.h"
|
||||||
#include "kernel/instantiate.h"
|
#include "kernel/instantiate.h"
|
||||||
|
@ -13,8 +15,20 @@ Author: Leonardo de Moura
|
||||||
#include "library/printer.h"
|
#include "library/printer.h"
|
||||||
using namespace lean;
|
using namespace lean;
|
||||||
|
|
||||||
|
class unification_problems_dbg : public unification_problems {
|
||||||
|
std::vector<std::pair<expr, expr>> m_eqs;
|
||||||
|
std::vector<std::pair<expr, expr>> m_type_of_eqs;
|
||||||
|
public:
|
||||||
|
unification_problems_dbg() {}
|
||||||
|
virtual ~unification_problems_dbg() {}
|
||||||
|
virtual void add_eq(context const &, expr const & lhs, expr const & rhs) { m_eqs.push_back(mk_pair(lhs, rhs)); }
|
||||||
|
virtual void add_type_of_eq(context const &, expr const & n, expr const & t) { m_type_of_eqs.push_back(mk_pair(n, t)); }
|
||||||
|
std::vector<std::pair<expr, expr>> const & eqs() const { return m_eqs; }
|
||||||
|
std::vector<std::pair<expr, expr>> const & type_of_eqs() const { return m_type_of_eqs; }
|
||||||
|
};
|
||||||
|
|
||||||
static void tst1() {
|
static void tst1() {
|
||||||
unification_problems u;
|
unification_problems_dbg u;
|
||||||
metavar_env menv;
|
metavar_env menv;
|
||||||
expr m1 = menv.mk_metavar();
|
expr m1 = menv.mk_metavar();
|
||||||
lean_assert(!menv.is_assigned(m1));
|
lean_assert(!menv.is_assigned(m1));
|
||||||
|
|
Loading…
Reference in a new issue