Commit graph

36377 commits

Author SHA1 Message Date
Leonardo de Moura
3abcd0c9e8 chore(frontends/lean/elaborator): remove invoke_tactic 2018-08-23 13:49:47 -07:00
Leonardo de Moura
69734dfb3a chore(tests/lean): fix tests 2018-08-23 13:49:07 -07:00
Leonardo de Moura
e5c3f04937 chore(frontends/lean): remove tactic notation 2018-08-23 13:44:52 -07:00
Leonardo de Moura
d27ef3d3b0 chore(frontends/lean/builtin_cmds): remove tactic framework dependency 2018-08-23 13:34:38 -07:00
Leonardo de Moura
d0f6bbdf02 chore(tests/lean): replace run_cmd with #eval 2018-08-23 13:32:25 -07:00
Leonardo de Moura
a1fffb2c9d chore(tests/lean/fail/run_command): obsolete test 2018-08-23 13:30:07 -07:00
Leonardo de Moura
22ba0a1155 chore(library): remove inverse.cpp
We used this module to implement inductive_compiler pack/unpack functions
2018-08-23 13:16:27 -07:00
Leonardo de Moura
8e351d46a1 chore(library/equations_compiler): remove support for pack/unpack
We don't need it anymore because we removed inductive_compiler/nested.cpp
2018-08-23 13:16:27 -07:00
Leonardo de Moura
7fb763c50f chore(library/tactic): remove dsimp and unfold tactics 2018-08-23 11:57:38 -07:00
Leonardo de Moura
a10e81e6a6 chore(frontends/lean/elaborator): remove unfold tactic dependency 2018-08-23 11:57:38 -07:00
Leonardo de Moura
ef27df8907 chore(library/tactic): remove simp 2018-08-23 11:57:38 -07:00
Leonardo de Moura
9b4f59e511 chore(library/inductive_compiler): remove simp references 2018-08-23 11:57:38 -07:00
Leonardo de Moura
fc96c335fb chore(library/constructions): remove has_sizeof
This will be implemented in Lean in the future.
2018-08-23 11:57:38 -07:00
Leonardo de Moura
dc479c6837 chore(library/inductive_compiler): remove mutual.cpp 2018-08-23 11:57:38 -07:00
Sebastian Ullrich
fd1aa589cf chore(tests/lean/reader1): fix test 2018-08-23 11:03:40 -07:00
Leonardo de Moura
c7cf75508d feat(init/control/coroutine): avoid mutual inductive
Reason: we want to delete the inductive compiler.
2018-08-23 10:49:40 -07:00
Leonardo de Moura
252a017445 chore(library/inductive_compiler): remove nested.cpp
We added a temporary hack in the old inductive datatype module: we
accept nested inductive declarations.
2018-08-23 10:49:40 -07:00
Sebastian Ullrich
5c066b6e84 fix(library/derive_attribute): pass options to type_context 2018-08-23 10:48:38 -07:00
Sebastian Ullrich
61f8ebf4ef refactor(library/init/lean/parser/reader): destructure reader into monad and has_tokens typeclass 2018-08-23 10:38:59 -07:00
Sebastian Ullrich
adfc8c9e62 chore(tests/lean/run/deriv): fix test 2018-08-23 10:38:59 -07:00
Leonardo de Moura
82095cc018 refactor(kernel): split declaration into declaration and constant_info
This is just another step towards the design described at commit 16598391a07d4a
2018-08-22 17:53:11 -07:00
Leonardo de Moura
fdcbf3fe9e chore(runtime/object): "section comments" 2018-08-22 17:53:11 -07:00
Sebastian Ullrich
666c431982 chore(library/init/io): hide/remove io.put_str/put_str_ln 2018-08-22 17:48:02 -07:00
Sebastian Ullrich
6009279ab3 fix(library/compiler/cse): deactivate CSE for constructor applications
Fixes 1968
2018-08-22 14:32:03 -07:00
Sebastian Ullrich
762259a96f chore(library/init/lean/parser/reader): cleanup 2018-08-22 14:32:03 -07:00
Sebastian Ullrich
14a5246695 fix(frontends/lean/elaborator): nested parser should reset imports 2018-08-22 14:32:03 -07:00
Sebastian Ullrich
287fdce45b refactor(library/init/lean/parser/reader): remove reader.has_view default instance 2018-08-22 14:32:03 -07:00
Sebastian Ullrich
6384d118a8 fix(frontends/lean/builtin_cmds,library/vm/vm): fix debug build 2018-08-22 14:32:03 -07:00
Sebastian Ullrich
c69cc61292 feat(frontends/lean,library/init/lean/parser/reader/module): add node_choice! macro
Creates an inductive type from an ordered choice reader
2018-08-22 14:32:03 -07:00
Sebastian Ullrich
1b8e74123c feat(frontends/lean/{builtin_exprs,elaborator}): special-case try inside of node! 2018-08-22 14:32:03 -07:00
Sebastian Ullrich
26d696a937 feat(frontends/lean,library/init/lean/parser/reader/module): basic node! macro 2018-08-22 14:32:03 -07:00
Leonardo de Moura
f3e99286bb chore(kernel): remove certified_declaration 2018-08-22 12:11:34 -07:00
Leonardo de Moura
d64a49a7da feat(library/init/lean/declaration): use task at theorem and definition declaration objects 2018-08-22 10:31:50 -07:00
Leonardo de Moura
d0dc998873 chore(library/init/core): remove opaque comments
We don't need to use `opaque` for `thunk` and `task`. Their recursor and
projections can be implemented in constant time. We just need to create
a closure which uses the runtime thunk_get/task_get primitive.
2018-08-22 10:27:04 -07:00
Leonardo de Moura
a968b68942 chore(tests/lean/trace1): fix test
@kha: `trace_root` and `trace_ctx` will probably have to be macros that add
`thunk.mk` for us. The coercion is not applied because the types contain metavariables.
The alternative is to implement a more robust coercion resolution procedure.
2018-08-21 16:21:31 -07:00
Leonardo de Moura
3ab1ebcb3f feat(init/core): add task 2018-08-21 16:10:07 -07:00
Leonardo de Moura
261dc999d0 refactor(frontends/lean/elaborator): mark thunk as opaque, and thunk A to A is now a coercion
@kha I was working in the new declaration type and using tasks there.
Since we don't have tasks yet in Lean, I decided to start refactoring
the `thunk` type. I defined it as:

