lean4-htt/library/init/meta/expr.lean
Sebastian Ullrich fd2c42a8bf chore(library, tests): switch to new attribute declaration syntax
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
2016-08-12 15:36:12 -07:00

186 lines
5.5 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
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