feat(library/init/lean): add LocalContext

This commit is contained in:
Leonardo de Moura 2019-08-04 09:29:05 -07:00
parent 8a8b45b6e0
commit f55a00a022
3 changed files with 106 additions and 0 deletions

View file

@ -36,6 +36,12 @@ namespace PersistentArray
variables {α : Type u}
open PersistentArrayNode
def empty : PersistentArray α :=
{}
def isEmpty (a : PersistentArray α) : Bool :=
a.size == 0
instance : Inhabited (PersistentArray α) := ⟨{}⟩
def mkEmptyArray : Array α := Array.mkEmpty branching.toNat

View file

@ -44,6 +44,9 @@ variables {α : Type u} {β : Type v}
def empty : PersistentHashMap α β := {}
def isEmpty (m : PersistentHashMap α β) : Bool :=
m.size == 0
instance : Inhabited (PersistentHashMap α β) := ⟨{}⟩
def mkEmptyEntries {α β} : Node α β :=

View file

@ -0,0 +1,97 @@
/-
Copyright (c) 2019 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura
-/
prelude
import init.data.persistentarray.basic
import init.data.persistenthashmap.basic
import init.lean.expr
namespace Lean
inductive LocalDecl
| cdecl (index : Nat) (name : Name) (userName : Name) (type : Expr) (bi : BinderInfo)
| ldecl (index : Nat) (name : Name) (userName : Name) (type : Expr) (value : Expr)
namespace LocalDecl
instance : Inhabited LocalDecl := ⟨ldecl (default _) (default _) (default _) (default _) (default _)⟩
def isLet : LocalDecl → Bool
| (cdecl _ _ _ _ _) := false
| (ldecl _ _ _ _ _) := true
def index : LocalDecl → Nat
| (cdecl idx _ _ _ _) := idx
| (ldecl idx _ _ _ _) := idx
def name : LocalDecl → Name
| (cdecl _ n _ _ _) := n
| (ldecl _ n _ _ _) := n
def userName : LocalDecl → Name
| (cdecl _ _ n _ _) := n
| (ldecl _ _ n _ _) := n
def type : LocalDecl → Expr
| (cdecl _ _ _ t _) := t
| (ldecl _ _ _ t _) := t
def binderInfo : LocalDecl → BinderInfo
| (cdecl _ _ _ _ bi) := bi
| (ldecl _ _ _ _ _) := BinderInfo.default
def valueOpt : LocalDecl → Option Expr
| (cdecl _ _ _ _ _) := none
| (ldecl _ _ _ _ v) := some v
def value : LocalDecl → Expr
| (cdecl _ _ _ _ _) := default _
| (ldecl _ _ _ _ v) := v
end LocalDecl
structure LocalContext :=
(nameToDecl : PHashMap Name LocalDecl := PersistentHashMap.empty)
(decls : PArray (Option LocalDecl) := PersistentArray.empty)
namespace LocalContext
instance : Inhabited LocalContext := ⟨{}⟩
def isEmpty (lctx : LocalContext) : Bool :=
lctx.nameToDecl.isEmpty
def mkLocalDecl (lctx : LocalContext) (name : Name) (userName : Name) (type : Expr) (bi : BinderInfo := BinderInfo.default) : LocalDecl × LocalContext :=
match lctx with
| { nameToDecl := map, decls := decls } =>
let idx := decls.size;
let decl := LocalDecl.cdecl idx name userName type bi;
(decl, { nameToDecl := map.insert name decl, decls := decls.push decl })
def mkLetDecl (lctx : LocalContext) (name : Name) (userName : Name) (type : Expr) (value : Expr) : LocalDecl × LocalContext :=
match lctx with
| { nameToDecl := map, decls := decls } =>
let idx := decls.size;
let decl := LocalDecl.ldecl idx name userName type value;
(decl, { nameToDecl := map.insert name decl, decls := decls.push decl })
def find (lctx : LocalContext) (name : Name) : Option LocalDecl :=
lctx.nameToDecl.find name
/-
private partial def popTailNoneAux : PArray (Option LocalDecl) → PArray (Option LocalDecl)
| a :=
if a.size == 0 then a
else if
def erase (lctx : LocalContext) (name : Name) : LocalContext :=
match lctx with
| { nameToDecl := map, decls := decls } =>
match map.find name with
| none => lctx
| some decl => { nameToDecl := map.erase name, decls := decls.set decl.index none }
-/
end LocalContext
end Lean