```
-- TODO(Leo): mark as opaque, it is implemented by the new runtime
structure thunk (α : Type u) : Type u :=
(fn : unit → α)

def thunk.pure {α : Type u} (a : α) : thunk α :=
⟨λ _, a⟩

def thunk.get {α : Type u} (t : thunk α) : α :=
t.fn ()
```

The idea is to use the runtime primitives to implement them.
Then, I realized the support for `thunk`s in the elaborator are quite
hacky. Given `f x`, if `f`'s domain has type `thunk A`, we elaborate
`f x` as `f (fun _, x)` even if `x` has type `thunk A`.
This is quite bad, for example, suppose we have
```
def f (x : thunk A) := ...
```
Then, the following definition is type incorrect.
```
def g (x : thunk A) := f x
```
and we are forced to write
```
def g (x : thunk A) := f (x ())
```
The term `f (x ())` will be elaborated as `f (fun _, x ())` and an
unnecessary closure is created at runtime.

This mechanism inherited from Lean 3 is also incompatible with the
new thunk definition. Given `x : thunk A`, I want to write `x.get`
to retrieve the value instead of `x ()` as in Lean 3.
However, `x.get` expands into the nonsensical `(fun _, x).get`.

So, I decided to view the mapping `A` to `thunk A` as a "coercion".
I used double quotes, because it is a macro instead of a function.
If it were a coercion, then we would be using `thunk.pure` to coerce
values but this is not we want most of the time.
For example, given `f : thunk A -> B` and a term `t : A`, when we write
`f t`, we want it to be converted into `f (fun _, t)` instead of
`f (thunk.pure t)` which would eagerly compute `t`. The transformation
`t` into `fun _, t` is syntactic.
We cannot implement it using type classes. I implemented it as
a hard-coded extra case like the one from `Prop` to `bool`.
We can also add a coercion from `thunk A` to `A` to avoid the `.get`.

That being said, I had a few breakages in the code base since we only
use coercions when the given and expected type do not contain
metavariables.
2018-08-21 15:27:51 -07:00
Leonardo de Moura
dc477db71e chore(kernel/environment): remove environment::is_descendant
We will remove certified_declaration since we are adding tasks to the
kernel. We have removed `environment::replace`. We also don't need it
for checking the consistency of thread local caches since they will be
removed.
2018-08-21 13:25:58 -07:00
Leonardo de Moura
f6684b24c6 chore(kernel): cleanup 2018-08-21 13:09:27 -07:00
Leonardo de Moura
d9399924c9 chore(kernel/type_checker): hide aux procedure 2018-08-21 12:59:12 -07:00
Leonardo de Moura
027ce06f89 chore(kernel/environment): remove environment::replace
We added tasks to the runtime.
2018-08-21 12:47:08 -07:00
Leonardo de Moura
682cfa14e8 chore(library/init/lean/declaration): add new declaration type 2018-08-21 10:13:16 -07:00
Leonardo de Moura
47d74e1a5a chore(kernel/declaration): minor cleanup 2018-08-21 10:11:23 -07:00
Leonardo de Moura
6473bd1294 chore(frontends/lean/builtin_cmds): fix warning 2018-08-21 10:09:39 -07:00
Leonardo de Moura
04fbbbb0d6 refactor(library/init/lean/declaration): declaration -> constant_info
This is the first step in the declaration vs constant_info refactor.
Here is the design notes:

