forked from steinerkelvin/Kind2
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample.kind2
More file actions
65 lines (53 loc) · 1.06 KB
/
Copy pathexample.kind2
File metadata and controls
65 lines (53 loc) · 1.06 KB
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
// The Empty type
Empty : Type
// Unit
Unit : Type
U : Unit
// Booleans
Bool : Type
T : Bool
F : Bool
// Natural numbers
Nat : Type
Z : Nat
(S Nat) : Nat
// Propositional negation
(Not t:Type) : Type
(Not t) = ∀(x: t) Empty
// If-Then-Else
(If t:Type x:Bool a:t b:t) : t
(If t T a b) = a
(If t F a b) = b
// Negates a boolean
(Neg Bool) : Bool
(Neg T) = F
(Neg F) = T
// Doubles a number
(Double Nat) : Nat
(Double Z) = Z
(Double (S pred)) = (S (S (Double pred)))
// Halves a number
(Half Nat) : Nat
(Half Z) = Z
(Half (S Z)) = Z
(Half (S (S pred))) = (S (Half pred))
// Congruence of equality
(Cong t:Type a:t b:u f:∀(x:t)u e:{a == b}) : {(f a) == (f b)}
(Cong t a b f e) =
rewrite x with e in {(f x) == (f b)}
refl (f b)
// Black Friday Theorem
(BFT n:Nat) : {(Half (Double n)) == n}
(BFT Z) =
refl Z
(BFT (S p)) =
let e0 = (BFT p)
let e1 = (Cong _ _ _ λx(S x) e0)
e1
// True isn't False
TF : (Not {T == F})
TF = λe
rewrite x with e in (If Type x Empty Unit)
U
Main : Nat
Main = Z