blob: c30ffc4fa69a36133dd7f14b79e134237185f575 (
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
------------------------------------------------------------
-- Core ITT (minus W)
data Empty : * => { }
absurd [A : *] [x : Empty] : A => (
Empty-Elim x (\_ => A)
)
neg [A : *] : * => (A -> Empty)
record Unit : * => tt { }
record Prod : [A : *] [B : A -> *] -> * =>
prod {fst : A, snd : B fst}
data Bool : * => { true : Bool | false : Bool }
-- The if_then_else_ is provided by Bool-Elim
-- A large eliminator, for convenience
ITE [b : Bool] [A B : *] : * => (
Bool-Elim b (\_ => *) A B
)
------------------------------------------------------------
-- Examples →
data Nat : * => { zero : Nat | suc : Nat -> Nat }
gt [n : Nat] : Nat -> * => (
Nat-Elim
n
(\_ => Nat -> *)
(\_ => Empty)
(\n f m => Nat-Elim m (\_ => *) Unit (\m' _ => f m'))
)
data List : [A : *] -> * =>
{ nil : List A | cons : A -> List A -> List A }
length [A : *] [xs : List A] : Nat => (
List-Elim xs (\_ => Nat) zero (\_ _ n => suc n)
)
head [A : *] [xs : List A] : gt (length A xs) zero -> A => (
List-Elim
xs
(\xs => gt (length A xs) zero -> A)
(\p => absurd A p)
(\x _ _ _ => x)
)
------------------------------------------------------------
-- Examples ×
data Parity : * => { even : Parity | odd : Parity }
flip [p : Parity] : Parity => (
Parity-Elim p (\_ => Parity) odd even
)
parity [n : Nat] : Parity => (
Nat-Elim n (\_ => Parity) even (\_ => flip)
)
even [n : Nat] : * => (Parity-Elim (parity n) (\_ => *) Unit Empty)
one : Nat => (suc zero)
two : Nat => (suc one)
three : Nat => (suc two)
four : Nat => (suc three)
five : Nat => (suc four)
six : Nat => (suc five)
even-6 : even six => tt
even-5-neg : neg (even five) => (\z => z)
there-is-an-even-number : Prod Nat even => (prod six even-6)
Or [A B : *] : * => (Prod Bool (\b => ITE b A B))
left [A B : *] [x : A] : Or A B => (prod true x)
right [A B : *] [x : B] : Or A B => (prod false x)
case [A B C : *] [f : A -> C] [g : B -> C] [x : Or A B] : C => (
(Bool-Elim (fst x) (\b => ITE b A B -> C) f g) (snd x)
)
|