-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathparity.idr
80 lines (62 loc) · 1.59 KB
/
parity.idr
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
-- 0
data Parity' = Even' | Odd'
parity' : (n : Nat) -> Parity'
parity' Z = Even'
parity' (S Z) = Odd'
parity' (S (S k)) = parity' k
-- 1
data Parity : Nat -> Type where
Even : Parity (n + n)
Odd : Parity (S (n + n))
parity : (n : Nat) -> Parity n
parity Z = Even {n = Z}
parity (S Z) = Odd {n = Z}
parity (S (S k)) =
case parity k of
Even {n} =>
rewrite plusSuccRightSucc n n
in Even {n = S n}
Odd {n} =>
rewrite plusSuccRightSucc n n
in Odd {n = S n}
-- 2
data Digit = I | O
natToBinH : Nat -> List Digit
natToBinH Z = []
natToBinH (S k) =
case parity k of
Even {n} => I :: natToBinH n
Odd {n} => O :: natToBinH (S n)
natToBin : Nat -> List Digit
natToBin Z = [O]
natToBin k = reverse (natToBinH k)
-- 3
data Binary : Nat -> Type where
BEnd : Binary Z
BO : Binary n -> Binary (n + n)
BI : Binary n -> Binary (S (n + n))
natToBinV : (n:Nat) -> Binary n
natToBinV Z = BEnd
natToBinV k =
case parity k of
Even{n} => BO (natToBinV n)
Odd {n} => BI (natToBinV n)
natToBinV2 : (n:Nat) -> Binary n
natToBinV2 Z = BEnd
natToBinV2 k with (parity k)
natToBinV2 (n + n) | Even = BO (natToBinV n)
natToBinV2 (S (n + n)) | Odd = BI (natToBinV n)
-- 4
Show (Binary n) where
show BEnd = "0"
show b = showRec b ""
where
showRec : Binary n -> String -> String
showRec BEnd s = s
showRec (BO x) s = showRec x (strCons '0' s)
showRec (BI x) s = showRec x (strCons '1' s)
main : IO ()
main = do
putStr "Enter a number: "
x <- getLine
print (natToBinV (cast x))