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 [ List ~> List) [<] cons = abs' (S $ S Z) (\t, ts => app (lift $ intro {c = ListC} $ There Here) (app' (lift pair) [ 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) [ FullTerm List [<] MkList = foldr (\n, ts => app' cons [ N) [<] sum = app' fold [ app' (lift add) [ 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))