summaryrefslogtreecommitdiff
path: root/src/Obs/Typing/Context.idr
blob: ad1d0a7b7af4f03325b3ff6b3b52a2b40f2118c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
module Obs.Typing.Context

import Data.Fin
import public Data.List
import Data.List.Elem

import Obs.Logging
import Obs.NormalForm
import Obs.NormalForm.Normalise
import Obs.Substitution
import Obs.Universe

import Text.Bounded

-- Definitions -----------------------------------------------------------------

infix 5 ::<

public export
record FreeVar (ctx : List Relevance) where
  constructor MkFreeVar
  sort : Universe
  ty : TypeNormalForm ctx
  name : String

public export
record TyDef (b : Relevance) (ctx : List Relevance) where
  constructor MkDefinition
  name : String
  sort : Universe
  ty : TypeNormalForm ctx
  tm : NormalForm (relevance sort) ctx
  correct : relevance sort = b

public export
data TyContext : Unsorted.Family Relevance where
  Nil   : TyContext []
  (:<)  : TyContext ctx -> (def : Definition ctx) -> TyContext (relevance def.sort :: ctx)
  (::<) : TyContext ctx -> (var : FreeVar ctx) -> TyContext (relevance var.sort :: ctx)

-- Properties ------------------------------------------------------------------

freeVars : TyContext ctx -> List Relevance
freeVars [] = []
freeVars (ctx :< def) = freeVars ctx
freeVars (ctx ::< var) = relevance var.sort :: freeVars ctx

Sorted.Rename Relevance TyDef where
  rename def f = {ty := rename def.ty f, tm := rename def.tm f} def

-- Construction ----------------------------------------------------------------

fromDef : (def : Definition ctx) -> TyDef (relevance def.sort) ctx
fromDef def = MkDefinition
  { name = def.name.val
  , sort = def.sort
  , ty = def.ty
  , tm = def.tm
  , correct = Refl
  }

fromVar : (var : FreeVar ctx) -> TyDef (relevance var.sort) (relevance var.sort :: ctx)
fromVar var = MkDefinition
  { name = var.name
  , sort = var.sort
  , ty = weaken [relevance var.sort] var.ty
  , tm = point (Just var.name) Here
  , correct = Refl
  }

export
fromContext : Context ctx -> TyContext ctx
fromContext []           = []
fromContext (ctx :< def) = fromContext ctx :< def

-- Destruction -----------------------------------------------------------------

export
getContext : TyContext ctx -> (ctx' ** ctx = ctx')
getContext [] = ([] ** Refl)
getContext (ctx :< def) =
  let (ctx' ** prf) = getContext ctx in
  (relevance def.sort :: ctx' ** cong (relevance def.sort ::) prf)
getContext (ctx ::< var) =
  let (ctx' ** prf) = getContext ctx in
  (relevance var.sort :: ctx' ** cong (relevance var.sort ::) prf)

export
index : TyContext ctx -> Map ctx TyDef ctx
index [] = absurd
index (ctx :< def) = weaken [_] . add TyDef (fromDef def) (index ctx)
index (ctx ::< var) = add TyDef (fromVar var) (weaken [_] . index ctx)

finToElem : {xs : List a} -> (i : Fin (length xs)) -> Elem (index' xs i) xs
finToElem {xs = (x :: xs)} FZ = Here
finToElem {xs = (x :: xs)} (FS i) = There (finToElem i)

export
index' : TyContext ctx -> (i : Fin (length ctx)) -> TyDef (index' ctx i) ctx
index' ctx i = let (ctx' ** Refl) = getContext ctx in index ctx (finToElem i)

export
reduce : (tyCtx : TyContext ctx) -> Map ctx (LogNormalForm ann) (freeVars tyCtx)
reduce [] = absurd
reduce (ctx :< def) = add (LogNormalForm ann) (subst def.tm (reduce ctx)) (reduce ctx)
reduce (ctx ::< var) = add (LogNormalForm ann)
  (pure $ point (Just var.name) Here)
  (\i => pure $ weaken [_] $ !(reduce ctx i))