2
let id = (\ a x -> x) : forall (a : *) . a -> a
3
let const = (\ a b x y -> x) : forall (a : *) (b : *) . a -> b -> a
7
( \ _ -> Nat -> Nat ) -- motive
8
( \ n -> n ) -- case for Zero
9
( \ p rec n -> Succ (rec n) ) -- case for Succ
18
( \ m mz ms -> natElim
21
( \ n' rec -> ms rec ) )
22
: forall (m : *) . m -> (m -> m) -> Nat -> m
25
( \ m m0 m1 ms -> natElim m m0
26
(\ p rec -> natElim (\ n -> m (Succ n)) m1 ms p) )
27
: forall (m : Nat -> *) . m 0 -> m 1 ->
28
(forall n : Nat . m (Succ n) -> m (Succ (Succ n))) ->
29
forall (n : Nat) . m n
32
( \ m m0 m1 m2 ms -> nat1Elim m m0 m1
33
(\ p rec -> natElim (\ n -> m (Succ (Succ n))) m2 ms p) )
34
: forall (m : Nat -> *) . m 0 -> m 1 -> m 2 ->
35
(forall n : Nat . m (Succ (Succ n)) -> m (Succ (Succ (Succ n)))) ->
36
forall (n : Nat) . m n
37
let inc = natFold Nat (Succ Zero) Succ
39
let finNat = finElim (\ _ _ -> Nat)
41
(\ _ _ rec -> Succ rec)
46
( \ m mu -> finElim ( nat1Elim (\ n -> Fin n -> *)
50
( natElim (\ n -> natElim (\ n -> Fin (Succ n) -> *)
56
( \ n f _ -> finElim (\ n f -> natElim (\ n -> Fin (Succ n) -> *)
64
: forall (m : Unit -> *) . m U -> forall (u : Unit) . m u
68
( \ m -> finElim (natElim (\ n -> Fin n -> *)
74
: forall (m : Void -> *) (v : Void) . m v
78
let True = FSucc 1 (FZero 0)
80
( \ m mf mt -> finElim ( nat2Elim (\ n -> Fin n -> *)
81
(\ _ -> Unit) (\ _ -> Unit)
84
( nat1Elim ( \ n -> nat1Elim (\ n -> Fin (Succ n) -> *)
90
( \ n f _ -> finElim ( \ n f -> nat1Elim (\ n -> Fin (Succ n) -> *)
97
(\ n -> Fin (Succ (Succ n)) -> *)
100
n (FSucc (Succ n) (FZero n)) )
104
(\ n -> Fin (Succ (Succ n)) -> *)
107
n (FSucc (Succ n) (FSucc n f)))
113
: forall (m : Bool -> *) . m False -> m True -> forall (b : Bool) . m b
115
let not = boolElim (\ _ -> Bool) True False
116
let and = boolElim (\ _ -> Bool -> Bool) (\ _ -> False) (id Bool)
117
let or = boolElim (\ _ -> Bool -> Bool) (id Bool) (\ _ -> True)
118
let iff = boolElim (\ _ -> Bool -> Bool) not (id Bool)
119
let xor = boolElim (\ _ -> Bool -> Bool) (id Bool) not
121
let even = natFold Bool True not
122
let odd = natFold Bool False not
123
let isZero = natFold Bool True (\ _ -> False)
124
let isSucc = natFold Bool False (\ _ -> True)
128
( \ _ -> Nat -> Bool )
132
( \ n' _ -> False ) )
133
( \ m' rec_m' -> natElim
136
( \ n' _ -> rec_m' n' ))
138
let Prop = boolElim (\ _ -> *) Void Unit
142
(\ n -> Prop (natEq n n))
145
: forall (n : Nat) . Prop (natEq n n)
147
let Not = (\ a -> a -> Void) : * -> *
150
( \ a b f -> eqElim a
151
(\ x y eq_x_y -> Eq b (f x) (f y))
152
(\ x -> Refl b (f x)) )
153
: forall (a : *) (b : *) (f : a -> b) (x : a) (y : a) .
154
Eq a x y -> Eq b (f x) (f y)
158
(\ x y eq_x_y -> Eq a y x)
160
: forall (a : *) (x : a) (y : a) .
164
( \ a x y z eq_x_y -> eqElim a
165
(\ x y eq_x_y -> forall (z : a) . Eq a y z -> Eq a x z)
166
(\ x z eq_x_z -> eq_x_z)
168
: forall (a : *) (x : a) (y : a) (z : a) .
169
Eq a x y -> Eq a y z -> Eq a x z
172
eqElim * (\ a b _ -> a -> b) (\ _ x -> x)
173
: forall (a : *) (b : *) (p : Eq * a b) . a -> b
176
(\ p -> apply Unit Void
178
(natElim (\ _ -> *) Void (\ _ _ -> Unit))
184
(\ p -> p1IsNot0 (symm Nat 0 1 p))
189
( \ n -> Not (Eq Nat 0 (Succ n)) )
191
( \ n' rec_n' eq_0_SSn' ->
192
rec_n' (leibniz Nat Nat pred Zero (Succ (Succ n')) eq_0_SSn') )
196
( \ n -> forall (a : *) . a -> Vec a n )
198
( \ n' rec_n' a x -> Cons a n' x (rec_n' a x) ) )
199
: forall (n : Nat) . forall (a : *) . a -> Vec a n
202
(\ a n x -> natElim (Vec a)
204
(\ n' rec_n' -> Cons a n' x rec_n') n)
205
: forall (a : *) (n : Nat) . a -> Vec a n
211
( \ n' rec_n' -> Cons Nat n' n' rec_n' )
215
(\ m _ -> forall (n : Nat) . Vec a n -> Vec a (plus m n))
217
(\ m v vs rec n w -> Cons a (plus m n) v (rec n w)))
218
: forall (a : *) (m : Nat) (v : Vec a m) (n : Nat) (w : Vec a n).
222
(\ a -> vecElim a ( \ m v -> forall (n : Nat) . Eq Nat m (Succ n) -> Vec a n )
223
( \ n eq_0_SuccN -> voidElim ( \ _ -> Vec a n )
224
( p0IsNoSucc n eq_0_SuccN ) )
225
( \ m' v vs rec_m' n eq_SuccM'_SuccN ->
227
(\ m' n e -> Vec a m' -> Vec a n)
230
(leibniz Nat Nat pred (Succ m') (Succ n) eq_SuccM'_SuccN) vs))
231
: forall (a : *) (m : Nat) . Vec a m -> forall (n : Nat) . Eq Nat m (Succ n) -> Vec a n
234
(\ a n v -> tail' a (Succ n) v n (Refl Nat (Succ n)))
235
: forall (a : *) (n : Nat) . Vec a (Succ n) -> Vec a n
238
(\ a -> vecElim a ( \ n v -> Fin n -> a )
239
( \ f -> voidElim (\ _ -> a) f )
240
( \ n' v vs rec_n' f_SuccN' ->
241
finElim ( \ n _ -> Eq Nat n (Succ n') -> a )
243
( \ n f_N _ eq_SuccN_SuccN' ->
245
(\ x y e -> Fin x -> Fin y)
248
(leibniz Nat Nat pred
249
(Succ n) (Succ n') eq_SuccN_SuccN')
253
(Refl Nat (Succ n'))))
254
: forall (a : *) (n : Nat) . Vec a n -> Fin n -> a
257
(\ a n v -> at a (Succ n) v (FZero n))
258
: forall (a : *) (n : Nat) . Vec a (Succ n) -> a
261
(\ a b f -> vecElim a ( \ n _ -> Vec b n )
263
( \ n x _ rec -> Cons b n (f x) rec ))
264
: forall (a : *) (b : *) (f : a -> b) (n : Nat) . Vec a n -> Vec b n
268
: forall n : Nat . Eq Nat (plus 0 n) n
271
natElim ( \ n -> Eq Nat (plus n 0) n )
273
( \ n' rec -> leibniz Nat Nat Succ (plus n' 0) n' rec )
274
: forall n : Nat . Eq Nat (plus n 0) n