Loc.agda 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. module Loc (K : Set) where
  2. open import Basics
  3. open import Pr
  4. open import Nom
  5. data Loc : Set where
  6. EL : Loc
  7. _*_ : Loc -> K -> Loc
  8. infixl 50 _*_
  9. data _!_ : Loc -> K -> Set where
  10. top : {L : Loc}{S : K} -> (L * S) ! S
  11. pop : {L : Loc}{S T : K} -> L ! S -> (L * T) ! S
  12. _<*_ : K -> Loc -> Loc
  13. S <* EL = EL * S
  14. S <* (L * T) = (S <* L) * T
  15. max : {S : K}(L : Loc) -> (S <* L) ! S
  16. max EL = top
  17. max (L * T) = pop (max L)
  18. _<_ : (S : K){L : Loc}{T : K} -> L ! T -> (S <* L) ! T
  19. S < top = top
  20. S < pop x = pop (S < x)
  21. data MaxV (S : K)(L : Loc) : {T : K} -> (S <* L) ! T -> Set where
  22. isMax : MaxV S L (max L)
  23. isLow : {T : K}(x : L ! T) -> MaxV S L (S < x)
  24. maxV : (S : K)(L : Loc){T : K}(x : (S <* L) ! T) -> MaxV S L x
  25. maxV S EL top = isMax
  26. maxV S EL (pop ())
  27. maxV S (L * T) top = isLow top
  28. maxV S (L * T) (pop x) with maxV S L x
  29. maxV S (L * T) (pop .(max L)) | isMax = isMax
  30. maxV S (L * T) (pop .(S < x)) | isLow x = isLow (pop x)
  31. _bar_ : (L : Loc){S : K} -> L ! S -> Loc
  32. EL bar ()
  33. (L * S) bar top = L
  34. (L * S) bar (pop v) = (L bar v) * S
  35. infixl 50 _bar_
  36. _thin_ : {L : Loc}{S T : K}(x : L ! S) -> (L bar x) ! T -> L ! T
  37. top thin y = pop y
  38. (pop x) thin top = top
  39. (pop x) thin (pop y) = pop (x thin y)
  40. data VarQV {L : Loc}{S : K}(x : L ! S) : {T : K} -> (L ! T) -> Set where
  41. vSame : VarQV x x
  42. vDiff : {T : K}(y : (L bar x) ! T) -> VarQV x (x thin y)
  43. varQV : {L : Loc}{S T : K}(x : L ! S)(y : L ! T) -> VarQV x y
  44. varQV top top = vSame
  45. varQV top (pop y) = vDiff y
  46. varQV (pop x) top = vDiff top
  47. varQV (pop x) (pop y) with varQV x y
  48. varQV (pop x) (pop .x) | vSame = vSame
  49. varQV (pop x) (pop .(x thin y)) | vDiff y = vDiff (pop y)