172 lines
4.3 KiB
C
172 lines
4.3 KiB
C
|
/*
|
||
|
Copyright (c) 2013 Microsoft Corporation. All rights reserved.
|
||
|
Released under Apache 2.0 license as described in the file LICENSE.
|
||
|
|
||
|
Author: Leonardo de Moura
|
||
|
*/
|
||
|
#pragma once
|
||
|
#include "expr.h"
|
||
|
|
||
|
/*
|
||
|
Kernel objects.
|
||
|
|
||
|
We use abstract classes and virtual methods because a kernel
|
||
|
frontend may need to create new objects for bookkeeping.
|
||
|
*/
|
||
|
namespace lean {
|
||
|
class environment;
|
||
|
|
||
|
/**
|
||
|
\brief Abstract class used to represent kernel objects (i.e.,
|
||
|
definitions, theorems, axioms, recursive definitions, etc)
|
||
|
*/
|
||
|
class object {
|
||
|
protected:
|
||
|
public:
|
||
|
object() {}
|
||
|
object(object const & o) = delete;
|
||
|
object & operator=(object const & o) = delete;
|
||
|
virtual ~object();
|
||
|
|
||
|
/**
|
||
|
\brief Return the keyword used to define this object in a Lean
|
||
|
file. The keyword is also used to identify the class of an object.
|
||
|
*/
|
||
|
virtual char const * keyword() const = 0;
|
||
|
|
||
|
/** \brief Pretty print this object. */
|
||
|
virtual format pp(environment const &) const = 0;
|
||
|
|
||
|
/** \brief Display the object in the standard output. */
|
||
|
virtual void display(std::ostream & out, environment const &) const;
|
||
|
|
||
|
/** \brief Return true iff object has a name. */
|
||
|
virtual bool has_name() const = 0;
|
||
|
|
||
|
/** \brief Return object name. \pre has_name() */
|
||
|
virtual name const & get_name() const = 0;
|
||
|
|
||
|
/** \brief Return true iff object has a type. */
|
||
|
virtual bool has_type() const = 0;
|
||
|
|
||
|
/** \brief Return object type. \pre has_type() */
|
||
|
virtual expr const & get_type() const = 0;
|
||
|
|
||
|
/** \brief Return true iff object is a definition */
|
||
|
virtual bool is_definition() const = 0;
|
||
|
|
||
|
/** \brief Return true iff the definition is opaque. \pre is_definition() */
|
||
|
virtual bool is_opaque() const = 0;
|
||
|
|
||
|
/** \brief Return object value. \pre is_definition() */
|
||
|
virtual expr const & get_value() const = 0;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
\brief Anonymous objects are mainly used for bookkeeping.
|
||
|
*/
|
||
|
class anonymous_object : public object {
|
||
|
public:
|
||
|
virtual ~anonymous_object();
|
||
|
|
||
|
virtual bool has_name() const;
|
||
|
virtual name const & get_name() const;
|
||
|
|
||
|
virtual bool has_type() const;
|
||
|
virtual expr const & get_type() const;
|
||
|
|
||
|
virtual bool is_definition() const;
|
||
|
virtual bool is_opaque() const;
|
||
|
virtual expr const & get_value() const;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
\brief Named (and typed) kernel objects.
|
||
|
*/
|
||
|
class named_object : public object {
|
||
|
name m_name;
|
||
|
expr m_type;
|
||
|
public:
|
||
|
named_object(name const & n, expr const & t);
|
||
|
virtual ~named_object();
|
||
|
|
||
|
virtual bool has_name() const;
|
||
|
virtual name const & get_name() const;
|
||
|
|
||
|
virtual bool has_type() const;
|
||
|
virtual expr const & get_type() const;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
\brief Non-recursive definitions.
|
||
|
*/
|
||
|
class definition : public named_object {
|
||
|
expr m_value;
|
||
|
bool m_opaque; // Opaque definitions are ignored by definitional equality.
|
||
|
public:
|
||
|
definition(name const & n, expr const & t, expr const & v, bool opaque);
|
||
|
virtual ~definition();
|
||
|
|
||
|
static char const * g_keyword;
|
||
|
virtual char const * keyword() const;
|
||
|
|
||
|
virtual bool is_definition() const;
|
||
|
virtual bool is_opaque() const;
|
||
|
virtual expr const & get_value() const;
|
||
|
|
||
|
virtual format pp(environment const & env) const;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
\brief A theorem is essentially an opaque definition.
|
||
|
*/
|
||
|
class theorem : public definition {
|
||
|
public:
|
||
|
theorem(name const & n, expr const & t, expr const & v);
|
||
|
virtual ~theorem();
|
||
|
|
||
|
static char const * g_keyword;
|
||
|
virtual char const * keyword() const;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
\brief Base class for named objects that are not definitions.
|
||
|
*/
|
||
|
class fact : public named_object {
|
||
|
public:
|
||
|
fact(name const & n, expr const & t);
|
||
|
virtual ~fact();
|
||
|
|
||
|
virtual bool is_definition() const;
|
||
|
virtual bool is_opaque() const;
|
||
|
virtual expr const & get_value() const;
|
||
|
|
||
|
virtual format pp(environment const & env) const;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
\brief Axioms
|
||
|
*/
|
||
|
class axiom : public fact {
|
||
|
public:
|
||
|
axiom(name const & n, expr const & t);
|
||
|
virtual ~axiom();
|
||
|
|
||
|
static char const * g_keyword;
|
||
|
virtual char const * keyword() const;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
\brief Variable postulate. It is like an axiom since we are
|
||
|
essentially postulating that a type is inhabited.
|
||
|
*/
|
||
|
class variable : public fact {
|
||
|
public:
|
||
|
variable(name const & n, expr const & t);
|
||
|
virtual ~variable();
|
||
|
|
||
|
static char const * g_keyword;
|
||
|
virtual char const * keyword() const;
|
||
|
};
|
||
|
}
|