sed -Ei 's/^(\s*)((private |protected )?(noncomputable )?(abbreviation|definition|meta_definition|theorem|lemma|proposition|corollary)\s+\S+\s*)((\s*\[(\S+(\s+[0-9]+)*|priority.*)\])+)\s*/\1attribute \6\n\1\2/' library/**/*.lean tests/**/*.lean sed -Ei 's/\s+$//' library/**/*.lean # remove trailing whitespace
186 lines
5.5 KiB
Text
186 lines
5.5 KiB
Text
/-
|
||
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Leonardo de Moura
|
||
-/
|
||
prelude
|
||
import init.meta.level
|
||
|
||
inductive binder_info :=
|
||
| default | implicit | strict_implicit | inst_implicit | other
|
||
|
||
meta_constant macro_def : Type₁
|
||
|
||
/- Reflect a C++ expr object. The VM replaces it with the C++ implementation. -/
|
||
inductive expr :=
|
||
| var : unsigned → expr
|
||
| sort : level → expr
|
||
| const : name → list level → expr
|
||
| meta : name → expr → expr
|
||
| local_const : name → name → binder_info → expr → expr
|
||
| app : expr → expr → expr
|
||
| lam : name → binder_info → expr → expr → expr
|
||
| pi : name → binder_info → expr → expr → expr
|
||
| elet : name → expr → expr → expr → expr
|
||
| macro : macro_def → ∀ n : unsigned, (fin (unsigned.to_nat n) → expr) → expr
|
||
|
||
attribute [instance]
|
||
definition expr.is_inhabited : inhabited expr :=
|
||
inhabited.mk (expr.sort level.zero)
|
||
|
||
meta_constant expr.mk_macro (d : macro_def) : list expr → expr
|
||
meta_definition expr.mk_var (n : nat) : expr :=
|
||
expr.var (unsigned.of_nat n)
|
||
|
||
meta_constant expr.has_decidable_eq : decidable_eq expr
|
||
attribute [instance] expr.has_decidable_eq
|
||
meta_constant expr.alpha_eqv : expr → expr → bool
|
||
notation a ` =ₐ `:50 b:50 := expr.alpha_eqv a b = bool.tt
|
||
|
||
meta_constant expr.to_string : expr → string
|
||
attribute [instance]
|
||
meta_definition expr.has_to_string : has_to_string expr :=
|
||
has_to_string.mk expr.to_string
|
||
|
||
meta_constant expr.hash : expr → nat
|
||
|
||
meta_constant expr.lt : expr → expr → bool
|
||
meta_constant expr.lex_lt : expr → expr → bool
|
||
meta_definition expr.cmp (a b : expr) : ordering :=
|
||
if expr.lt a b = bool.tt then ordering.lt
|
||
else if a = b then ordering.eq
|
||
else ordering.gt
|
||
|
||
meta_constant expr.fold {A :Type} : expr → A → (expr → unsigned → A → A) → A
|
||
|
||
meta_constant expr.abstract_local : expr → name → expr
|
||
meta_constant expr.abstract_locals : expr → list name → expr
|
||
|
||
meta_constant expr.instantiate_var : expr → expr → expr
|
||
meta_constant expr.instantiate_vars : expr → list expr → expr
|
||
|
||
meta_constant expr.has_var : expr → bool
|
||
meta_constant expr.has_var_idx : expr → nat → bool
|
||
meta_constant expr.has_local : expr → bool
|
||
meta_constant expr.has_meta_var : expr → bool
|
||
meta_constant expr.lift_vars : expr → nat → nat → expr
|
||
meta_constant expr.lower_vars : expr → nat → nat → expr
|
||
|
||
namespace expr
|
||
open decidable
|
||
|
||
meta_definition app_of_list : expr → list expr → expr
|
||
| f [] := f
|
||
| f (p::ps) := app_of_list (expr.app f p) ps
|
||
|
||
meta_definition is_app : expr → bool
|
||
| (app _ _ ) := tt
|
||
| _ := ff
|
||
|
||
meta_definition app_fn : expr → expr
|
||
| (app f a) := f
|
||
| a := a
|
||
|
||
meta_definition app_arg : expr → expr
|
||
| (app f a) := a
|
||
| a := a
|
||
|
||
meta_definition get_app_fn : expr → expr
|
||
| (app f a) := get_app_fn f
|
||
| a := a
|
||
|
||
meta_definition get_app_num_args : expr → nat
|
||
| (app f a) := get_app_num_args f + 1
|
||
| _ := 0
|
||
|
||
meta_definition get_app_args_aux : list expr → expr → list expr
|
||
| r (app f a) := get_app_args_aux (a::r) f
|
||
| r _ := r
|
||
|
||
meta_definition get_app_args : expr → list expr :=
|
||
get_app_args_aux []
|
||
|
||
meta_definition const_name : expr → name
|
||
| (const n ls) := n
|
||
| _ := name.anonymous
|
||
|
||
meta_definition is_constant : expr → bool
|
||
| (const n ls) := tt
|
||
| _ := ff
|
||
|
||
meta_definition is_local_constant : expr → bool
|
||
| (local_const _ _ _ _) := tt
|
||
| _ := ff
|
||
|
||
meta_definition local_uniq_name : expr → name
|
||
| (local_const n _ _ _) := n
|
||
| _ := name.anonymous
|
||
|
||
meta_definition local_pp_name : expr → name
|
||
| (local_const _ n _ _) := n
|
||
| _ := name.anonymous
|
||
|
||
meta_definition is_constant_of : expr → name → bool
|
||
| (const n₁ ls) n₂ := to_bool (n₁ = n₂)
|
||
| _ _ := ff
|
||
|
||
meta_definition is_app_of (e : expr) (n : name) : bool :=
|
||
is_app e && is_constant_of (get_app_fn e) n
|
||
|
||
meta_definition is_false (e : expr) : bool :=
|
||
is_constant_of e `false
|
||
|
||
meta_definition is_not : expr → option expr
|
||
| (app f a) := if is_constant_of f `not = tt then some a else none
|
||
| (pi _ _ a b) := if is_false b = tt then some a else none
|
||
| _ := none
|
||
|
||
meta_definition is_eq (e : expr) : option (expr × expr) :=
|
||
if is_app_of e `eq = tt ∧ get_app_num_args e = 3
|
||
then some (app_arg (app_fn e), app_arg e)
|
||
else none
|
||
|
||
meta_definition is_ne (e : expr) : option (expr × expr) :=
|
||
if is_app_of e `ne = tt ∧ get_app_num_args e = 3
|
||
then some (app_arg (app_fn e), app_arg e)
|
||
else none
|
||
|
||
meta_definition is_heq (e : expr) : option (expr × expr × expr × expr) :=
|
||
if is_app_of e `heq = tt ∧ get_app_num_args e = 4
|
||
then some (app_arg (app_fn (app_fn (app_fn e))),
|
||
app_arg (app_fn (app_fn e)),
|
||
app_arg (app_fn e),
|
||
app_arg e)
|
||
else none
|
||
|
||
meta_definition is_pi : expr → bool
|
||
| (pi _ _ _ _) := tt
|
||
| _ := ff
|
||
|
||
meta_definition is_let : expr → bool
|
||
| (elet _ _ _ _) := tt
|
||
| _ := ff
|
||
|
||
meta_definition binding_name : expr → name
|
||
| (pi n _ _ _) := n
|
||
| (lam n _ _ _) := n
|
||
| e := name.anonymous
|
||
|
||
meta_definition binding_info : expr → binder_info
|
||
| (pi _ bi _ _) := bi
|
||
| (lam _ bi _ _) := bi
|
||
| e := binder_info.default
|
||
|
||
meta_definition binding_domain : expr → expr
|
||
| (pi _ _ d b) := d
|
||
| (lam _ _ d b) := d
|
||
| e := e
|
||
|
||
meta_definition binding_body : expr → expr
|
||
| (pi _ _ d b) := b
|
||
| (lam _ _ d b) := b
|
||
| e := e
|
||
|
||
meta_definition prop : expr := expr.sort level.zero
|
||
|
||
end expr
|