summaryrefslogtreecommitdiff
path: root/src/Core/Term.idr
blob: 74ef7af6717fec889d8c922015a54a41b9bfba05 (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
module Core.Term

import Core.Thinning

import public Data.Fin

-- Definition ------------------------------------------------------------------

public export
data Term : Nat -> Type where
  Var : Fin n -> Term n

  Set : Term n

  Pi : Term n -> Term (S n) -> Term n
  Abs : Term (S n) -> Term n
  App : Term n -> Term n -> Term n

%name Term t, u, v

-- Weakening -------------------------------------------------------------------

public export
wkn : Term m -> m `Thins` n -> Term n
wkn (Var i) thin = Var (wkn i thin)
wkn Set thin = Set
wkn (Pi t u) thin = Pi (wkn t thin) (wkn u $ keep thin)
wkn (Abs t) thin = Abs (wkn t $ keep thin)
wkn (App t u) thin = App (wkn t thin) (wkn u thin)

export
wknHomo :
  (t : Term k) ->
  (thin1 : k `Thins` m) ->
  (thin2 : m `Thins` n) ->
  wkn (wkn t thin1) thin2 = wkn t (thin2 . thin1)
wknHomo (Var i) thin1 thin2 = cong Var (wknHomo i thin1 thin2)
wknHomo Set thin1 thin2 = Refl
wknHomo (Pi t u) thin1 thin2 =
  cong2 Pi
    (wknHomo t thin1 thin2)
    (trans
      (wknHomo u (keep thin1) (keep thin2))
      (cong (wkn u) $ compKeep thin2 thin1))
wknHomo (Abs t) thin1 thin2 =
  cong Abs
    (trans
      (wknHomo t (keep thin1) (keep thin2))
      (cong (wkn t) $ compKeep thin2 thin1))
wknHomo (App t u) thin1 thin2 = cong2 App (wknHomo t thin1 thin2) (wknHomo u thin1 thin2)