@@ -2,18 +2,9 @@ module Data.Nat.Parity
3%access public export
3%access public export
5−--------------------------------------------------------------------------------
5+----------------------------------------
7−--------------------------------------------------------------------------------
9−mutual
7+-- Type-level, constructive definitions of parity.
18||| A nat is Even when it is twice some other nat.
9||| A nat is Even when it is twice some other nat.
19Even : Nat -> Type
10Even : Nat -> Type
@@ -23,6 +14,8 @@ Even n = (half : Nat ** n = half * 2)
23Odd : Nat -> Type
14Odd : Nat -> Type
24Odd n = (haf : Nat ** n = S $ haf * 2)
15Odd n = (haf : Nat ** n = S $ haf * 2)
17+----------------------------------------
26||| Two more than an Even is Even.
19||| Two more than an Even is Even.
27add2Even : Even n -> Even (2 + n)
20add2Even : Even n -> Even (2 + n)
28add2Even (half ** pf) = (S half ** cong {f = (+) 2} pf)
21add2Even (half ** pf) = (S half ** cong {f = (+) 2} pf)
@@ -52,20 +45,73 @@ succDoublePredPred {k = S _} prf = cong {f = Nat.pred} prf
52predEvenOdd : Even (S n) -> Odd n
45predEvenOdd : Even (S n) -> Odd n
53predEvenOdd (half ** pf) = (pred half ** succDoublePredPred pf)
46predEvenOdd (half ** pf) = (pred half ** succDoublePredPred pf)
48+----------------------------------------
50+-- Boolean definitions of parity.
61+----------------------------------------
63+-- The boolean and type-level definitions are equivalent in the sense
64+-- that a proof of one can be gotten from a proof of the other.
68+ evenEven : Even n -> even n = True
69+ evenEven {n = Z} _ = Refl
70+ evenEven {n = S _} pf = oddOdd $ predEvenOdd pf
73+ oddOdd : Odd n -> odd n = True
74+ oddOdd {n = Z} (_ ** pf) = absurd pf
75+ oddOdd {n = S _} pf = evenEven $ predOddEven pf
78+ ||| If it's even, it's Even.
79+ evenEvenConverse : even n = True -> Even n
80+ evenEvenConverse {n = Z} prf = (0 ** Refl)
81+ evenEvenConverse {n = S k} prf =
82+ let (haf ** pf) = oddOddConverse prf in
85+ ||| If it's odd, it's Odd
86+ oddOddConverse : odd n = True -> Odd n
87+ oddOddConverse {n = Z} prf = absurd prf
88+ oddOddConverse {n = S k} prf =
89+ let (half ** pf) = evenEvenConverse prf in
92+----------------------------------------
94+||| Every nat is either even or odd.
95+evenorodd : (n : Nat) -> Either (even n = True) (odd n = True)
96+evenorodd Z = Left Refl
97+evenorodd (S k) = case evenorodd k of
55||| Every nat is either Even or Odd.
101||| Every nat is either Even or Odd.
56evenOrOdd : (n : Nat) -> Either (Even n) (Odd n)
102evenOrOdd : (n : Nat) -> Either (Even n) (Odd n)
57−evenOrOdd Z = Left (0 ** Refl)
103+evenOrOdd n = case evenorodd n of
58−evenOrOdd (S k) = case evenOrOdd k of
104+ Left e => Left $ evenEvenConverse e
59− Left (half ** pf) => Right (half ** cong {f = S} pf)
105+ Right o => Right $ oddOddConverse o
60− Right (haf ** pf) => Left (S haf ** cong {f = S} pf)
106+
107+||| No nat is both even and odd.
108+notevenandodd : even n = True -> odd n = True -> Void
109+notevenandodd {n = Z} en on = absurd on
110+notevenandodd {n = S _} en on = notevenandodd on en
62||| No nat is both Even and Odd.
112||| No nat is both Even and Odd.
63notEvenAndOdd : Even n -> Odd n -> Void
113notEvenAndOdd : Even n -> Odd n -> Void
64−notEvenAndOdd {n = Z} _ (_ ** odd) = absurd odd
114+notEvenAndOdd en on = notevenandodd (evenEven en) (oddOdd on)
65−notEvenAndOdd {n = (S k)} (half ** even) (haf ** odd) =
66− notEvenAndOdd {n = k}
67− (haf ** cong {f = Nat.pred} odd)
68− (pred half ** succDoublePredPred even)
70||| Evenness is decidable.
116||| Evenness is decidable.
71evenDec : (n : Nat) -> Dec $ Even n
117evenDec : (n : Nat) -> Dec $ Even n
@@ -79,42 +125,46 @@ oddDec n = case evenOrOdd n of
79 Left even => No $ notEvenAndOdd even
125 Left even => No $ notEvenAndOdd even
80 Right odd => Yes odd
126 Right odd => Yes odd
82−mutual
128+----------------------------------------
84− evenEven : Even n -> even n = True
85− evenEven {n = Z} _ = Refl
86− evenEven {n = S _} pf = oddOdd $ predEvenOdd pf
88− ||| Odds are odd.
130+||| An Odd is the successor of an Even.
89− oddOdd : Odd n -> odd n = True
131+oddSuccEven : Odd n -> (m : Nat ** (n = S m, Even m))
90− oddOdd {n = Z} (_ ** pf) = absurd pf
132+oddSuccEven (haf ** pf) = (haf * 2 ** (pf, (haf ** Refl)))
91− oddOdd {n = S _} pf = evenEven $ predOddEven pf
93||| Even plus Even is Even.
134||| Even plus Even is Even.
94evenPlusEven : Even j -> Even k -> Even (j + k)
135evenPlusEven : Even j -> Even k -> Even (j + k)
95evenPlusEven (half_j ** pf_j) (half_k ** pf_k) =
136evenPlusEven (half_j ** pf_j) (half_k ** pf_k) =
98− (half_j + half_k **
137+ (half_j + half_k **
99 sym $ multDistributesOverPlusLeft half_j half_k 2)
140 sym $ multDistributesOverPlusLeft half_j half_k 2)
101−||| Odd plus Odd is Even.
142+||| Odd plus Even is Odd.
102−oddPlusOdd : Odd j -> Odd k -> Even (j + k)
143+oddPlusEven : Odd j -> Even k -> Odd (j + k)
103−oddPlusOdd (haf_j ** pf_j) (haf_k ** pf_k) =
144+oddPlusEven oj ek =
104− rewrite pf_j in
145+ let
105− rewrite pf_k in
146+ (i ** (ipj, ei)) = oddSuccEven oj
106− rewrite sym $ plusSuccRightSucc (haf_j * 2) (haf_k * 2) in
147+ (half_ik ** eik) = evenPlusEven ei ek
107− rewrite sym $ multDistributesOverPlusLeft haf_j haf_k 2 in
148+ in
108− (S (haf_j + haf_k) ** Refl)
149+ (half_ik **
110||| Even plus Odd is Odd.
153||| Even plus Odd is Odd.
111evenPlusOdd : Even j -> Odd k -> Odd (j + k)
154evenPlusOdd : Even j -> Odd k -> Odd (j + k)
112−evenPlusOdd (half_j ** pf_j) (haf_k ** pf_k) =
155+evenPlusOdd {j} {k} ej ok = rewrite plusCommutative j k in oddPlusEven ok ej
114− rewrite pf_k in
157+||| Odd plus Odd is Even.
115− rewrite sym $ plusSuccRightSucc (half_j * 2) (haf_k * 2) in
158+oddPlusOdd : Odd j -> Odd k -> Even (j + k)
116− rewrite sym $ multDistributesOverPlusLeft half_j haf_k 2 in
159+oddPlusOdd oj ok =
161+ (i ** (ipj, ei)) = oddSuccEven oj
162+ (haf_ik ** oik) = evenPlusOdd ei ok
117− (half_j + haf_k ** Refl)
167+ Refl)
119||| A helper fact.
169||| A helper fact.
120multShuffle : (a, b, c : Nat) ->
170multShuffle : (a, b, c : Nat) ->
@@ -129,35 +179,39 @@ multShuffle a b c =
129||| Even times Even is Even.
179||| Even times Even is Even.
130evenMultEven : Even j -> Even k -> Even (j * k)
180evenMultEven : Even j -> Even k -> Even (j * k)
131evenMultEven (half_j ** pf_j) (half_k ** pf_k) =
181evenMultEven (half_j ** pf_j) (half_k ** pf_k) =
134− (half_j * half_k * 2 **
182+ (half_j * half_k * 2 **
135 multShuffle half_j half_k 2)
185 multShuffle half_j half_k 2)
187+||| Odd times Even is Even.
188+oddMultEven : Odd j -> Even k -> Even (j * k)
189+oddMultEven oj (half_k ** pf_k) =
191+ (i ** (ipj, ei)) = oddSuccEven oj
192+ (half_ik ** oik) = evenMultEven ei (half_k ** pf_k)
194+ (half_k + half_ik **
195+ rewrite multDistributesOverPlusLeft half_k half_ik 2 in
137||| Even times Odd is Even.
201||| Even times Odd is Even.
138evenMultOdd : Even j -> Odd k -> Even (j * k)
202evenMultOdd : Even j -> Odd k -> Even (j * k)
139−evenMultOdd (half_j ** pf_j) (haf_k ** pf_k) =
203+evenMultOdd {j} {k} ej ok = rewrite multCommutative j k in oddMultEven ok ej
140− let half = half_j * haf_k * 2 in
143− rewrite multRightSuccPlus (half_j * 2) (haf_k * 2) in
144− rewrite multShuffle half_j haf_k 2 in
146− sym $ multDistributesOverPlusLeft half_j half 2)
148||| Odd times Odd is Odd.
205||| Odd times Odd is Odd.
149oddMultOdd : Odd j -> Odd k -> Odd (j * k)
206oddMultOdd : Odd j -> Odd k -> Odd (j * k)
150−oddMultOdd (haf_j ** pf_j) (haf_k ** pf_k) =
207+oddMultOdd oj (haf_k ** pf_k) =
152− haf = haf_j * haf_k * 2
209+ (i ** (ipj, ei)) = oddSuccEven oj
153− rem = haf_j + haf_k
210+ (half_ik ** eik) = evenMultOdd ei (haf_k ** pf_k)
155− rewrite pf_j in
212+ (haf_k + half_ik **
156− rewrite pf_k in
213+ rewrite multDistributesOverPlusLeft haf_k half_ik 2 in
157− rewrite multRightSuccPlus (haf_j * 2) (haf_k * 2) in
214+ rewrite ipj in
158− rewrite multShuffle haf_j haf_k 2 in
215+ rewrite eik in
159− rewrite plusAssociative (haf_k * 2) (haf_j * 2) (haf * 2) in
216+ rewrite pf_k in
160− rewrite sym $ multDistributesOverPlusLeft haf_k haf_j 2 in
161− rewrite plusCommutative haf_k haf_j in
162− rewrite sym $ multDistributesOverPlusLeft rem haf 2 in
163− (rem + haf ** Refl)
217+ Refl)