1
{-# OPTIONS --no-positivity-check --no-termination-check #-}
2
module Homogenous.Base where
7
open PolyDepPrelude using
24
Fa : (n : Arity) -> Set -> Set
26
Fa (suc m) X = Pair X (Fa m X)
28
----------------------------------------------------------------
29
Fa1 : (n : Arity) -> {a b : Set} -> (a -> b) -> Fa n a -> Fa n b
30
Fa1 (zero) f (unit) = unit
31
Fa1 (suc m) f (pair fst snd) = pair (f fst) (Fa1 m f snd)
34
F : (fi : Sig)(X : Set) -> Set
36
F (n :: fi') X = Either (Fa n X) (F fi' X)
38
F1 : (fi : Sig){a b : Set}(f : a -> b)(x : F fi a) -> F fi b
39
F1 (nil) f () -- empty
40
F1 (n :: ns) f (left t) = left (Fa1 n f t)
41
F1 (n :: ns) f (right y) = right (F1 ns f y)
44
FIHa : (n : Arity){X : Set}(C : X -> Set)(x : Fa n X) -> Set
45
FIHa (zero) C unit = Unit
46
FIHa (suc m) C (pair fst snd) = Pair (C fst) (FIHa m C snd)
48
FIH : (fi : Sig){X : Set}(C : X -> Set)(x : F fi X) -> Set
49
FIH (nil) C () -- empty
50
FIH (n :: ns) C (left t) = FIHa n C t
51
FIH (n :: ns) C (right y) = FIH ns C y
53
Fmapa : (n : Arity){X : Set}{C : X -> Set}(h : (x : X) -> C x)(u : Fa n X)
55
Fmapa (zero) h (unit) = unit
56
Fmapa (suc m) h (pair fst snd) = pair (h fst) (Fmapa m h snd)
58
Fmap : (fi : Sig){X : Set}{C : X -> Set}(h : (x : X) -> C x)(u : F fi X)
60
Fmap (nil) h () -- empty
61
Fmap (n :: ns) h (left x) = Fmapa n h x
62
Fmap (n :: ns) h (right y) = Fmap ns h y
65
data T (fi : Sig) : Set where
66
Intro : F fi (T fi) -> T fi
68
It : (fi : Sig){C : Set}(d : F fi C -> C) -> T fi -> C
69
It fi d (Intro i) = d (F1 fi (It fi d) i)
72
MIt : (fi : Sig){C : Set}(s : {X : Set} -> (X -> C) -> F fi X -> C)
74
MIt fi s (Intro i) = s (MIt fi s) i
78
(d : (y : F fi (T fi)) -> FIH fi C y -> C (Intro y))
80
R fi d (Intro i) = d i (Fmap fi (R fi d) i)
83
FIHs : (fi : Sig) -> (T fi -> Set) -> F fi (T fi) -> Set
87
out : (fi : Sig) -> T fi -> F fi (T fi)
88
out fi = R fi (\y p -> y)
90
----------------------------------------------------------------
92
FIHaT : (n : Arity)(X : Set)(C : X -> Set1)(x : Fa n X) -> Set1
93
FIHaT (zero) X C (unit) = TYPE.Unit
94
FIHaT (suc m) X C (pair fst snd) = TYPE.Pair (C fst) (FIHaT m X C snd)
97
FIHT : (fi : Sig)(X : Set)(C : X -> Set1)(x : F fi X) -> Set1
98
FIHT (nil) X C () -- empty
99
FIHT (n :: ns) X C (left t) = FIHaT n X C t
100
FIHT (n :: ns) X C (right y) = FIHT ns X C y
102
FIHsT : (fi : Sig)(C : T fi -> Set1)(x : F fi (T fi)) -> Set1
103
FIHsT fi C x = FIHT fi (T fi) C x
105
FmapaT : (n : Arity){X : Set}{C : X -> Set1}(h : (x : X) -> C x)(u : Fa n X)
107
FmapaT (zero) h (unit) = TYPE.unit
108
FmapaT (suc m) h (pair fst snd) = TYPE.pair (h fst) (FmapaT m h snd)
110
FmapT : (fi : Sig){X : Set}{C : X -> Set1}(h : (x : X) -> C x)(u : F fi X)
112
FmapT (nil) h () -- empty
113
FmapT (n :: ns) h (left x') = FmapaT n h x'
114
FmapT (n :: ns) h (right y) = FmapT ns h y
118
(d : (y : F fi (T fi)) -> FIHT fi (T fi) C y -> C (Intro y))
120
RT fi d (Intro i) = d i (FmapT fi (RT fi d) i)