@@ -92,9 +92,9 @@ pred (S n) = n
92--------------------------------------------------------------------------------
92--------------------------------------------------------------------------------
94fib : Nat -> Nat
94fib : Nat -> Nat
96−fib (S O) = S O
96+fib (S O) = 1
97−fib (S (S n)) = plus (fib (S n)) (fib n)
97+fib (S (S n)) = fib (S n) + fib n
99--------------------------------------------------------------------------------
99--------------------------------------------------------------------------------
100-- GCD and LCM
100-- GCD and LCM
@@ -159,103 +159,124 @@ succInjective : (left : Nat) -> (right : Nat) -> (p : S left = S right) ->
159succInjective left right refl = refl
159succInjective left right refl = refl
162−plusZeroLeftNeutral : (right : Nat) -> plus O right = right
162+plusZeroLeftNeutral : (right : Nat) -> 0 + right = right
163plusZeroLeftNeutral right = refl
163plusZeroLeftNeutral right = refl
165−plusZeroRightNeutral : (left : Nat) -> plus left O = left
165+plusZeroRightNeutral : (left : Nat) -> left + 0 = left
166plusZeroRightNeutral O = refl
166plusZeroRightNeutral O = refl
167plusZeroRightNeutral (S n) =
167plusZeroRightNeutral (S n) =
168 let inductiveHypothesis = plusZeroRightNeutral n in
168 let inductiveHypothesis = plusZeroRightNeutral n in
169 ?plusZeroRightNeutralStepCase
169 ?plusZeroRightNeutralStepCase
171plusSuccRightSucc : (left : Nat) -> (right : Nat) ->
171plusSuccRightSucc : (left : Nat) -> (right : Nat) ->
172− S (plus left right) = plus left (S right)
172+ S (left + right) = left + (S right)
173plusSuccRightSucc O right = refl
173plusSuccRightSucc O right = refl
174plusSuccRightSucc (S left) right =
174plusSuccRightSucc (S left) right =
175 let inductiveHypothesis = plusSuccRightSucc left right in
175 let inductiveHypothesis = plusSuccRightSucc left right in
176 ?plusSuccRightSuccStepCase
176 ?plusSuccRightSuccStepCase
178plusCommutative : (left : Nat) -> (right : Nat) ->
178plusCommutative : (left : Nat) -> (right : Nat) ->
179− plus left right = plus right left
179+ left + right = right + left
180plusCommutative O right = ?plusCommutativeBaseCase
180plusCommutative O right = ?plusCommutativeBaseCase
181plusCommutative (S left) right =
181plusCommutative (S left) right =
182 let inductiveHypothesis = plusCommutative left right in
182 let inductiveHypothesis = plusCommutative left right in
183 ?plusCommutativeStepCase
183 ?plusCommutativeStepCase
185plusAssociative : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
185plusAssociative : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
186− plus left (plus centre right) = plus (plus left centre) right
186+ left + (centre + right) = (left + centre) + right
187plusAssociative O centre right = refl
187plusAssociative O centre right = refl
188plusAssociative (S left) centre right =
188plusAssociative (S left) centre right =
189 let inductiveHypothesis = plusAssociative left centre right in
189 let inductiveHypothesis = plusAssociative left centre right in
190 ?plusAssociativeStepCase
190 ?plusAssociativeStepCase
192plusMonotonicRight : (left : Nat) -> (right : Nat) -> (c : Nat) ->
192plusMonotonicRight : (left : Nat) -> (right : Nat) -> (c : Nat) ->
193− (p : left = right) -> plus left c = plus right c
193+ (p : left = right) -> left + c = right + c
194plusMonotonicRight left right c refl = refl
194plusMonotonicRight left right c refl = refl
196plusMonotonicLeft : (left : Nat) -> (right : Nat) -> (c : Nat) ->
196plusMonotonicLeft : (left : Nat) -> (right : Nat) -> (c : Nat) ->
197− (p : left = right) -> plus c left = plus c right
197+ (p : left = right) -> c + left = c + right
198plusMonotonicLeft left right c refl = refl
198plusMonotonicLeft left right c refl = refl
200−plusOneSucc : (right : Nat) -> plus (S O) right = S right
200+plusOneSucc : (right : Nat) -> 1 + right = S right
201plusOneSucc n = refl
201plusOneSucc n = refl
203+plusLeftCancel : (left : Nat) -> (right : Nat) -> (right' : Nat) ->
204+ (p : left + right = left + right') -> right = right'
205+plusLeftCancel O right right' p = ?plusLeftCancelBaseCase
206+plusLeftCancel (S left) right right' p =
207+ let inductiveHypothesis = plusLeftCancel left right right' in
208+ ?plusLeftCancelStepCase
210+plusRightCancel : (left : Nat) -> (left' : Nat) -> (right : Nat) ->
211+ (p : left + right = left' + right) -> left = left'
212+plusRightCancel left left' O p = ?plusRightCancelBaseCase
213+plusRightCancel left left' (S right) p =
214+ let inductiveHypothesis = plusRightCancel left left' right in
215+ ?plusRightCancelStepCase
217+plusLeftLeftRightZero : (left : Nat) -> (right : Nat) ->
218+ (p : left + right = left) -> right = O
219+plusLeftLeftRightZero O right p = ?plusLeftLeftRightZeroBaseCase
220+plusLeftLeftRightZero (S left) right p =
221+ let inductiveHypothesis = plusLeftLeftRightZero left right in
222+ ?plusLeftLeftRightZeroStepCase
204−multZeroLeftZero : (right : Nat) -> mult O right = O
225+multZeroLeftZero : (right : Nat) -> O * right = O
205multZeroLeftZero right = refl
226multZeroLeftZero right = refl
207−multZeroRightZero : (left : Nat) -> mult left O = O
228+multZeroRightZero : (left : Nat) -> left * O = O
208multZeroRightZero O = refl
229multZeroRightZero O = refl
209multZeroRightZero (S left) =
230multZeroRightZero (S left) =
210 let inductiveHypothesis = multZeroRightZero left in
231 let inductiveHypothesis = multZeroRightZero left in
211 ?multZeroRightZeroStepCase
232 ?multZeroRightZeroStepCase
213multRightSuccPlus : (left : Nat) -> (right : Nat) ->
234multRightSuccPlus : (left : Nat) -> (right : Nat) ->
214− mult left (S right) = plus left (mult left right)
235+ left * (S right) = left + (left * right)
215multRightSuccPlus O right = refl
236multRightSuccPlus O right = refl
216multRightSuccPlus (S left) right =
237multRightSuccPlus (S left) right =
217 let inductiveHypothesis = multRightSuccPlus left right in
238 let inductiveHypothesis = multRightSuccPlus left right in
218 ?multRightSuccPlusStepCase
239 ?multRightSuccPlusStepCase
220multLeftSuccPlus : (left : Nat) -> (right : Nat) ->
241multLeftSuccPlus : (left : Nat) -> (right : Nat) ->
221− mult (S left) right = plus right (mult left right)
242+ (S left) * right = right + (left * right)
222multLeftSuccPlus left right = refl
243multLeftSuccPlus left right = refl
224multCommutative : (left : Nat) -> (right : Nat) ->
245multCommutative : (left : Nat) -> (right : Nat) ->
225− mult left right = mult right left
246+ left * right = right * left
226multCommutative O right = ?multCommutativeBaseCase
247multCommutative O right = ?multCommutativeBaseCase
227multCommutative (S left) right =
248multCommutative (S left) right =
228 let inductiveHypothesis = multCommutative left right in
249 let inductiveHypothesis = multCommutative left right in
229 ?multCommutativeStepCase
250 ?multCommutativeStepCase
231multDistributesOverPlusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
252multDistributesOverPlusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
232− mult left (plus centre right) = plus (mult left centre) (mult left right)
253+ left * (centre + right) = (left * centre) + (left * right)
233multDistributesOverPlusRight O centre right = refl
254multDistributesOverPlusRight O centre right = refl
234multDistributesOverPlusRight (S left) centre right =
255multDistributesOverPlusRight (S left) centre right =
235 let inductiveHypothesis = multDistributesOverPlusRight left centre right in
256 let inductiveHypothesis = multDistributesOverPlusRight left centre right in
236 ?multDistributesOverPlusRightStepCase
257 ?multDistributesOverPlusRightStepCase
238multDistributesOverPlusLeft : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
259multDistributesOverPlusLeft : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
239− mult (plus left centre) right = plus (mult left right) (mult centre right)
260+ (left + centre) * right = (left * right) + (centre * right)
240multDistributesOverPlusLeft O centre right = refl
261multDistributesOverPlusLeft O centre right = refl
241multDistributesOverPlusLeft (S left) centre right =
262multDistributesOverPlusLeft (S left) centre right =
242 let inductiveHypothesis = multDistributesOverPlusLeft left centre right in
263 let inductiveHypothesis = multDistributesOverPlusLeft left centre right in
243 ?multDistributesOverPlusLeftStepCase
264 ?multDistributesOverPlusLeftStepCase
245multAssociative : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
266multAssociative : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
246− mult left (mult centre right) = mult (mult left centre) right
267+ left * (centre * right) = (left * centre) * right
247multAssociative O centre right = refl
268multAssociative O centre right = refl
248multAssociative (S left) centre right =
269multAssociative (S left) centre right =
249 let inductiveHypothesis = multAssociative left centre right in
270 let inductiveHypothesis = multAssociative left centre right in
250 ?multAssociativeStepCase
271 ?multAssociativeStepCase
252−multOneLeftNeutral : (right : Nat) -> mult (S O) right = right
273+multOneLeftNeutral : (right : Nat) -> 1 * right = right
253multOneLeftNeutral O = refl
274multOneLeftNeutral O = refl
254multOneLeftNeutral (S right) =
275multOneLeftNeutral (S right) =
255 let inductiveHypothesis = multOneLeftNeutral right in
276 let inductiveHypothesis = multOneLeftNeutral right in
256 ?multOneLeftNeutralStepCase
277 ?multOneLeftNeutralStepCase
258−multOneRightNeutral : (left : Nat) -> mult left (S O) = left
279+multOneRightNeutral : (left : Nat) -> left * 1 = left
259multOneRightNeutral O = refl
280multOneRightNeutral O = refl
260multOneRightNeutral (S left) =
281multOneRightNeutral (S left) =
261 let inductiveHypothesis = multOneRightNeutral left in
282 let inductiveHypothesis = multOneRightNeutral left in
@@ -263,59 +284,68 @@ multOneRightNeutral (S left) =
265minusSuccSucc : (left : Nat) -> (right : Nat) ->
286minusSuccSucc : (left : Nat) -> (right : Nat) ->
266− minus (S left) (S right) = minus left right
287+ (S left) - (S right) = left - right
267minusSuccSucc left right = refl
288minusSuccSucc left right = refl
269−minusZeroLeft : (right : Nat) -> minus O right = O
290+minusZeroLeft : (right : Nat) -> 0 - right = O
270minusZeroLeft right = refl
291minusZeroLeft right = refl
272−minusZeroRight : (left : Nat) -> minus left O = left
293+minusZeroRight : (left : Nat) -> left - 0 = left
273minusZeroRight O = refl
294minusZeroRight O = refl
274minusZeroRight (S left) = refl
295minusZeroRight (S left) = refl
276−minusZeroN : (n : Nat) -> O = minus n n
297+minusZeroN : (n : Nat) -> O = n - n
277minusZeroN O = refl
298minusZeroN O = refl
278minusZeroN (S n) = minusZeroN n
299minusZeroN (S n) = minusZeroN n
280−minusOneSuccN : (n : Nat) -> S O = minus (S n) n
301+minusOneSuccN : (n : Nat) -> S O = (S n) - n
281minusOneSuccN O = refl
302minusOneSuccN O = refl
282minusOneSuccN (S n) = minusOneSuccN n
303minusOneSuccN (S n) = minusOneSuccN n
305+minusMinusMinusPlus : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
306+ left - centre - right = left - (centre + right)
307+minusMinusMinusPlus O O right = refl
308+minusMinusMinusPlus (S left) O right = refl
309+minusMinusMinusPlus O (S centre) right = refl
310+minusMinusMinusPlus (S left) (S centre) right =
311+ let inductiveHypothesis = minusMinusMinusPlus left centre right in
312+ ?minusMinusMinusPlusStepCase
285powerSuccPowerLeft : (base : Nat) -> (exp : Nat) -> power base (S exp) =
315powerSuccPowerLeft : (base : Nat) -> (exp : Nat) -> power base (S exp) =
286− mult base (power base exp)
316+ base * (power base exp)
287powerSuccPowerLeft base exp = refl
317powerSuccPowerLeft base exp = refl
289multPowerPowerPlus : (base : Nat) -> (exp : Nat) -> (exp' : Nat) ->
319multPowerPowerPlus : (base : Nat) -> (exp : Nat) -> (exp' : Nat) ->
290− mult (power base exp) (power base exp') = power base (plus exp exp')
320+ (power base exp) * (power base exp') = power base (exp + exp')
291multPowerPowerPlus base O exp' = ?multPowerPowerPlusBaseCase
321multPowerPowerPlus base O exp' = ?multPowerPowerPlusBaseCase
292multPowerPowerPlus base (S exp) exp' =
322multPowerPowerPlus base (S exp) exp' =
293 let inductiveHypothesis = multPowerPowerPlus base exp exp' in
323 let inductiveHypothesis = multPowerPowerPlus base exp exp' in
294 ?multPowerPowerPlusStepCase
324 ?multPowerPowerPlusStepCase
296−powerZeroOne : (base : Nat) -> power base O = S O
326+powerZeroOne : (base : Nat) -> power base 0 = S O
297powerZeroOne base = refl
327powerZeroOne base = refl
299−powerOneNeutral : (base : Nat) -> power base (S O) = base
329+powerOneNeutral : (base : Nat) -> power base 1 = base
300powerOneNeutral O = refl
330powerOneNeutral O = refl
301powerOneNeutral (S base) =
331powerOneNeutral (S base) =
302 let inductiveHypothesis = powerOneNeutral base in
332 let inductiveHypothesis = powerOneNeutral base in
303 ?powerOneNeutralStepCase
333 ?powerOneNeutralStepCase
305−powerOneSuccOne : (exp : Nat) -> power (S O) exp = S O
335+powerOneSuccOne : (exp : Nat) -> power 1 exp = S O
306powerOneSuccOne O = refl
336powerOneSuccOne O = refl
307powerOneSuccOne (S exp) =
337powerOneSuccOne (S exp) =
308 let inductiveHypothesis = powerOneSuccOne exp in
338 let inductiveHypothesis = powerOneSuccOne exp in
309 ?powerOneSuccOneStepCase
339 ?powerOneSuccOneStepCase
311−powerSuccSuccMult : (base : Nat) -> power base (S (S O)) = mult base base
341+powerSuccSuccMult : (base : Nat) -> power base 2 = mult base base
312powerSuccSuccMult O = refl
342powerSuccSuccMult O = refl
313powerSuccSuccMult (S base) =
343powerSuccSuccMult (S base) =
314 let inductiveHypothesis = powerSuccSuccMult base in
344 let inductiveHypothesis = powerSuccSuccMult base in
315 ?powerSuccSuccMultStepCase
345 ?powerSuccSuccMultStepCase
317powerPowerMultPower : (base : Nat) -> (exp : Nat) -> (exp' : Nat) ->
347powerPowerMultPower : (base : Nat) -> (exp : Nat) -> (exp' : Nat) ->
318− power (power base exp) exp' = power base (mult exp exp')
348+ power (power base exp) exp' = power base (exp * exp')
319powerPowerMultPower base exp O = ?powerPowerMultPowerBaseCase
349powerPowerMultPower base exp O = ?powerPowerMultPowerBaseCase
320powerPowerMultPower base exp (S exp') =
350powerPowerMultPower base exp (S exp') =
321 let inductiveHypothesis = powerPowerMultPower base exp exp' in
351 let inductiveHypothesis = powerPowerMultPower base exp exp' in
@@ -326,7 +356,7 @@ predSucc : (n : Nat) -> pred (S n) = n
326predSucc n = refl
356predSucc n = refl
328minusSuccPred : (left : Nat) -> (right : Nat) ->
358minusSuccPred : (left : Nat) -> (right : Nat) ->
329− minus left (S right) = pred (minus left right)
359+ left - (S right) = pred (left - right)
330minusSuccPred O right = refl
360minusSuccPred O right = refl
331minusSuccPred (S left) O =
361minusSuccPred (S left) O =
332 let inductiveHypothesis = minusSuccPred left O in
362 let inductiveHypothesis = minusSuccPred left O in
@@ -495,3 +525,54 @@ plusZeroRightNeutralStepCase = proof {
528+minusMinusMinusPlusStepCase = proof {
530+ rewrite inductiveHypothesis;
534+plusLeftLeftRightZeroBaseCase = proof {
540+plusLeftLeftRightZeroStepCase = proof {
542+ refine inductiveHypothesis;
543+ let p' = succInjective (plus left right) left p;
548+plusRightCancelStepCase = proof {
550+ refine inductiveHypothesis;
551+ refine succInjective;
552+ rewrite sym (plusSuccRightSucc left right);
553+ rewrite sym (plusSuccRightSucc left' right);
558+plusRightCancelBaseCase = proof {
560+ rewrite (plusZeroRightNeutral left);
561+ rewrite (plusZeroRightNeutral left');
566+plusLeftCancelStepCase = proof {
568+ let injectiveProof = succInjective (plus left right) (plus left right') p;
569+ rewrite (inductiveHypothesis injectiveProof);
573+plusLeftCancelBaseCase = proof {