In Lean3, we use the `declaration` objects to represent new declarations
that are sent to the kernel, and to store information for all constants
declared in an environment.
This design decision was done when we did not have support for
mutual (meta) declarations, and information about inductive datatypes,
constructors and recursors were stored in an environment extension.
This design now seems weird since we have four different methods for
adding declarations into the environment:
```
    environment add(certified_declaration const & d) const;
    environment add_meta(buffer<declaration> const & ds, bool check = true) const;
    environment add(inductive_decl const & decl) const;
    environment add_quot() const;
```
Moreover, we use `mk_constant_assumption` to represent inductive
datatype, constructors, recursors, and `quot` primitives.
Since inductive datatypes, constructors, recursors and `quot` primitives
are not considered axioms, we have the method:
```
    bool environment::is_builtin(name const & n) const;
```

We can avoid these hacks by having a type for representing
declarations (i.e., objects that are sent to the kernel) and
objects for storing information of the constant declarations stored
in an environment object.

A `declaration` object is now of the form
```
inductive declaration
| defn_decl        (val : definition_val)
| axiom_decl       (val : axiom_val)
| thm_decl         (val : theorem_val)
| quot_decl
| mutual_defn_decl (defns : list definition_val) -- All definitions must be marked as `meta`
| induct_decl      (lparams : list name) (nparams : nat) (types : list inductive_type) (is_meta : bool)

/-
If we want, we can let users specify their own names for `quot`,
`quot.mk`, `quot.lift` and `quot.ind`. We just need to add them
as fields of `declaration.quot_decl`.
-/
```

When we check a declaration, one or more `constant_info` objects are
created for each new constant in the declaration.
```
inductive constant_info
| assump_info   (val : assumption_val)
| defn_info     (val : definition_val)
| axiom_info    (val : axiom_val)
| thm_info      (val : theorem_val)
| quot_info     (val : quot_val)
| induct_info   (val : inductive_val)
| cnstr_info    (val : constructor_val)
| rec_info      (val : recursor_val)
```
For simple declarations `constant` (aka `assumption`), `definition`,
`theorem` and `axiom`, the information stored in the `constant_info` is
identical to the information in the `declaration` object. This is
expected since these are the original Lean3 declarations.

The `environment` object stores a mapping from `name` to
`constant_info`. The function `check` validates a declaration
and produces a `certified_declaration`. A `certified_declaration` is
a pair `(declaration, list constant_info)`. The `list` here makes it
explicit that a declaration may add one or more new constants into the
environment. Finally, the `environment` object has a single `add`
method and a single `get` and `find`:
```
    environment add(certified_declaration const & d) const;

    /** \brief Return info for the constant with name \c n (if it is defined in this environment). */
    optional<constant_info> find(name const & n) const;

    /** \brief Return info for the constant with name \c n. Throws an
        exception if has not been declared in this environment. */
    constant_info get(name const & n) const;
```

Moreover, the method `environment::builtin` is not necessary anymore.
If `environment::get(n)` returns an `axiom_info` or an `assump_info`, then
we know for sure the constant named `n` has been postulated.

This commit only defined the new types in Lean. I still need to make
the changes to the C++ code base.
2018-08-21 09:59:30 -07:00
Leonardo de Moura
0b349f1abf chore(*): fix style 2018-08-21 09:32:01 -07:00
Leonardo de Moura
4314617a85 chore(library/init/io): remove dead code 2018-08-21 09:00:14 -07:00
Sebastian Ullrich
6dbe54a01b chore(library/init/io): rename io.print_ln to io.println 2018-08-21 08:43:10 -07:00
Sebastian Ullrich
3516c37ec9 feat(library/init/control/coroutine_io): coroutine_io 2018-08-21 08:43:10 -07:00
Sebastian Ullrich
a42fb533f4 fix(library/vm/vm_io): move all primitives into io
While `cmdline_args` has no side-effects, it is certainly not a pure function.
The `stdin` etc. should have been safe since all accessors are in `io`, but
better be safe than sorry.
2018-08-21 08:43:10 -07:00