summaryrefslogtreecommitdiff
path: root/src/Total/Encoded/Test.idr
blob: cf5aa8ea609ba9290673580254e12a2f98aacefb (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
module Total.Encoded.Test

import Total.NormalForm
import Total.Pretty
import Total.Encoded.Util

namespace List
  ListC : Container
  ListC = (Unit, 0) ::: [(N, 1)]

  export
  List : Ty
  List = fix ListC

  export
  nil : FullTerm List [<]
  nil = app (intro {c = ListC} Here) (app' pair [<arb, Pair.nil])

  export
  cons : FullTerm (N ~> List ~> List) [<]
  cons = abs' (S $ S Z)
    (\t, ts =>
      app (lift $ intro {c = ListC} $ There Here)
        (app' (lift pair)
          [<t
          , app' (lift Pair.cons) [<ts, lift Pair.nil]
          ]))

  export
  fold : {ty : Ty} -> FullTerm ((N ~> ty ~> ty) ~> ty ~> List ~> ty) [<]
  fold = abs' (S $ S Z)
    (\f, z => elim
      [ abs (drop z)
      , abs' (S Z) (\p =>
        app' (drop f)
          [<app (lift $ fst {u = Vect 1 ty}) p
          , app (lift (index {n = 1} FZ . snd {t = N})) p
          ])
      ])

MkList : List Nat -> FullTerm List [<]
MkList = foldr (\n, ts => app' cons [<lit n, ts]) nil

sum : FullTerm (List ~> N) [<]
sum = app' fold [<add, zero]

ten : FullTerm N [<]
ten = (app sum (MkList [1,2,3,4]))

tenNf : Term [<] N
tenNf = toTerm (normalize ten).term

main : IO Builtin.Unit
main = do
  let
    cases =
      [(lit 1, id)
      ,(lit 3, abs' (S Z) (\n => app' (lift add) [<n, n]))
      ,(lit 2, abs' (S Z) (\n => app (lift pred) n))]
  let t : FullTerm (N ~> N) [<] = cond cases
  -- let t : FullTerm N [<] = app sum (MkList [1,2,3,4])
  putDoc (group $ Doc.pretty "Input:" <+> line <+> pretty (toTerm t))
  putDoc (group $ Doc.pretty "Normal Form:" <+> line <+> pretty (toTerm (normalize t).term))