-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mostly complete locally nameless support
- Loading branch information
Showing
13 changed files
with
2,185 additions
and
1,167 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import Lott.DSL.Elab.Basic | ||
import Lott.DSL.Parser.UniversalJudgement | ||
|
||
namespace Lott.DSL.Elab | ||
|
||
open Lean.Elab | ||
|
||
@[lott_term_elab Lott.DSL.universalJudgement] | ||
private | ||
def universalJudgementTermElab : TermElab := fun _ stx => do | ||
let `(Lott.Judgement| ∀ $i $[$binderPred?]?, $«judgement»:Lott.Judgement) := stx | ||
| throwUnsupportedSyntax | ||
let stx' ← if let some bp := binderPred? then | ||
``(∀ $i:ident, satisfies_binder_pred% $i $bp → [[$«judgement»:Lott.Judgement]]) | ||
else | ||
``(∀ $i:ident, [[$«judgement»:Lott.Judgement]]) | ||
Lean.Elab.Term.elabTerm stx' none | ||
|
||
end Lott.DSL.Elab | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,89 +1 @@ | ||
import Lean.Data.Trie | ||
import Lean.Environment | ||
import Lott.DSL.IR | ||
|
||
namespace Lott.DSL | ||
|
||
open Lean | ||
open Lean.Data | ||
|
||
structure Alias where | ||
canon : Name | ||
alias : Name | ||
|
||
instance : Inhabited Alias where default := { canon := default, alias := default } | ||
|
||
structure AliasState where | ||
byAlias : Trie Alias | ||
allCanon : NameSet | ||
|
||
instance : Inhabited AliasState where default := { byAlias := default, allCanon := default } | ||
|
||
initialize aliasExt : PersistentEnvExtension Alias Alias AliasState ← | ||
registerPersistentEnvExtension { | ||
mkInitial := return default | ||
addImportedFn := fun aliasss => return { | ||
byAlias := | ||
aliasss.flatten.foldl (init := .empty) fun acc a => acc.upsert a.alias.toString fun _ => a | ||
allCanon := aliasss.flatten.map (·.canon) |> RBTree.fromArray (cmp := Name.quickCmp) | ||
} | ||
addEntryFn := fun { byAlias, allCanon } a => { | ||
byAlias := byAlias.insert a.alias.toString a | ||
allCanon := allCanon.insert a.canon | ||
} | ||
exportEntriesFn := fun { byAlias, .. } => byAlias.values | ||
} | ||
|
||
initialize metaVarExt : PersistentEnvExtension Name Name NameSet ← | ||
registerPersistentEnvExtension { | ||
mkInitial := return default | ||
addImportedFn := fun metaVarss => return metaVarss.flatten.foldl NameSet.insert .empty | ||
addEntryFn := NameSet.insert | ||
exportEntriesFn := | ||
RBTree.fold (cmp := Name.quickCmp) (init := #[]) fun acc metaVar => acc.push metaVar | ||
} | ||
|
||
structure Symbol where | ||
qualified : Name | ||
normalProds : NameMap (Array IR) | ||
substitutions : Array (Name × Name) | ||
|
||
instance : Inhabited Symbol where | ||
default := { qualified := default, normalProds := default, substitutions := default } | ||
|
||
abbrev SymbolState := NameMap Symbol | ||
|
||
initialize symbolExt : PersistentEnvExtension Symbol Symbol SymbolState ← | ||
registerPersistentEnvExtension { | ||
mkInitial := return default | ||
addImportedFn := fun symss => | ||
return symss.flatten.foldl (init := mkNameMap _) fun acc sym => acc.insert sym.qualified sym | ||
addEntryFn := fun st sym => st.insert sym.qualified sym | ||
exportEntriesFn := RBMap.fold (cmp := Name.quickCmp) (init := #[]) fun acc _ sym => acc.push sym | ||
} | ||
|
||
structure Judgement where | ||
name : Name | ||
ir : Array IR | ||
|
||
structure JudgementState where | ||
byName : NameMap Judgement | ||
all : NameSet | ||
|
||
instance : Inhabited JudgementState where default := { byName := default, all := default } | ||
|
||
initialize judgementExt : PersistentEnvExtension Judgement Judgement JudgementState ← registerPersistentEnvExtension { | ||
mkInitial := return default | ||
addImportedFn := fun jds => return { | ||
byName := jds.flatten.foldl (init := mkNameMap _) fun acc jd => acc.insert jd.name jd | ||
all := jds.flatten.map (·.name) |> RBTree.fromArray (cmp := Name.quickCmp) | ||
} | ||
addEntryFn := fun { byName, all } jd => { | ||
byName := byName.insert jd.name jd | ||
all := all.insert jd.name | ||
} | ||
exportEntriesFn := fun { byName, .. } => | ||
byName.fold (cmp := Name.quickCmp) (init := #[]) fun acc _ jd => acc.push jd | ||
} | ||
|
||
end Lott.DSL | ||
import Lott.DSL.Environment.Basic |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
import Lean.Data.Trie | ||
import Lean.Environment | ||
import Lott.DSL.IR | ||
|
||
namespace Lott.DSL | ||
|
||
open Lean | ||
open Lean.Data | ||
|
||
structure Alias where | ||
canon : Name | ||
alias : Name | ||
|
||
instance : Inhabited Alias where default := { canon := default, alias := default } | ||
|
||
structure AliasState where | ||
byAlias : Trie Alias | ||
allCanon : NameSet | ||
|
||
instance : Inhabited AliasState where default := { byAlias := default, allCanon := default } | ||
|
||
initialize aliasExt : PersistentEnvExtension Alias Alias AliasState ← | ||
registerPersistentEnvExtension { | ||
mkInitial := return default | ||
addImportedFn := fun aliasss => return { | ||
byAlias := | ||
aliasss.flatten.foldl (init := .empty) fun acc a => acc.upsert a.alias.toString fun _ => a | ||
allCanon := aliasss.flatten.map (·.canon) |> RBTree.fromArray (cmp := Name.quickCmp) | ||
} | ||
addEntryFn := fun { byAlias, allCanon } a => { | ||
byAlias := byAlias.insert a.alias.toString a | ||
allCanon := allCanon.insert a.canon | ||
} | ||
exportEntriesFn := fun { byAlias, .. } => byAlias.values | ||
} | ||
|
||
structure Symbol where | ||
qualified : Name | ||
normalProds : NameMap (Array IR) | ||
substitutions : Array (Name × Name) | ||
|
||
instance : Inhabited Symbol where | ||
default := { qualified := default, normalProds := default, substitutions := default } | ||
|
||
abbrev SymbolState := NameMap Symbol | ||
|
||
initialize symbolExt : PersistentEnvExtension Symbol Symbol SymbolState ← | ||
registerPersistentEnvExtension { | ||
mkInitial := return default | ||
addImportedFn := fun symss => | ||
return symss.flatten.foldl (init := mkNameMap _) fun acc sym => acc.insert sym.qualified sym | ||
addEntryFn := fun st sym => st.insert sym.qualified sym | ||
exportEntriesFn := RBMap.fold (cmp := Name.quickCmp) (init := #[]) fun acc _ sym => acc.push sym | ||
} | ||
|
||
structure Judgement where | ||
name : Name | ||
ir : Array IR | ||
ids : Array Name | ||
|
||
structure JudgementState where | ||
byName : NameMap Judgement | ||
all : NameSet | ||
|
||
instance : Inhabited JudgementState where default := { byName := default, all := default } | ||
|
||
initialize judgementExt : PersistentEnvExtension Judgement Judgement JudgementState ← registerPersistentEnvExtension { | ||
mkInitial := return default | ||
addImportedFn := fun jds => return { | ||
byName := jds.flatten.foldl (init := mkNameMap _) fun acc jd => acc.insert jd.name jd | ||
all := jds.flatten.map (·.name) |> RBTree.fromArray (cmp := Name.quickCmp) | ||
} | ||
addEntryFn := fun { byName, all } jd => { | ||
byName := byName.insert jd.name jd | ||
all := all.insert jd.name | ||
} | ||
exportEntriesFn := fun { byName, .. } => | ||
byName.fold (cmp := Name.quickCmp) (init := #[]) fun acc _ jd => acc.push jd | ||
} | ||
|
||
end Lott.DSL |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import Lean | ||
|
||
namespace Lott.DSL | ||
|
||
open Lean | ||
|
||
initialize metaVarExt : PersistentEnvExtension (Name × Bool) (Name × Bool) (NameMap Bool) ← | ||
registerPersistentEnvExtension { | ||
mkInitial := return default | ||
addImportedFn := fun metaVarss => | ||
return metaVarss.flatten.foldl (init := mkNameMap _) (fun acc (n, ln) => acc.insert n ln) | ||
addEntryFn := fun st (n, ln) => st.insert n ln | ||
exportEntriesFn := RBMap.fold (cmp := Name.quickCmp) (init := #[]) fun acc n ln => acc.push (n, ln) | ||
} | ||
|
||
end Lott.DSL |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.