ProjectEuler 2, nearly (#125)

This commit is contained in:
Patrick Stevens
2020-04-19 13:40:22 +01:00
committed by GitHub
parent e660eceb43
commit 485b27e009
11 changed files with 751 additions and 488 deletions

View File

@@ -12,4 +12,6 @@ open import Fields.CauchyCompletion.Archimedean
open import Sets.Cardinality.Infinite.Examples open import Sets.Cardinality.Infinite.Examples
open import ProjectEuler.Problem2
module Everything.Guardedness where module Everything.Guardedness where

View File

@@ -77,3 +77,9 @@ containsDecidable decide (x :: l) needle | inr x!=n | inr notIn = inr t
t : ((x needle) || contains l needle) False t : ((x needle) || contains l needle) False
t (inl x) = x!=n x t (inl x) = x!=n x
t (inr x) = notIn x t (inr x) = notIn x
filter' : {a b : _} {A : Set a} {pred : A Set b} (dec : (a : A) pred a || (pred a False)) List A List A
filter' dec [] = []
filter' dec (x :: l) with dec x
... | inl _ = x :: filter' dec l
... | inr _ = filter' dec l

View File

@@ -60,6 +60,9 @@ liftEquality f .f x .x refl refl = refl
applyEquality : {a : _} {b : _} {A : Set a} {B : Set b} (f : A B) {x y : A} (x y) ((f x) (f y)) applyEquality : {a : _} {b : _} {A : Set a} {B : Set b} (f : A B) {x y : A} (x y) ((f x) (f y))
applyEquality {A} {B} f {x} {.x} refl = refl applyEquality {A} {B} f {x} {.x} refl = refl
applyEquality2 : {a b c : _} {A : Set a} {B : Set b} {C : Set c} (f : A B C) {x y : A} (x y) {m n : B} (m n) f x m f y n
applyEquality2 f x=y m=n rewrite x=y | m=n = refl
identityOfIndiscernablesLeft : {m n o : _} {A : Set m} {B : Set n} {a : A} {b : B} {c : A} (prop : A B Set o) (prop a b) (a c) (prop c b) identityOfIndiscernablesLeft : {m n o : _} {A : Set m} {B : Set n} {a : A} {b : B} {c : A} (prop : A B Set o) (prop a b) (a c) (prop c b)
identityOfIndiscernablesLeft {a = a} {b} {.a} prop pAB refl = pAB identityOfIndiscernablesLeft {a = a} {b} {.a} prop pAB refl = pAB

View File

@@ -32,28 +32,29 @@ _+B_ : BinNat → BinNat → BinNat
+BCommutative (one :: as) (zero :: bs) rewrite +BCommutative as bs = refl +BCommutative (one :: as) (zero :: bs) rewrite +BCommutative as bs = refl
+BCommutative (one :: as) (one :: bs) rewrite +BCommutative as bs = refl +BCommutative (one :: as) (one :: bs) rewrite +BCommutative as bs = refl
+BIsInherited[] : (b : BinNat) (prB : b canonical b) [] +Binherit b [] +B b private
+BIsInherited[] [] prB = refl +BIsInherited[] : (b : BinNat) (prB : b canonical b) [] +Binherit b [] +B b
+BIsInherited[] (zero :: b) prB = t +BIsInherited[] [] prB = refl
where +BIsInherited[] (zero :: b) prB = t
refine : (b : BinNat) zero :: b canonical (zero :: b) b canonical b where
refine b pr with canonical b refine : (b : BinNat) zero :: b canonical (zero :: b) b canonical b
refine b pr | x :: bl = ::Inj pr refine b pr with canonical b
t : NToBinNat (0 +N binNatToN (zero :: b)) zero :: b refine b pr | x :: bl = ::Inj pr
t with TotalOrder.totality TotalOrder 0 (binNatToN b) t : NToBinNat (0 +N binNatToN (zero :: b)) zero :: b
t | inl (inl pos) = transitivity (doubleIsBitShift (binNatToN b) pos) (applyEquality (zero ::_) (transitivity (binToBin b) (equalityCommutative (refine b prB)))) t with TotalOrder.totality TotalOrder 0 (binNatToN b)
t | inl (inr ()) t | inl (inl pos) = transitivity (doubleIsBitShift (binNatToN b) pos) (applyEquality (zero ::_) (transitivity (binToBin b) (equalityCommutative (refine b prB))))
... | inr eq with binNatToNZero b (equalityCommutative eq) t | inl (inr ())
... | u with canonical b ... | inr eq with binNatToNZero b (equalityCommutative eq)
t | inr eq | u | [] = exFalso (bad b prB) ... | u with canonical b
where t | inr eq | u | [] = exFalso (bad b prB)
bad : (c : BinNat) zero :: c [] False where
bad c () bad : (c : BinNat) zero :: c [] False
t | inr eq | () | x :: bl bad c ()
+BIsInherited[] (one :: b) prB = ans t | inr eq | () | x :: bl
where +BIsInherited[] (one :: b) prB = ans
ans : NToBinNat (binNatToN (one :: b)) one :: b where
ans = transitivity (binToBin (one :: b)) (equalityCommutative prB) ans : NToBinNat (binNatToN (one :: b)) one :: b
ans = transitivity (binToBin (one :: b)) (equalityCommutative prB)
-- Show that the monoid structure of is the same as that of BinNat -- Show that the monoid structure of is the same as that of BinNat
@@ -198,3 +199,9 @@ _+B_ : BinNat → BinNat → BinNat
where where
ans2 : zero :: incr (as +Binherit bs) canonical (zero :: incr (as +B bs)) ans2 : zero :: incr (as +Binherit bs) canonical (zero :: incr (as +B bs))
ans2 rewrite +BIsInherited' as bs | equalityCommutative (incrPreservesCanonical' (as +B bs)) | canonicalAscends' {zero} (incr (as +B bs)) (incrNonzero (as +B bs)) = refl ans2 rewrite +BIsInherited' as bs | equalityCommutative (incrPreservesCanonical' (as +B bs)) | canonicalAscends' {zero} (incr (as +B bs)) (incrNonzero (as +B bs)) = refl
+BIsHom : (a b : BinNat) binNatToN (a +B b) (binNatToN a) +N (binNatToN b)
+BIsHom a b = transitivity (equalityCommutative (binNatToNIsCanonical (a +B b))) (transitivity (equalityCommutative (applyEquality binNatToN (+BIsInherited' a b))) (nToN _))
sumCanonical : (a b : BinNat) canonical a a canonical b b canonical (a +B b) a +B b
sumCanonical a b a=a b=b = transitivity (equalityCommutative (+BIsInherited' a b)) (+BIsInherited a b (equalityCommutative a=a) (equalityCommutative b=b))

View File

@@ -6,6 +6,7 @@ open import Numbers.Naturals.Order
open import Numbers.Naturals.Order.Lemmas open import Numbers.Naturals.Order.Lemmas
open import Numbers.Naturals.Semiring open import Numbers.Naturals.Semiring
open import Numbers.BinaryNaturals.Definition open import Numbers.BinaryNaturals.Definition
open import Orders.Partial.Definition
open import Orders.Total.Definition open import Orders.Total.Definition
open import Semirings.Definition open import Semirings.Definition
@@ -33,38 +34,38 @@ a <BInherited b with TotalOrder.totality TotalOrder (binNatToN a) (binNatToN
(a <BInherited b) | inr x = Equal (a <BInherited b) | inr x = Equal
private private
go<B : Compare BinNat BinNat Compare go<Bcomp : Compare BinNat BinNat Compare
go<B Equal [] [] = Equal go<Bcomp Equal [] [] = Equal
go<B Equal [] (zero :: b) = go<B Equal [] b go<Bcomp Equal [] (zero :: b) = go<Bcomp Equal [] b
go<B Equal [] (one :: b) = FirstLess go<Bcomp Equal [] (one :: b) = FirstLess
go<B Equal (zero :: a) [] = go<B Equal a [] go<Bcomp Equal (zero :: a) [] = go<Bcomp Equal a []
go<B Equal (zero :: a) (zero :: b) = go<B Equal a b go<Bcomp Equal (zero :: a) (zero :: b) = go<Bcomp Equal a b
go<B Equal (zero :: a) (one :: b) = go<B FirstLess a b go<Bcomp Equal (zero :: a) (one :: b) = go<Bcomp FirstLess a b
go<B Equal (one :: a) [] = FirstGreater go<Bcomp Equal (one :: a) [] = FirstGreater
go<B Equal (one :: a) (zero :: b) = go<B FirstGreater a b go<Bcomp Equal (one :: a) (zero :: b) = go<Bcomp FirstGreater a b
go<B Equal (one :: a) (one :: b) = go<B Equal a b go<Bcomp Equal (one :: a) (one :: b) = go<Bcomp Equal a b
go<B FirstGreater [] [] = FirstGreater go<Bcomp FirstGreater [] [] = FirstGreater
go<B FirstGreater [] (zero :: b) = go<B FirstGreater [] b go<Bcomp FirstGreater [] (zero :: b) = go<Bcomp FirstGreater [] b
go<B FirstGreater [] (one :: b) = FirstLess go<Bcomp FirstGreater [] (one :: b) = FirstLess
go<B FirstGreater (zero :: a) [] = FirstGreater go<Bcomp FirstGreater (zero :: a) [] = FirstGreater
go<B FirstGreater (zero :: a) (zero :: b) = go<B FirstGreater a b go<Bcomp FirstGreater (zero :: a) (zero :: b) = go<Bcomp FirstGreater a b
go<B FirstGreater (zero :: a) (one :: b) = go<B FirstLess a b go<Bcomp FirstGreater (zero :: a) (one :: b) = go<Bcomp FirstLess a b
go<B FirstGreater (one :: a) [] = FirstGreater go<Bcomp FirstGreater (one :: a) [] = FirstGreater
go<B FirstGreater (one :: a) (zero :: b) = go<B FirstGreater a b go<Bcomp FirstGreater (one :: a) (zero :: b) = go<Bcomp FirstGreater a b
go<B FirstGreater (one :: a) (one :: b) = go<B FirstGreater a b go<Bcomp FirstGreater (one :: a) (one :: b) = go<Bcomp FirstGreater a b
go<B FirstLess [] b = FirstLess go<Bcomp FirstLess [] b = FirstLess
go<B FirstLess (zero :: a) [] = go<B FirstLess a [] go<Bcomp FirstLess (zero :: a) [] = go<Bcomp FirstLess a []
go<B FirstLess (one :: a) [] = FirstGreater go<Bcomp FirstLess (one :: a) [] = FirstGreater
go<B FirstLess (zero :: a) (zero :: b) = go<B FirstLess a b go<Bcomp FirstLess (zero :: a) (zero :: b) = go<Bcomp FirstLess a b
go<B FirstLess (zero :: a) (one :: b) = go<B FirstLess a b go<Bcomp FirstLess (zero :: a) (one :: b) = go<Bcomp FirstLess a b
go<B FirstLess (one :: a) (zero :: b) = go<B FirstGreater a b go<Bcomp FirstLess (one :: a) (zero :: b) = go<Bcomp FirstGreater a b
go<B FirstLess (one :: a) (one :: b) = go<B FirstLess a b go<Bcomp FirstLess (one :: a) (one :: b) = go<Bcomp FirstLess a b
_<B_ : BinNat BinNat Compare _<Bcomp_ : BinNat BinNat Compare
a <B b = go<B Equal a b a <Bcomp b = go<Bcomp Equal a b
private private
lemma1 : {s : Compare} (n : BinNat) go<B s n n s lemma1 : {s : Compare} (n : BinNat) go<Bcomp s n n s
lemma1 {Equal} [] = refl lemma1 {Equal} [] = refl
lemma1 {Equal} (zero :: n) = lemma1 n lemma1 {Equal} (zero :: n) = lemma1 n
lemma1 {Equal} (one :: n) = lemma1 n lemma1 {Equal} (one :: n) = lemma1 n
@@ -75,7 +76,7 @@ private
lemma1 {FirstGreater} (zero :: n) = lemma1 n lemma1 {FirstGreater} (zero :: n) = lemma1 n
lemma1 {FirstGreater} (one :: n) = lemma1 n lemma1 {FirstGreater} (one :: n) = lemma1 n
lemma : {s : Compare} (n : BinNat) go<B s (incr n) n FirstGreater lemma : {s : Compare} (n : BinNat) go<Bcomp s (incr n) n FirstGreater
lemma {Equal} [] = refl lemma {Equal} [] = refl
lemma {Equal} (zero :: n) = lemma1 n lemma {Equal} (zero :: n) = lemma1 n
lemma {Equal} (one :: n) = lemma {FirstLess} n lemma {Equal} (one :: n) = lemma {FirstLess} n
@@ -86,36 +87,37 @@ private
lemma {FirstGreater} (zero :: n) = lemma1 {FirstGreater} n lemma {FirstGreater} (zero :: n) = lemma1 {FirstGreater} n
lemma {FirstGreater} (one :: n) = lemma {FirstLess} n lemma {FirstGreater} (one :: n) = lemma {FirstLess} n
succLess : (n : ) (NToBinNat (succ n)) <B (NToBinNat n) FirstGreater succLess : (n : ) (NToBinNat (succ n)) <Bcomp (NToBinNat n) FirstGreater
succLess zero = refl succLess zero = refl
succLess (succ n) with NToBinNat n succLess (succ n) with NToBinNat n
succLess (succ n) | [] = refl succLess (succ n) | [] = refl
succLess (succ n) | zero :: bl = lemma {FirstLess} bl succLess (succ n) | zero :: bl = lemma {FirstLess} bl
succLess (succ n) | one :: bl = lemma1 {FirstGreater} (incr bl) succLess (succ n) | one :: bl = lemma1 {FirstGreater} (incr bl)
compareRefl : (n : BinNat) n <B n Equal compareRefl : (n : BinNat) n <Bcomp n Equal
compareRefl [] = refl compareRefl [] = refl
compareRefl (zero :: n) = compareRefl n compareRefl (zero :: n) = compareRefl n
compareRefl (one :: n) = compareRefl n compareRefl (one :: n) = compareRefl n
zeroLess : (n : BinNat) ((canonical n []) False) [] <B n FirstLess zeroLess : (n : BinNat) ((canonical n []) False) [] <Bcomp n FirstLess
zeroLess [] pr = exFalso (pr refl) zeroLess [] pr = exFalso (pr refl)
zeroLess (zero :: n) pr with inspect (canonical n) zeroLess (zero :: n) pr with inspect (canonical n)
zeroLess (zero :: n) pr | [] with x rewrite x = exFalso (pr refl) zeroLess (zero :: n) pr | [] with x rewrite x = exFalso (pr refl)
zeroLess (zero :: n) pr | (x₁ :: y) with x = zeroLess n λ i nonEmptyNotEmpty (transitivity (equalityCommutative x) i) zeroLess (zero :: n) pr | (x₁ :: y) with x = zeroLess n λ i nonEmptyNotEmpty (transitivity (equalityCommutative x) i)
zeroLess (one :: n) pr = refl zeroLess (one :: n) pr = refl
zeroLess' : (n : BinNat) ((canonical n []) False) n <B [] FirstGreater zeroLess' : (n : BinNat) ((canonical n []) False) n <Bcomp [] FirstGreater
zeroLess' [] pr = exFalso (pr refl) zeroLess' [] pr = exFalso (pr refl)
zeroLess' (zero :: n) pr with inspect (canonical n) zeroLess' (zero :: n) pr with inspect (canonical n)
zeroLess' (zero :: n) pr | [] with x rewrite x = exFalso (pr refl) zeroLess' (zero :: n) pr | [] with x rewrite x = exFalso (pr refl)
zeroLess' (zero :: n) pr | (x₁ :: y) with x = zeroLess' n (λ i nonEmptyNotEmpty (transitivity (equalityCommutative x) i)) zeroLess' (zero :: n) pr | (x₁ :: y) with x = zeroLess' n (λ i nonEmptyNotEmpty (transitivity (equalityCommutative x) i))
zeroLess' (one :: n) pr = refl zeroLess' (one :: n) pr = refl
canonicalFirst : (n m : BinNat) (state : Compare) go<B state n m go<B state (canonical n) m abstract
canonicalFirst : (n m : BinNat) (state : Compare) go<Bcomp state n m go<Bcomp state (canonical n) m
canonicalFirst [] m Equal = refl canonicalFirst [] m Equal = refl
canonicalFirst (zero :: n) m Equal with inspect (canonical n) canonicalFirst (zero :: n) m Equal with inspect (canonical n)
canonicalFirst (zero :: n) [] Equal | [] with x rewrite x = transitivity (canonicalFirst n [] Equal) (applyEquality (λ i go<B Equal i []) {canonical n} x) canonicalFirst (zero :: n) [] Equal | [] with x rewrite x = transitivity (canonicalFirst n [] Equal) (applyEquality (λ i go<Bcomp Equal i []) {canonical n} x)
canonicalFirst (zero :: n) (zero :: ms) Equal | [] with x rewrite x | canonicalFirst n ms Equal | x = refl canonicalFirst (zero :: n) (zero :: ms) Equal | [] with x rewrite x | canonicalFirst n ms Equal | x = refl
canonicalFirst (zero :: n) (one :: ms) Equal | [] with x rewrite x | canonicalFirst n ms FirstLess | x = refl canonicalFirst (zero :: n) (one :: ms) Equal | [] with x rewrite x | canonicalFirst n ms FirstLess | x = refl
canonicalFirst (zero :: n) [] Equal | (x₁ :: y) with x rewrite x | canonicalFirst n [] Equal | x = refl canonicalFirst (zero :: n) [] Equal | (x₁ :: y) with x rewrite x | canonicalFirst n [] Equal | x = refl
@@ -149,12 +151,13 @@ private
canonicalFirst (one :: n) (zero :: m) FirstGreater = canonicalFirst n m FirstGreater canonicalFirst (one :: n) (zero :: m) FirstGreater = canonicalFirst n m FirstGreater
canonicalFirst (one :: n) (one :: m) FirstGreater = canonicalFirst n m FirstGreater canonicalFirst (one :: n) (one :: m) FirstGreater = canonicalFirst n m FirstGreater
greater0Lemma : (n : BinNat) go<B FirstGreater n [] FirstGreater private
greater0Lemma : (n : BinNat) go<Bcomp FirstGreater n [] FirstGreater
greater0Lemma [] = refl greater0Lemma [] = refl
greater0Lemma (zero :: n) = refl greater0Lemma (zero :: n) = refl
greater0Lemma (one :: n) = refl greater0Lemma (one :: n) = refl
canonicalSecond : (n m : BinNat) (state : Compare) go<B state n m go<B state n (canonical m) canonicalSecond : (n m : BinNat) (state : Compare) go<Bcomp state n m go<Bcomp state n (canonical m)
canonicalSecond n [] Equal = refl canonicalSecond n [] Equal = refl
canonicalSecond [] (zero :: m) Equal with inspect (canonical m) canonicalSecond [] (zero :: m) Equal with inspect (canonical m)
canonicalSecond [] (zero :: m) Equal | [] with x rewrite x | canonicalSecond [] m Equal | x = refl canonicalSecond [] (zero :: m) Equal | [] with x rewrite x | canonicalSecond [] m Equal | x = refl
@@ -192,8 +195,8 @@ private
canonicalSecond (zero :: n) (one :: m) FirstGreater = canonicalSecond n m FirstLess canonicalSecond (zero :: n) (one :: m) FirstGreater = canonicalSecond n m FirstLess
canonicalSecond (one :: n) (one :: m) FirstGreater = canonicalSecond n m FirstGreater canonicalSecond (one :: n) (one :: m) FirstGreater = canonicalSecond n m FirstGreater
equalContaminated : (n m : BinNat) go<B FirstLess n m Equal False equalContaminated : (n m : BinNat) go<Bcomp FirstLess n m Equal False
equalContaminated' : (n m : BinNat) go<B FirstGreater n m Equal False equalContaminated' : (n m : BinNat) go<Bcomp FirstGreater n m Equal False
equalContaminated (zero :: n) [] pr = equalContaminated n [] pr equalContaminated (zero :: n) [] pr = equalContaminated n [] pr
equalContaminated (zero :: n) (zero :: m) pr = equalContaminated n m pr equalContaminated (zero :: n) (zero :: m) pr = equalContaminated n m pr
@@ -207,7 +210,7 @@ private
equalContaminated' (one :: n) (zero :: m) pr = equalContaminated' n m pr equalContaminated' (one :: n) (zero :: m) pr = equalContaminated' n m pr
equalContaminated' (one :: n) (one :: m) pr = equalContaminated' n m pr equalContaminated' (one :: n) (one :: m) pr = equalContaminated' n m pr
comparisonEqual : (a b : BinNat) (a <B b Equal) canonical a canonical b comparisonEqual : (a b : BinNat) (a <Bcomp b Equal) canonical a canonical b
comparisonEqual [] [] pr = refl comparisonEqual [] [] pr = refl
comparisonEqual [] (zero :: b) pr with inspect (canonical b) comparisonEqual [] (zero :: b) pr with inspect (canonical b)
comparisonEqual [] (zero :: b) pr | [] with p rewrite p = refl comparisonEqual [] (zero :: b) pr | [] with p rewrite p = refl
@@ -226,7 +229,7 @@ private
comparisonEqual (one :: a) (zero :: b) pr = exFalso (equalContaminated' a b pr) comparisonEqual (one :: a) (zero :: b) pr = exFalso (equalContaminated' a b pr)
comparisonEqual (one :: a) (one :: b) pr = applyEquality (one ::_) (comparisonEqual a b pr) comparisonEqual (one :: a) (one :: b) pr = applyEquality (one ::_) (comparisonEqual a b pr)
equalSymmetric : (n m : BinNat) n <B m Equal m <B n Equal equalSymmetric : (n m : BinNat) n <Bcomp m Equal m <Bcomp n Equal
equalSymmetric [] [] n=m = refl equalSymmetric [] [] n=m = refl
equalSymmetric [] (zero :: m) n=m rewrite equalSymmetric [] m n=m = refl equalSymmetric [] (zero :: m) n=m rewrite equalSymmetric [] m n=m = refl
equalSymmetric (zero :: n) [] n=m rewrite equalSymmetric n [] n=m = refl equalSymmetric (zero :: n) [] n=m rewrite equalSymmetric n [] n=m = refl
@@ -235,7 +238,7 @@ private
equalSymmetric (one :: n) (zero :: m) n=m = exFalso (equalContaminated' n m n=m) equalSymmetric (one :: n) (zero :: m) n=m = exFalso (equalContaminated' n m n=m)
equalSymmetric (one :: n) (one :: m) n=m = equalSymmetric n m n=m equalSymmetric (one :: n) (one :: m) n=m = equalSymmetric n m n=m
equalToFirstGreater : (state : Compare) (a b : BinNat) go<B Equal a b FirstGreater go<B state a b FirstGreater equalToFirstGreater : (state : Compare) (a b : BinNat) go<Bcomp Equal a b FirstGreater go<Bcomp state a b FirstGreater
equalToFirstGreater FirstGreater [] (zero :: b) pr = equalToFirstGreater FirstGreater [] b pr equalToFirstGreater FirstGreater [] (zero :: b) pr = equalToFirstGreater FirstGreater [] b pr
equalToFirstGreater FirstGreater (zero :: a) [] pr = refl equalToFirstGreater FirstGreater (zero :: a) [] pr = refl
equalToFirstGreater FirstGreater (zero :: a) (zero :: b) pr = equalToFirstGreater FirstGreater a b pr equalToFirstGreater FirstGreater (zero :: a) (zero :: b) pr = equalToFirstGreater FirstGreater a b pr
@@ -252,7 +255,7 @@ private
equalToFirstGreater FirstLess (one :: a) (zero :: b) pr = pr equalToFirstGreater FirstLess (one :: a) (zero :: b) pr = pr
equalToFirstGreater FirstLess (one :: a) (one :: b) pr = equalToFirstGreater FirstLess a b pr equalToFirstGreater FirstLess (one :: a) (one :: b) pr = equalToFirstGreater FirstLess a b pr
equalToFirstLess : (state : Compare) (a b : BinNat) go<B Equal a b FirstLess go<B state a b FirstLess equalToFirstLess : (state : Compare) (a b : BinNat) go<Bcomp Equal a b FirstLess go<Bcomp state a b FirstLess
equalToFirstLess FirstLess [] b pr = refl equalToFirstLess FirstLess [] b pr = refl
equalToFirstLess FirstLess (zero :: a) [] pr = equalToFirstLess FirstLess a [] pr equalToFirstLess FirstLess (zero :: a) [] pr = equalToFirstLess FirstLess a [] pr
equalToFirstLess FirstLess (zero :: a) (zero :: b) pr = equalToFirstLess FirstLess a b pr equalToFirstLess FirstLess (zero :: a) (zero :: b) pr = equalToFirstLess FirstLess a b pr
@@ -264,7 +267,7 @@ private
equalToFirstLess FirstGreater [] (one :: b) pr = refl equalToFirstLess FirstGreater [] (one :: b) pr = refl
equalToFirstLess FirstGreater (zero :: a) [] pr = transitivity (t a) (equalToFirstLess FirstGreater a [] pr) equalToFirstLess FirstGreater (zero :: a) [] pr = transitivity (t a) (equalToFirstLess FirstGreater a [] pr)
where where
t : (a : BinNat) FirstGreater go<B FirstGreater a [] t : (a : BinNat) FirstGreater go<Bcomp FirstGreater a []
t [] = refl t [] = refl
t (zero :: a) = refl t (zero :: a) = refl
t (one :: a) = refl t (one :: a) = refl
@@ -276,7 +279,7 @@ private
zeroNotSucc : (n : ) (b : BinNat) (canonical b []) (binNatToN b succ n) False zeroNotSucc : (n : ) (b : BinNat) (canonical b []) (binNatToN b succ n) False
zeroNotSucc n b b=0 b>0 rewrite binNatToNZero' b b=0 = naughtE b>0 zeroNotSucc n b b=0 b>0 rewrite binNatToNZero' b b=0 = naughtE b>0
chopFirstBit : (m n : BinNat) {b : Bit} (s : Compare) go<B s (b :: m) (b :: n) go<B s m n chopFirstBit : (m n : BinNat) {b : Bit} (s : Compare) go<Bcomp s (b :: m) (b :: n) go<Bcomp s m n
chopFirstBit m n {zero} Equal = refl chopFirstBit m n {zero} Equal = refl
chopFirstBit m n {one} Equal = refl chopFirstBit m n {one} Equal = refl
chopFirstBit m n {zero} FirstLess = refl chopFirstBit m n {zero} FirstLess = refl
@@ -312,7 +315,7 @@ private
succNotLess : {n : } succ n <N n False succNotLess : {n : } succ n <N n False
succNotLess {succ n} (le x proof) = succNotLess {n} (le x (succInjective (transitivity (applyEquality succ (transitivity (Semiring.commutative Semiring (succ x) (succ n)) (transitivity (applyEquality succ (transitivity (Semiring.commutative Semiring n (succ x)) (applyEquality succ (Semiring.commutative Semiring x n)))) (Semiring.commutative Semiring (succ (succ n)) x)))) proof))) succNotLess {succ n} (le x proof) = succNotLess {n} (le x (succInjective (transitivity (applyEquality succ (transitivity (Semiring.commutative Semiring (succ x) (succ n)) (transitivity (applyEquality succ (transitivity (Semiring.commutative Semiring n (succ x)) (applyEquality succ (Semiring.commutative Semiring x n)))) (Semiring.commutative Semiring (succ (succ n)) x)))) proof)))
<BIsInherited : (a b : BinNat) a <BInherited b a <B b <BIsInherited : (a b : BinNat) a <BInherited b a <Bcomp b
<BIsInherited [] b with TotalOrder.totality TotalOrder 0 (binNatToN b) <BIsInherited [] b with TotalOrder.totality TotalOrder 0 (binNatToN b)
<BIsInherited [] b | inl (inl x) with inspect (binNatToN b) <BIsInherited [] b | inl (inl x) with inspect (binNatToN b)
<BIsInherited [] b | inl (inl x) | 0 with pr rewrite binNatToNZero b pr | pr = exFalso (TotalOrder.irreflexive (TotalOrder) x) <BIsInherited [] b | inl (inl x) | 0 with pr rewrite binNatToNZero b pr | pr = exFalso (TotalOrder.irreflexive (TotalOrder) x)
@@ -333,7 +336,7 @@ private
t | inl (inl x) = refl t | inl (inl x) = refl
t | inl (inr x) = exFalso (TotalOrder.irreflexive (TotalOrder) (TotalOrder.<Transitive (TotalOrder) x a<b)) t | inl (inr x) = exFalso (TotalOrder.irreflexive (TotalOrder) (TotalOrder.<Transitive (TotalOrder) x a<b))
t | inr x rewrite x = exFalso (TotalOrder.irreflexive (TotalOrder) a<b) t | inr x rewrite x = exFalso (TotalOrder.irreflexive (TotalOrder) a<b)
indHyp : FirstLess go<B Equal a b indHyp : FirstLess go<Bcomp Equal a b
indHyp = transitivity (equalityCommutative t) (<BIsInherited a b) indHyp = transitivity (equalityCommutative t) (<BIsInherited a b)
<BIsInherited (zero :: a) (one :: b) | inl (inl 2a<2b+1) | inl (inr b<a) = exFalso (noIntegersBetweenXAndSuccX {2 *N binNatToN a} (2 *N binNatToN b) (lessRespectsMultiplicationLeft (binNatToN b) (binNatToN a) 2 b<a (le 1 refl)) 2a<2b+1) <BIsInherited (zero :: a) (one :: b) | inl (inl 2a<2b+1) | inl (inr b<a) = exFalso (noIntegersBetweenXAndSuccX {2 *N binNatToN a} (2 *N binNatToN b) (lessRespectsMultiplicationLeft (binNatToN b) (binNatToN a) 2 b<a (le 1 refl)) 2a<2b+1)
<BIsInherited (zero :: a) (one :: b) | inl (inl 2a<2b+1) | inr a=b rewrite a=b | canonicalFirst a b FirstLess | canonicalSecond (canonical a) b FirstLess | transitivity (equalityCommutative (binToBin a)) (transitivity (applyEquality NToBinNat a=b) (binToBin b)) = equalityCommutative (lemma1 (canonical b)) <BIsInherited (zero :: a) (one :: b) | inl (inl 2a<2b+1) | inr a=b rewrite a=b | canonicalFirst a b FirstLess | canonicalSecond (canonical a) b FirstLess | transitivity (equalityCommutative (binToBin a)) (transitivity (applyEquality NToBinNat a=b) (binToBin b)) = equalityCommutative (lemma1 (canonical b))
@@ -346,7 +349,7 @@ private
t | inl (inl x) = exFalso (TotalOrder.irreflexive (TotalOrder) (TotalOrder.<Transitive (TotalOrder) x b<a)) t | inl (inl x) = exFalso (TotalOrder.irreflexive (TotalOrder) (TotalOrder.<Transitive (TotalOrder) x b<a))
t | inl (inr x) = refl t | inl (inr x) = refl
t | inr x rewrite x = exFalso (TotalOrder.irreflexive (TotalOrder) b<a) t | inr x rewrite x = exFalso (TotalOrder.irreflexive (TotalOrder) b<a)
indHyp : FirstGreater go<B Equal a b indHyp : FirstGreater go<Bcomp Equal a b
indHyp = transitivity (equalityCommutative t) (<BIsInherited a b) indHyp = transitivity (equalityCommutative t) (<BIsInherited a b)
<BIsInherited (zero :: a) (one :: b) | inl (inr 2b+1<2a) | inr a=b rewrite a=b = exFalso (succNotLess 2b+1<2a) <BIsInherited (zero :: a) (one :: b) | inl (inr 2b+1<2a) | inr a=b rewrite a=b = exFalso (succNotLess 2b+1<2a)
<BIsInherited (zero :: a) (one :: b) | inr 2a=2b+1 = exFalso (parity (binNatToN b) (binNatToN a) (equalityCommutative 2a=2b+1)) <BIsInherited (zero :: a) (one :: b) | inr 2a=2b+1 = exFalso (parity (binNatToN b) (binNatToN a) (equalityCommutative 2a=2b+1))
@@ -359,7 +362,7 @@ private
t | inl (inr x) = exFalso (TotalOrder.irreflexive (TotalOrder) (TotalOrder.<Transitive (TotalOrder) x a<b)) t | inl (inr x) = exFalso (TotalOrder.irreflexive (TotalOrder) (TotalOrder.<Transitive (TotalOrder) x a<b))
t | inl (inl x) = refl t | inl (inl x) = refl
t | inr x rewrite x = exFalso (TotalOrder.irreflexive (TotalOrder) a<b) t | inr x rewrite x = exFalso (TotalOrder.irreflexive (TotalOrder) a<b)
indHyp : FirstLess go<B Equal a b indHyp : FirstLess go<Bcomp Equal a b
indHyp = transitivity (equalityCommutative t) (<BIsInherited a b) indHyp = transitivity (equalityCommutative t) (<BIsInherited a b)
<BIsInherited (one :: a) (zero :: b) | inl (inl 2a+1<2b) | inl (inr b<a) = exFalso (TotalOrder.irreflexive (TotalOrder) (TotalOrder.<Transitive (TotalOrder) 2a+1<2b (TotalOrder.<Transitive (TotalOrder) (lessRespectsMultiplicationLeft (binNatToN b) (binNatToN a) 2 b<a (le 1 refl)) (le zero refl)))) <BIsInherited (one :: a) (zero :: b) | inl (inl 2a+1<2b) | inl (inr b<a) = exFalso (TotalOrder.irreflexive (TotalOrder) (TotalOrder.<Transitive (TotalOrder) 2a+1<2b (TotalOrder.<Transitive (TotalOrder) (lessRespectsMultiplicationLeft (binNatToN b) (binNatToN a) 2 b<a (le 1 refl)) (le zero refl))))
<BIsInherited (one :: a) (zero :: b) | inl (inl 2a+1<2b) | inr a=b rewrite a=b = exFalso (succNotLess 2a+1<2b) <BIsInherited (one :: a) (zero :: b) | inl (inl 2a+1<2b) | inr a=b rewrite a=b = exFalso (succNotLess 2a+1<2b)
@@ -372,8 +375,70 @@ private
t | inl (inl x) = exFalso (TotalOrder.irreflexive (TotalOrder) (TotalOrder.<Transitive (TotalOrder) x b<a)) t | inl (inl x) = exFalso (TotalOrder.irreflexive (TotalOrder) (TotalOrder.<Transitive (TotalOrder) x b<a))
t | inl (inr x) = refl t | inl (inr x) = refl
t | inr x rewrite x = exFalso (TotalOrder.irreflexive (TotalOrder) b<a) t | inr x rewrite x = exFalso (TotalOrder.irreflexive (TotalOrder) b<a)
indHyp : FirstGreater go<B Equal a b indHyp : FirstGreater go<Bcomp Equal a b
indHyp = transitivity (equalityCommutative t) (<BIsInherited a b) indHyp = transitivity (equalityCommutative t) (<BIsInherited a b)
<BIsInherited (one :: a) (zero :: b) | inl (inr 2b<2a+1) | inr a=b rewrite a=b | canonicalFirst a b FirstGreater | canonicalSecond (canonical a) b FirstGreater | transitivity (equalityCommutative (binToBin a)) (transitivity (applyEquality NToBinNat a=b) (binToBin b)) = equalityCommutative (lemma1 (canonical b)) <BIsInherited (one :: a) (zero :: b) | inl (inr 2b<2a+1) | inr a=b rewrite a=b | canonicalFirst a b FirstGreater | canonicalSecond (canonical a) b FirstGreater | transitivity (equalityCommutative (binToBin a)) (transitivity (applyEquality NToBinNat a=b) (binToBin b)) = equalityCommutative (lemma1 (canonical b))
<BIsInherited (one :: a) (zero :: b) | inr x = exFalso (parity (binNatToN a) (binNatToN b) x) <BIsInherited (one :: a) (zero :: b) | inr x = exFalso (parity (binNatToN a) (binNatToN b) x)
<BIsInherited (one :: a) (one :: b) = transitivity (chopDouble a b one) (<BIsInherited a b) <BIsInherited (one :: a) (one :: b) = transitivity (chopDouble a b one) (<BIsInherited a b)
_<B_ : BinNat BinNat Set
a <B b = (a <Bcomp b) FirstLess
translate : (a b : BinNat) (a <B b) (binNatToN a) <N (binNatToN b)
translate a b a<b with <BIsInherited a b
... | r with TotalOrder.totality TotalOrder (binNatToN a) (binNatToN b)
... | inl (inl x) = x
... | inl (inr x) = exFalso (badCompare'' (transitivity (equalityCommutative a<b) (equalityCommutative r)))
... | inr x = exFalso (badCompare (transitivity r a<b))
private
totality : (a b : BinNat) ((a <B b) || (b <B a)) || (canonical a canonical b)
totality [] [] = inr refl
totality [] (zero :: b) with totality [] b
... | inl (inl x) = inl (inl x)
... | inl (inr x) = inl (inr x)
... | inr x with canonical b
... | [] = inr refl
totality [] (one :: b) = inl (inl refl)
totality (zero :: a) [] with totality a []
... | inl (inl x) = inl (inl x)
... | inl (inr x) = inl (inr x)
... | inr x with canonical a
... | [] = inr refl
totality (zero :: a) (zero :: b) with totality a b
... | inl (inl x) = inl (inl x)
... | inl (inr x) = inl (inr x)
... | inr x rewrite x = inr refl
totality (zero :: a) (one :: b) with totality a b
... | inl (inl x) = inl (inl (equalToFirstLess FirstLess a b x))
... | inr x rewrite canonicalSecond a b FirstLess | canonicalFirst a (canonical b) FirstLess | x = inl (inl (lemma1 (canonical b)))
... | inl (inr x) with equalToFirstLess FirstGreater b a x
... | r = inl (inr r)
totality (one :: a) [] = inl (inr refl)
totality (one :: a) (zero :: b) with totality a b
... | inr x rewrite canonicalSecond b a FirstLess | canonicalFirst b (canonical a) FirstLess | x = inl (inr (lemma1 (canonical b)))
... | inl (inr x) = inl (inr (equalToFirstLess FirstLess b a x))
... | inl (inl x) with equalToFirstLess FirstGreater a b x
... | r = inl (inl r)
totality (one :: a) (one :: b) with totality a b
... | inl (inl x) = inl (inl x)
... | inl (inr x) = inl (inr x)
... | inr x rewrite x = inr refl
translate' : (a b : ) (a <N b) (NToBinNat a) <B (NToBinNat b)
translate' a b a<b with totality (NToBinNat a) (NToBinNat b)
... | inl (inl x) = x
... | inl (inr x) with translate (NToBinNat b) (NToBinNat a) x
... | m = exFalso (lessIrreflexive (lessTransitive a<b (identityOfIndiscernablesLeft _<N_ (identityOfIndiscernablesRight _<N_ m (nToN a)) (nToN b))))
translate' a b a<b | inr x rewrite NToBinNatInj a b x = exFalso (lessIrreflexive a<b)
private
<BTransitive : (a b c : BinNat) (a <B b) (b <B c) a <B c
<BTransitive a b c a<b b<c with translate' (binNatToN a) (binNatToN c) (PartialOrder.<Transitive (TotalOrder.order TotalOrder) (translate a b a<b) (translate b c b<c))
... | r rewrite binToBin a | binToBin c = transitivity (canonicalFirst a c Equal) (transitivity (canonicalSecond (canonical a) c Equal) r)
-- This order fails to be total because [] is not literally equal to 0::[] .
BinNatOrder : PartialOrder BinNat
PartialOrder._<_ (BinNatOrder) = _<B_
PartialOrder.irreflexive (BinNatOrder) {x} bad = badCompare (transitivity (equalityCommutative (compareRefl x)) bad)
PartialOrder.<Transitive (BinNatOrder) {a} {b} {c} a<b b<c = <BTransitive a b c a<b b<c

View File

@@ -25,378 +25,378 @@ private
... | bl with go zero a a ... | bl with go zero a a
aMinusAGo (one :: a) | bl | yes x rewrite yesInjective bl = refl aMinusAGo (one :: a) | bl | yes x rewrite yesInjective bl = refl
aMinusALemma : (a : BinNat) mapMaybe canonical (mapMaybe (_::_ zero) (go zero a a)) yes [] aMinusALemma : (a : BinNat) mapMaybe canonical (mapMaybe (_::_ zero) (go zero a a)) yes []
aMinusALemma a with inspect (go zero a a) aMinusALemma a with inspect (go zero a a)
aMinusALemma a | no with x with aMinusAGo a aMinusALemma a | no with x with aMinusAGo a
... | r rewrite x = exFalso (noNotYes r) ... | r rewrite x = exFalso (noNotYes r)
aMinusALemma a | yes xs with pr with inspect (canonical xs) aMinusALemma a | yes xs with pr with inspect (canonical xs)
aMinusALemma a | yes xs with pr | [] with pr2 rewrite pr | pr2 = refl aMinusALemma a | yes xs with pr | [] with pr2 rewrite pr | pr2 = refl
aMinusALemma a | yes xs with pr | (x :: t) with pr2 with aMinusAGo a aMinusALemma a | yes xs with pr | (x :: t) with pr2 with aMinusAGo a
... | b rewrite pr | pr2 = exFalso (nonEmptyNotEmpty (yesInjective b)) ... | b rewrite pr | pr2 = exFalso (nonEmptyNotEmpty (yesInjective b))
aMinusA : (a : BinNat) mapMaybe canonical (a -B a) yes [] aMinusA : (a : BinNat) mapMaybe canonical (a -B a) yes []
aMinusA [] = refl aMinusA [] = refl
aMinusA (zero :: a) = aMinusALemma a aMinusA (zero :: a) = aMinusALemma a
aMinusA (one :: a) = aMinusALemma a aMinusA (one :: a) = aMinusALemma a
goOne : (a b : BinNat) mapMaybe canonical (go one (incr a) b) mapMaybe canonical (go zero a b) goOne : (a b : BinNat) mapMaybe canonical (go one (incr a) b) mapMaybe canonical (go zero a b)
goOne [] [] = refl goOne [] [] = refl
goOne [] (zero :: b) with inspect (go zero [] b) goOne [] (zero :: b) with inspect (go zero [] b)
goOne [] (zero :: b) | no with pr rewrite pr = refl goOne [] (zero :: b) | no with pr rewrite pr = refl
goOne [] (zero :: b) | yes x with pr with goZeroEmpty b pr goOne [] (zero :: b) | yes x with pr with goZeroEmpty b pr
... | t with inspect (canonical x) ... | t with inspect (canonical x)
goOne [] (zero :: b) | yes x with pr | t | [] with pr2 rewrite pr | pr2 = refl goOne [] (zero :: b) | yes x with pr | t | [] with pr2 rewrite pr | pr2 = refl
goOne [] (zero :: b) | yes x with pr | t | (x₁ :: y) with pr2 with goZeroEmpty' b pr goOne [] (zero :: b) | yes x with pr | t | (x₁ :: y) with pr2 with goZeroEmpty' b pr
... | bl = exFalso (nonEmptyNotEmpty (transitivity (equalityCommutative pr2) bl)) ... | bl = exFalso (nonEmptyNotEmpty (transitivity (equalityCommutative pr2) bl))
goOne [] (one :: b) with inspect (go one [] b) goOne [] (one :: b) with inspect (go one [] b)
goOne [] (one :: b) | no with pr rewrite pr = refl goOne [] (one :: b) | no with pr rewrite pr = refl
goOne [] (one :: b) | yes x with pr = exFalso (goOneEmpty b pr) goOne [] (one :: b) | yes x with pr = exFalso (goOneEmpty b pr)
goOne (zero :: a) [] = refl goOne (zero :: a) [] = refl
goOne (zero :: a) (zero :: b) = refl goOne (zero :: a) (zero :: b) = refl
goOne (zero :: a) (one :: b) = refl goOne (zero :: a) (one :: b) = refl
goOne (one :: a) [] with inspect (go one (incr a) []) goOne (one :: a) [] with inspect (go one (incr a) [])
goOne (one :: a) [] | no with pr with goOne a [] goOne (one :: a) [] | no with pr with goOne a []
... | bl rewrite pr | goEmpty a = exFalso (noNotYes bl) ... | bl rewrite pr | goEmpty a = exFalso (noNotYes bl)
goOne (one :: a) [] | yes y with pr with goOne a [] goOne (one :: a) [] | yes y with pr with goOne a []
... | bl rewrite pr = applyEquality (λ i yes (one :: i)) (yesInjective (transitivity bl (applyEquality (mapMaybe canonical) (goEmpty a)))) ... | bl rewrite pr = applyEquality (λ i yes (one :: i)) (yesInjective (transitivity bl (applyEquality (mapMaybe canonical) (goEmpty a))))
goOne (one :: a) (zero :: b) with inspect (go zero a b) goOne (one :: a) (zero :: b) with inspect (go zero a b)
goOne (one :: a) (zero :: b) | no with pr with inspect (go one (incr a) b) goOne (one :: a) (zero :: b) | no with pr with inspect (go one (incr a) b)
goOne (one :: a) (zero :: b) | no with pr | no with x rewrite pr | x = refl goOne (one :: a) (zero :: b) | no with pr | no with x rewrite pr | x = refl
goOne (one :: a) (zero :: b) | no with pr | yes y with x with goOne a b goOne (one :: a) (zero :: b) | no with pr | yes y with x with goOne a b
... | f rewrite pr | x = exFalso (noNotYes (equalityCommutative f)) ... | f rewrite pr | x = exFalso (noNotYes (equalityCommutative f))
goOne (one :: a) (zero :: b) | yes y with pr with inspect (go one (incr a) b) goOne (one :: a) (zero :: b) | yes y with pr with inspect (go one (incr a) b)
goOne (one :: a) (zero :: b) | yes y with pr | no with x with goOne a b goOne (one :: a) (zero :: b) | yes y with pr | no with x with goOne a b
... | f rewrite pr | x = exFalso (noNotYes f) ... | f rewrite pr | x = exFalso (noNotYes f)
goOne (one :: a) (zero :: b) | yes y with pr | yes z with x rewrite pr | x = applyEquality (λ i yes (one :: i)) (yesInjective (transitivity (transitivity (applyEquality (mapMaybe canonical) (equalityCommutative x)) (goOne a b)) (applyEquality (mapMaybe canonical) pr))) goOne (one :: a) (zero :: b) | yes y with pr | yes z with x rewrite pr | x = applyEquality (λ i yes (one :: i)) (yesInjective (transitivity (transitivity (applyEquality (mapMaybe canonical) (equalityCommutative x)) (goOne a b)) (applyEquality (mapMaybe canonical) pr)))
goOne (one :: a) (one :: b) with inspect (go zero a b) goOne (one :: a) (one :: b) with inspect (go zero a b)
goOne (one :: a) (one :: b) | no with pr with inspect (go one (incr a) b) goOne (one :: a) (one :: b) | no with pr with inspect (go one (incr a) b)
goOne (one :: a) (one :: b) | no with pr | no with pr2 rewrite pr | pr2 = refl goOne (one :: a) (one :: b) | no with pr | no with pr2 rewrite pr | pr2 = refl
goOne (one :: a) (one :: b) | no with pr | yes x with pr2 rewrite pr | pr2 = exFalso (noNotYes (transitivity (applyEquality (mapMaybe canonical) (equalityCommutative pr)) (transitivity (equalityCommutative (goOne a b)) (applyEquality (mapMaybe canonical) pr2)))) goOne (one :: a) (one :: b) | no with pr | yes x with pr2 rewrite pr | pr2 = exFalso (noNotYes (transitivity (applyEquality (mapMaybe canonical) (equalityCommutative pr)) (transitivity (equalityCommutative (goOne a b)) (applyEquality (mapMaybe canonical) pr2))))
goOne (one :: a) (one :: b) | yes y with pr with inspect (go one (incr a) b) goOne (one :: a) (one :: b) | yes y with pr with inspect (go one (incr a) b)
goOne (one :: a) (one :: b) | yes y with pr | yes z with pr2 rewrite pr | pr2 = applyEquality yes t goOne (one :: a) (one :: b) | yes y with pr | yes z with pr2 rewrite pr | pr2 = applyEquality yes t
where where
u : canonical z canonical y u : canonical z canonical y
u = yesInjective (transitivity (transitivity (equalityCommutative (applyEquality (mapMaybe canonical) pr2)) (goOne a b)) (applyEquality (mapMaybe canonical) pr)) u = yesInjective (transitivity (transitivity (equalityCommutative (applyEquality (mapMaybe canonical) pr2)) (goOne a b)) (applyEquality (mapMaybe canonical) pr))
t : canonical (zero :: z) canonical (zero :: y) t : canonical (zero :: z) canonical (zero :: y)
t with inspect (canonical z) t with inspect (canonical z)
t | [] with pr1 rewrite equalityCommutative u | pr1 = refl t | [] with pr1 rewrite equalityCommutative u | pr1 = refl
t | (x :: bl) with pr rewrite equalityCommutative u | pr = refl t | (x :: bl) with pr rewrite equalityCommutative u | pr = refl
goOne (one :: a) (one :: b) | yes y with pr | no with pr2 rewrite pr | pr2 = exFalso (noNotYes (transitivity (equalityCommutative (applyEquality (mapMaybe canonical) pr2)) (transitivity (goOne a b) (applyEquality (mapMaybe canonical) pr)))) goOne (one :: a) (one :: b) | yes y with pr | no with pr2 rewrite pr | pr2 = exFalso (noNotYes (transitivity (equalityCommutative (applyEquality (mapMaybe canonical) pr2)) (transitivity (goOne a b) (applyEquality (mapMaybe canonical) pr))))
plusThenMinus : (a b : BinNat) mapMaybe canonical ((a +B b) -B b) yes (canonical a) plusThenMinus : (a b : BinNat) mapMaybe canonical ((a +B b) -B b) yes (canonical a)
plusThenMinus [] b = aMinusA b plusThenMinus [] b = aMinusA b
plusThenMinus (zero :: a) [] = refl plusThenMinus (zero :: a) [] = refl
plusThenMinus (zero :: a) (zero :: b) = t plusThenMinus (zero :: a) (zero :: b) = t
where where
t : mapMaybe canonical (mapMaybe (zero ::_) (go zero (a +B b) b)) yes (canonical (zero :: a)) t : mapMaybe canonical (mapMaybe (zero ::_) (go zero (a +B b) b)) yes (canonical (zero :: a))
t with inspect (go zero (a +B b) b) t with inspect (go zero (a +B b) b)
t | no with x with plusThenMinus a b t | no with x with plusThenMinus a b
... | bl rewrite x = exFalso (noNotYes bl) ... | bl rewrite x = exFalso (noNotYes bl)
t | yes y with x with plusThenMinus a b t | yes y with x with plusThenMinus a b
... | f rewrite x = applyEquality yes u ... | f rewrite x = applyEquality yes u
where where
u : canonical (zero :: y) canonical (zero :: a) u : canonical (zero :: y) canonical (zero :: a)
u with inspect (canonical y) u with inspect (canonical y)
u | [] with pr rewrite pr | equalityCommutative (yesInjective f) = refl u | [] with pr rewrite pr | equalityCommutative (yesInjective f) = refl
u | (x :: bl) with pr rewrite pr | equalityCommutative (yesInjective f) = refl u | (x :: bl) with pr rewrite pr | equalityCommutative (yesInjective f) = refl
plusThenMinus (zero :: a) (one :: b) = t plusThenMinus (zero :: a) (one :: b) = t
where where
t : mapMaybe canonical (mapMaybe (zero ::_) (go zero (a +B b) b)) yes (canonical (zero :: a)) t : mapMaybe canonical (mapMaybe (zero ::_) (go zero (a +B b) b)) yes (canonical (zero :: a))
t with inspect (go zero (a +B b) b) t with inspect (go zero (a +B b) b)
t | no with x with plusThenMinus a b t | no with x with plusThenMinus a b
... | bl rewrite x = exFalso (noNotYes bl) ... | bl rewrite x = exFalso (noNotYes bl)
t | yes y with x with plusThenMinus a b t | yes y with x with plusThenMinus a b
... | f rewrite x = applyEquality yes u ... | f rewrite x = applyEquality yes u
where where
u : canonical (zero :: y) canonical (zero :: a) u : canonical (zero :: y) canonical (zero :: a)
u with inspect (canonical y) u with inspect (canonical y)
u | [] with pr rewrite pr | equalityCommutative (yesInjective f) = refl u | [] with pr rewrite pr | equalityCommutative (yesInjective f) = refl
u | (x :: bl) with pr rewrite pr | equalityCommutative (yesInjective f) = refl u | (x :: bl) with pr rewrite pr | equalityCommutative (yesInjective f) = refl
plusThenMinus (one :: a) [] = refl plusThenMinus (one :: a) [] = refl
plusThenMinus (one :: a) (zero :: b) = t plusThenMinus (one :: a) (zero :: b) = t
where where
t : mapMaybe canonical (mapMaybe (_::_ one) (go zero (a +B b) b)) yes (one :: canonical a) t : mapMaybe canonical (mapMaybe (_::_ one) (go zero (a +B b) b)) yes (one :: canonical a)
t with inspect (go zero (a +B b) b) t with inspect (go zero (a +B b) b)
t | no with x with plusThenMinus a b t | no with x with plusThenMinus a b
... | bl rewrite x = exFalso (noNotYes bl) ... | bl rewrite x = exFalso (noNotYes bl)
t | yes y with x with plusThenMinus a b t | yes y with x with plusThenMinus a b
... | bl rewrite x = applyEquality (λ i yes (one :: i)) (yesInjective bl) ... | bl rewrite x = applyEquality (λ i yes (one :: i)) (yesInjective bl)
plusThenMinus (one :: a) (one :: b) = t plusThenMinus (one :: a) (one :: b) = t
where where
t : mapMaybe canonical (mapMaybe (_::_ one) (go one (incr (a +B b)) b)) yes (one :: canonical a) t : mapMaybe canonical (mapMaybe (_::_ one) (go one (incr (a +B b)) b)) yes (one :: canonical a)
t with inspect (go one (incr (a +B b)) b) t with inspect (go one (incr (a +B b)) b)
t | no with x with goOne (a +B b) b t | no with x with goOne (a +B b) b
... | f rewrite x | plusThenMinus a b = exFalso (noNotYes f) ... | f rewrite x | plusThenMinus a b = exFalso (noNotYes f)
t | yes y with x with goOne (a +B b) b t | yes y with x with goOne (a +B b) b
... | f rewrite x | plusThenMinus a b = applyEquality (λ i yes (one :: i)) (yesInjective f) ... | f rewrite x | plusThenMinus a b = applyEquality (λ i yes (one :: i)) (yesInjective f)
subLemma : (a b : ) a <N b succ (a +N a) <N b +N b subLemma : (a b : ) a <N b succ (a +N a) <N b +N b
subLemma a b a<b with TotalOrder.totality TotalOrder (succ (a +N a)) (b +N b) subLemma a b a<b with TotalOrder.totality TotalOrder (succ (a +N a)) (b +N b)
subLemma a b a<b | inl (inl x) = x subLemma a b a<b | inl (inl x) = x
subLemma a b a<b | inl (inr x) = exFalso (noIntegersBetweenXAndSuccX (a +N a) (addStrongInequalities a<b a<b) x) subLemma a b a<b | inl (inr x) = exFalso (noIntegersBetweenXAndSuccX (a +N a) (addStrongInequalities a<b a<b) x)
subLemma a b a<b | inr x = exFalso (parity a b (transitivity (applyEquality (succ a +N_) (Semiring.sumZeroRight Semiring a)) (transitivity x (applyEquality (b +N_) (equalityCommutative (Semiring.sumZeroRight Semiring b)))))) subLemma a b a<b | inr x = exFalso (parity a b (transitivity (applyEquality (succ a +N_) (Semiring.sumZeroRight Semiring a)) (transitivity x (applyEquality (b +N_) (equalityCommutative (Semiring.sumZeroRight Semiring b))))))
subLemma2 : (a b : ) a <N b 2 *N a <N succ (2 *N b) subLemma2 : (a b : ) a <N b 2 *N a <N succ (2 *N b)
subLemma2 a b a<b with TotalOrder.totality TotalOrder (2 *N a) (succ (2 *N b)) subLemma2 a b a<b with TotalOrder.totality TotalOrder (2 *N a) (succ (2 *N b))
subLemma2 a b a<b | inl (inl x) = x subLemma2 a b a<b | inl (inl x) = x
subLemma2 a b a<b | inl (inr x) = exFalso (TotalOrder.irreflexive TotalOrder (TotalOrder.<Transitive TotalOrder x (TotalOrder.<Transitive TotalOrder (lessRespectsMultiplicationLeft a b 2 a<b (le 1 refl)) (le 0 refl)))) subLemma2 a b a<b | inl (inr x) = exFalso (TotalOrder.irreflexive TotalOrder (TotalOrder.<Transitive TotalOrder x (TotalOrder.<Transitive TotalOrder (lessRespectsMultiplicationLeft a b 2 a<b (le 1 refl)) (le 0 refl))))
subLemma2 a b a<b | inr x = exFalso (parity b a (equalityCommutative x)) subLemma2 a b a<b | inr x = exFalso (parity b a (equalityCommutative x))
subtraction : (a b : BinNat) a -B b no binNatToN a <N binNatToN b subtraction : (a b : BinNat) a -B b no binNatToN a <N binNatToN b
subtraction' : (a b : BinNat) go one a b no (binNatToN a <N binNatToN b) || (binNatToN a binNatToN b) subtraction' : (a b : BinNat) go one a b no (binNatToN a <N binNatToN b) || (binNatToN a binNatToN b)
subtraction' [] [] pr = inr refl subtraction' [] [] pr = inr refl
subtraction' [] (x :: b) pr with TotalOrder.totality TotalOrder 0 (binNatToN (x :: b)) subtraction' [] (x :: b) pr with TotalOrder.totality TotalOrder 0 (binNatToN (x :: b))
subtraction' [] (x :: b) pr | inl (inl x₁) = inl x₁ subtraction' [] (x :: b) pr | inl (inl x₁) = inl x₁
subtraction' [] (x :: b) pr | inr x₁ = inr x₁ subtraction' [] (x :: b) pr | inr x₁ = inr x₁
subtraction' (zero :: a) [] pr with subtraction' a [] (mapMaybePreservesNo pr) subtraction' (zero :: a) [] pr with subtraction' a [] (mapMaybePreservesNo pr)
subtraction' (zero :: a) [] pr | inr x rewrite x = inr refl subtraction' (zero :: a) [] pr | inr x rewrite x = inr refl
subtraction' (zero :: a) (zero :: b) pr with subtraction' a b (mapMaybePreservesNo pr) subtraction' (zero :: a) (zero :: b) pr with subtraction' a b (mapMaybePreservesNo pr)
subtraction' (zero :: a) (zero :: b) pr | inl x = inl (lessRespectsMultiplicationLeft (binNatToN a) (binNatToN b) 2 x (le 1 refl)) subtraction' (zero :: a) (zero :: b) pr | inl x = inl (lessRespectsMultiplicationLeft (binNatToN a) (binNatToN b) 2 x (le 1 refl))
subtraction' (zero :: a) (zero :: b) pr | inr x rewrite x = inr refl subtraction' (zero :: a) (zero :: b) pr | inr x rewrite x = inr refl
subtraction' (zero :: a) (one :: b) pr with subtraction' a b (mapMaybePreservesNo pr) subtraction' (zero :: a) (one :: b) pr with subtraction' a b (mapMaybePreservesNo pr)
subtraction' (zero :: a) (one :: b) pr | inl x = inl (subLemma2 (binNatToN a) (binNatToN b) x) subtraction' (zero :: a) (one :: b) pr | inl x = inl (subLemma2 (binNatToN a) (binNatToN b) x)
subtraction' (zero :: a) (one :: b) pr | inr x rewrite x = inl (le zero refl) subtraction' (zero :: a) (one :: b) pr | inr x rewrite x = inl (le zero refl)
subtraction' (one :: a) (zero :: b) pr with subtraction a b (mapMaybePreservesNo pr) subtraction' (one :: a) (zero :: b) pr with subtraction a b (mapMaybePreservesNo pr)
... | t rewrite Semiring.sumZeroRight Semiring (binNatToN a) | Semiring.sumZeroRight Semiring (binNatToN b) = inl (subLemma (binNatToN a) (binNatToN b) t) ... | t rewrite Semiring.sumZeroRight Semiring (binNatToN a) | Semiring.sumZeroRight Semiring (binNatToN b) = inl (subLemma (binNatToN a) (binNatToN b) t)
subtraction' (one :: a) (one :: b) pr with subtraction' a b (mapMaybePreservesNo pr) subtraction' (one :: a) (one :: b) pr with subtraction' a b (mapMaybePreservesNo pr)
subtraction' (one :: a) (one :: b) pr | inl x = inl (succPreservesInequality (lessRespectsMultiplicationLeft (binNatToN a) (binNatToN b) 2 x (le 1 refl))) subtraction' (one :: a) (one :: b) pr | inl x = inl (succPreservesInequality (lessRespectsMultiplicationLeft (binNatToN a) (binNatToN b) 2 x (le 1 refl)))
subtraction' (one :: a) (one :: b) pr | inr x rewrite x = inr refl subtraction' (one :: a) (one :: b) pr | inr x rewrite x = inr refl
subtraction [] (zero :: b) pr with inspect (binNatToN b) subtraction [] (zero :: b) pr with inspect (binNatToN b)
subtraction [] (zero :: b) pr | zero with pr1 = exFalso (noNotYes (transitivity (applyEquality (mapMaybe canonical) (equalityCommutative pr)) (transitivity (goPreservesCanonicalRight zero [] b) (transitivity (applyEquality (λ i mapMaybe canonical (go zero [] i)) (binNatToNZero b pr1)) refl)))) subtraction [] (zero :: b) pr | zero with pr1 = exFalso (noNotYes (transitivity (applyEquality (mapMaybe canonical) (equalityCommutative pr)) (transitivity (goPreservesCanonicalRight zero [] b) (transitivity (applyEquality (λ i mapMaybe canonical (go zero [] i)) (binNatToNZero b pr1)) refl))))
subtraction [] (zero :: b) pr | (succ bl) with pr1 rewrite pr | pr1 = succIsPositive _ subtraction [] (zero :: b) pr | (succ bl) with pr1 rewrite pr | pr1 = succIsPositive _
subtraction [] (one :: b) pr = succIsPositive _ subtraction [] (one :: b) pr = succIsPositive _
subtraction (zero :: a) (zero :: b) pr = lessRespectsMultiplicationLeft (binNatToN a) (binNatToN b) 2 u (le 1 refl) subtraction (zero :: a) (zero :: b) pr = lessRespectsMultiplicationLeft (binNatToN a) (binNatToN b) 2 u (le 1 refl)
where where
u : binNatToN a <N binNatToN b u : binNatToN a <N binNatToN b
u = subtraction a b (mapMaybePreservesNo pr) u = subtraction a b (mapMaybePreservesNo pr)
subtraction (zero :: a) (one :: b) pr with subtraction' a b (mapMaybePreservesNo pr) subtraction (zero :: a) (one :: b) pr with subtraction' a b (mapMaybePreservesNo pr)
subtraction (zero :: a) (one :: b) pr | inl x = subLemma2 (binNatToN a) (binNatToN b) x subtraction (zero :: a) (one :: b) pr | inl x = subLemma2 (binNatToN a) (binNatToN b) x
subtraction (zero :: a) (one :: b) pr | inr x rewrite x = le zero refl subtraction (zero :: a) (one :: b) pr | inr x rewrite x = le zero refl
subtraction (one :: a) (zero :: b) pr rewrite Semiring.sumZeroRight Semiring (binNatToN a) | Semiring.sumZeroRight Semiring (binNatToN b) = subLemma (binNatToN a) (binNatToN b) u subtraction (one :: a) (zero :: b) pr rewrite Semiring.sumZeroRight Semiring (binNatToN a) | Semiring.sumZeroRight Semiring (binNatToN b) = subLemma (binNatToN a) (binNatToN b) u
where where
u : binNatToN a <N binNatToN b u : binNatToN a <N binNatToN b
u = subtraction a b (mapMaybePreservesNo pr) u = subtraction a b (mapMaybePreservesNo pr)
subtraction (one :: a) (one :: b) pr = succPreservesInequality (lessRespectsMultiplicationLeft (binNatToN a) (binNatToN b) 2 u (le 1 refl)) subtraction (one :: a) (one :: b) pr = succPreservesInequality (lessRespectsMultiplicationLeft (binNatToN a) (binNatToN b) 2 u (le 1 refl))
where where
u : binNatToN a <N binNatToN b u : binNatToN a <N binNatToN b
u = subtraction a b (mapMaybePreservesNo pr) u = subtraction a b (mapMaybePreservesNo pr)
subLemma4 : (a b : BinNat) {t : BinNat} go one a b no go zero a b yes t canonical t [] subLemma4 : (a b : BinNat) {t : BinNat} go one a b no go zero a b yes t canonical t []
subLemma4 [] [] {t} pr1 pr2 rewrite yesInjective (equalityCommutative pr2) = refl subLemma4 [] [] {t} pr1 pr2 rewrite yesInjective (equalityCommutative pr2) = refl
subLemma4 [] (x :: b) {t} pr1 pr2 = goZeroEmpty' (x :: b) pr2 subLemma4 [] (x :: b) {t} pr1 pr2 = goZeroEmpty' (x :: b) pr2
subLemma4 (zero :: a) [] {t} pr1 pr2 with inspect (go one a []) subLemma4 (zero :: a) [] {t} pr1 pr2 with inspect (go one a [])
subLemma4 (zero :: a) [] {t} pr1 pr2 | no with pr3 with subLemma4 a [] pr3 (goEmpty a) subLemma4 (zero :: a) [] {t} pr1 pr2 | no with pr3 with subLemma4 a [] pr3 (goEmpty a)
... | bl with applyEquality canonical (yesInjective pr2) ... | bl with applyEquality canonical (yesInjective pr2)
... | th rewrite bl = equalityCommutative th ... | th rewrite bl = equalityCommutative th
subLemma4 (zero :: a) [] {t} pr1 pr2 | yes x with pr3 rewrite pr3 = exFalso (noNotYes (equalityCommutative pr1)) subLemma4 (zero :: a) [] {t} pr1 pr2 | yes x with pr3 rewrite pr3 = exFalso (noNotYes (equalityCommutative pr1))
subLemma4 (zero :: a) (zero :: b) {t} pr1 pr2 with inspect (go one a b) subLemma4 (zero :: a) (zero :: b) {t} pr1 pr2 with inspect (go one a b)
subLemma4 (zero :: a) (zero :: b) {t} pr1 pr2 | no with pr3 with inspect (go zero a b) subLemma4 (zero :: a) (zero :: b) {t} pr1 pr2 | no with pr3 with inspect (go zero a b)
subLemma4 (zero :: a) (zero :: b) {t} pr1 pr2 | no with pr3 | no with pr4 rewrite pr4 = exFalso (noNotYes pr2) subLemma4 (zero :: a) (zero :: b) {t} pr1 pr2 | no with pr3 | no with pr4 rewrite pr4 = exFalso (noNotYes pr2)
subLemma4 (zero :: a) (zero :: b) {t} pr1 pr2 | no with pr3 | yes x with pr4 with subLemma4 a b pr3 pr4 subLemma4 (zero :: a) (zero :: b) {t} pr1 pr2 | no with pr3 | yes x with pr4 with subLemma4 a b pr3 pr4
... | bl rewrite pr3 | pr4 = ans ... | bl rewrite pr3 | pr4 = ans
where where
ans : canonical t [] ans : canonical t []
ans rewrite equalityCommutative (applyEquality canonical (yesInjective pr2)) | bl = refl ans rewrite equalityCommutative (applyEquality canonical (yesInjective pr2)) | bl = refl
subLemma4 (zero :: a) (zero :: b) {t} pr1 pr2 | yes x with pr3 rewrite pr3 = exFalso (noNotYes (equalityCommutative pr1)) subLemma4 (zero :: a) (zero :: b) {t} pr1 pr2 | yes x with pr3 rewrite pr3 = exFalso (noNotYes (equalityCommutative pr1))
subLemma4 (zero :: a) (one :: b) {t} pr1 pr2 with go one a b subLemma4 (zero :: a) (one :: b) {t} pr1 pr2 with go one a b
... | no = exFalso (noNotYes pr2) ... | no = exFalso (noNotYes pr2)
subLemma4 (zero :: a) (one :: b) {t} pr1 pr2 | yes x = exFalso (noNotYes (equalityCommutative pr1)) subLemma4 (zero :: a) (one :: b) {t} pr1 pr2 | yes x = exFalso (noNotYes (equalityCommutative pr1))
subLemma4 (one :: a) (zero :: b) {t} pr1 pr2 with go zero a b subLemma4 (one :: a) (zero :: b) {t} pr1 pr2 with go zero a b
subLemma4 (one :: a) (zero :: b) {t} pr1 pr2 | no = exFalso (noNotYes pr2) subLemma4 (one :: a) (zero :: b) {t} pr1 pr2 | no = exFalso (noNotYes pr2)
subLemma4 (one :: a) (zero :: b) {t} pr1 pr2 | yes x = exFalso (noNotYes (equalityCommutative pr1)) subLemma4 (one :: a) (zero :: b) {t} pr1 pr2 | yes x = exFalso (noNotYes (equalityCommutative pr1))
subLemma4 (one :: a) (one :: b) {t} pr1 pr2 with inspect (go zero a b) subLemma4 (one :: a) (one :: b) {t} pr1 pr2 with inspect (go zero a b)
subLemma4 (one :: a) (one :: b) {t} pr1 pr2 | no with pr3 rewrite pr3 = exFalso (noNotYes pr2) subLemma4 (one :: a) (one :: b) {t} pr1 pr2 | no with pr3 rewrite pr3 = exFalso (noNotYes pr2)
subLemma4 (one :: a) (one :: b) {t} pr1 pr2 | yes x with pr3 with inspect (go one a b) subLemma4 (one :: a) (one :: b) {t} pr1 pr2 | yes x with pr3 with inspect (go one a b)
subLemma4 (one :: a) (one :: b) {t} pr1 pr2 | yes x with pr3 | no with pr4 with subLemma4 a b pr4 pr3 subLemma4 (one :: a) (one :: b) {t} pr1 pr2 | yes x with pr3 | no with pr4 with subLemma4 a b pr4 pr3
... | bl rewrite pr3 | pr4 | bl = ans ... | bl rewrite pr3 | pr4 | bl = ans
where where
ans : canonical t [] ans : canonical t []
ans rewrite equalityCommutative (applyEquality canonical (yesInjective pr2)) | bl = refl ans rewrite equalityCommutative (applyEquality canonical (yesInjective pr2)) | bl = refl
subLemma4 (one :: a) (one :: b) {t} pr1 pr2 | yes x with pr3 | yes x₁ with pr4 rewrite pr4 = exFalso (noNotYes (equalityCommutative pr1)) subLemma4 (one :: a) (one :: b) {t} pr1 pr2 | yes x with pr3 | yes x₁ with pr4 rewrite pr4 = exFalso (noNotYes (equalityCommutative pr1))
goOneFromZero : (a b : BinNat) go zero a b no go one a b no goOneFromZero : (a b : BinNat) go zero a b no go one a b no
goOneFromZero [] (zero :: b) pr = refl goOneFromZero [] (zero :: b) pr = refl
goOneFromZero [] (one :: b) pr = refl goOneFromZero [] (one :: b) pr = refl
goOneFromZero (zero :: a) (zero :: b) pr rewrite goOneFromZero a b (mapMaybePreservesNo pr) = refl goOneFromZero (zero :: a) (zero :: b) pr rewrite goOneFromZero a b (mapMaybePreservesNo pr) = refl
goOneFromZero (zero :: a) (one :: b) pr rewrite (mapMaybePreservesNo pr) = refl goOneFromZero (zero :: a) (one :: b) pr rewrite (mapMaybePreservesNo pr) = refl
goOneFromZero (one :: a) (zero :: b) pr rewrite (mapMaybePreservesNo pr) = refl goOneFromZero (one :: a) (zero :: b) pr rewrite (mapMaybePreservesNo pr) = refl
goOneFromZero (one :: a) (one :: b) pr rewrite goOneFromZero a b (mapMaybePreservesNo pr) = refl goOneFromZero (one :: a) (one :: b) pr rewrite goOneFromZero a b (mapMaybePreservesNo pr) = refl
subLemma5 : (a b : BinNat) mapMaybe canonical (go zero a b) yes [] go one a b no subLemma5 : (a b : BinNat) mapMaybe canonical (go zero a b) yes [] go one a b no
subLemma5 [] b pr = goOneEmpty' b subLemma5 [] b pr = goOneEmpty' b
subLemma5 (zero :: a) [] pr with inspect (canonical a) subLemma5 (zero :: a) [] pr with inspect (canonical a)
subLemma5 (zero :: a) [] pr | (z :: zs) with pr2 rewrite pr2 = exFalso (nonEmptyNotEmpty (yesInjective pr)) subLemma5 (zero :: a) [] pr | (z :: zs) with pr2 rewrite pr2 = exFalso (nonEmptyNotEmpty (yesInjective pr))
subLemma5 (zero :: a) [] pr | [] with pr2 rewrite pr2 = applyEquality (mapMaybe (one ::_)) (subLemma5 a [] (transitivity (applyEquality (mapMaybe canonical) (goEmpty a)) (applyEquality yes pr2))) subLemma5 (zero :: a) [] pr | [] with pr2 rewrite pr2 = applyEquality (mapMaybe (one ::_)) (subLemma5 a [] (transitivity (applyEquality (mapMaybe canonical) (goEmpty a)) (applyEquality yes pr2)))
subLemma5 (zero :: a) (zero :: b) pr with inspect (go zero a b) subLemma5 (zero :: a) (zero :: b) pr with inspect (go zero a b)
subLemma5 (zero :: a) (zero :: b) pr | no with pr2 rewrite pr2 = exFalso (noNotYes pr) subLemma5 (zero :: a) (zero :: b) pr | no with pr2 rewrite pr2 = exFalso (noNotYes pr)
subLemma5 (zero :: a) (zero :: b) pr | yes x with pr2 with inspect (canonical x) subLemma5 (zero :: a) (zero :: b) pr | yes x with pr2 with inspect (canonical x)
subLemma5 (zero :: a) (zero :: b) pr | yes x with pr2 | [] with pr3 rewrite pr | pr2 | pr3 = applyEquality (mapMaybe (one ::_)) (subLemma5 a b (transitivity (applyEquality (mapMaybe canonical) pr2) (applyEquality yes pr3))) subLemma5 (zero :: a) (zero :: b) pr | yes x with pr2 | [] with pr3 rewrite pr | pr2 | pr3 = applyEquality (mapMaybe (one ::_)) (subLemma5 a b (transitivity (applyEquality (mapMaybe canonical) pr2) (applyEquality yes pr3)))
subLemma5 (zero :: a) (zero :: b) pr | yes x with pr2 | (x₁ :: bl) with pr3 rewrite pr | pr2 | pr3 = exFalso (nonEmptyNotEmpty (yesInjective pr)) subLemma5 (zero :: a) (zero :: b) pr | yes x with pr2 | (x₁ :: bl) with pr3 rewrite pr | pr2 | pr3 = exFalso (nonEmptyNotEmpty (yesInjective pr))
subLemma5 (zero :: a) (one :: b) pr with (go one a b) subLemma5 (zero :: a) (one :: b) pr with (go one a b)
subLemma5 (zero :: a) (one :: b) pr | no = exFalso (noNotYes pr) subLemma5 (zero :: a) (one :: b) pr | no = exFalso (noNotYes pr)
subLemma5 (zero :: a) (one :: b) pr | yes y = exFalso (nonEmptyNotEmpty (yesInjective pr)) subLemma5 (zero :: a) (one :: b) pr | yes y = exFalso (nonEmptyNotEmpty (yesInjective pr))
subLemma5 (one :: a) (zero :: b) pr with go zero a b subLemma5 (one :: a) (zero :: b) pr with go zero a b
subLemma5 (one :: a) (zero :: b) pr | no = exFalso (noNotYes pr) subLemma5 (one :: a) (zero :: b) pr | no = exFalso (noNotYes pr)
subLemma5 (one :: a) (zero :: b) pr | yes x = exFalso (nonEmptyNotEmpty (yesInjective pr)) subLemma5 (one :: a) (zero :: b) pr | yes x = exFalso (nonEmptyNotEmpty (yesInjective pr))
subLemma5 (one :: a) (one :: b) pr with inspect (go zero a b) subLemma5 (one :: a) (one :: b) pr with inspect (go zero a b)
subLemma5 (one :: a) (one :: b) pr | yes x with pr2 with inspect (canonical x) subLemma5 (one :: a) (one :: b) pr | yes x with pr2 with inspect (canonical x)
subLemma5 (one :: a) (one :: b) pr | yes x with pr2 | [] with pr3 rewrite pr | pr2 | pr3 = applyEquality (mapMaybe (one ::_)) (subLemma5 a b (transitivity (applyEquality (mapMaybe canonical) pr2) (applyEquality yes pr3))) subLemma5 (one :: a) (one :: b) pr | yes x with pr2 | [] with pr3 rewrite pr | pr2 | pr3 = applyEquality (mapMaybe (one ::_)) (subLemma5 a b (transitivity (applyEquality (mapMaybe canonical) pr2) (applyEquality yes pr3)))
subLemma5 (one :: a) (one :: b) pr | yes x with pr2 | (x₁ :: y) with pr3 rewrite pr | pr2 | pr3 = exFalso (nonEmptyNotEmpty (yesInjective pr)) subLemma5 (one :: a) (one :: b) pr | yes x with pr2 | (x₁ :: y) with pr3 rewrite pr | pr2 | pr3 = exFalso (nonEmptyNotEmpty (yesInjective pr))
subLemma5 (one :: a) (one :: b) pr | no with pr2 rewrite pr2 = exFalso (noNotYes pr) subLemma5 (one :: a) (one :: b) pr | no with pr2 rewrite pr2 = exFalso (noNotYes pr)
subLemma3 : (a b : BinNat) go zero a b no (go zero (incr a) b no) || (mapMaybe canonical (go zero (incr a) b) yes []) subLemma3 : (a b : BinNat) go zero a b no (go zero (incr a) b no) || (mapMaybe canonical (go zero (incr a) b) yes [])
subLemma3 a b pr with inspect (go zero (incr a) b) subLemma3 a b pr with inspect (go zero (incr a) b)
subLemma3 a b pr | no with x = inl x subLemma3 a b pr | no with x = inl x
subLemma3 [] (zero :: b) pr | yes y with pr1 rewrite pr = exFalso (noNotYes pr1) subLemma3 [] (zero :: b) pr | yes y with pr1 rewrite pr = exFalso (noNotYes pr1)
subLemma3 [] (one :: b) pr | yes y with pr1 with inspect (go zero [] b) subLemma3 [] (one :: b) pr | yes y with pr1 with inspect (go zero [] b)
subLemma3 [] (one :: b) pr | yes y with pr1 | no with pr2 rewrite pr1 | pr2 = exFalso (noNotYes pr1) subLemma3 [] (one :: b) pr | yes y with pr1 | no with pr2 rewrite pr1 | pr2 = exFalso (noNotYes pr1)
subLemma3 [] (one :: b) pr | yes y with pr1 | yes x with pr2 with goZeroEmpty' b pr2 subLemma3 [] (one :: b) pr | yes y with pr1 | yes x with pr2 with goZeroEmpty' b pr2
... | f rewrite pr1 | pr2 | equalityCommutative (yesInjective pr1) | f = inr refl ... | f rewrite pr1 | pr2 | equalityCommutative (yesInjective pr1) | f = inr refl
subLemma3 (zero :: a) (zero :: b) pr | yes y with pr1 rewrite mapMaybePreservesNo pr = exFalso (noNotYes pr1) subLemma3 (zero :: a) (zero :: b) pr | yes y with pr1 rewrite mapMaybePreservesNo pr = exFalso (noNotYes pr1)
subLemma3 (zero :: a) (one :: b) pr | yes y with pr1 with inspect (go zero a b) subLemma3 (zero :: a) (one :: b) pr | yes y with pr1 with inspect (go zero a b)
subLemma3 (zero :: a) (one :: b) pr | yes y with pr1 | no with pr2 rewrite pr1 | pr2 = exFalso (noNotYes pr1) subLemma3 (zero :: a) (one :: b) pr | yes y with pr1 | no with pr2 rewrite pr1 | pr2 = exFalso (noNotYes pr1)
subLemma3 (zero :: a) (one :: b) pr | yes y with pr1 | yes x with pr2 with inspect (canonical x) subLemma3 (zero :: a) (one :: b) pr | yes y with pr1 | yes x with pr2 with inspect (canonical x)
... | [] with pr3 rewrite pr1 | pr2 | equalityCommutative (yesInjective pr1) | pr3 = inr refl ... | [] with pr3 rewrite pr1 | pr2 | equalityCommutative (yesInjective pr1) | pr3 = inr refl
... | (z :: zs) with pr3 with inspect (go one a b) ... | (z :: zs) with pr3 with inspect (go one a b)
subLemma3 (zero :: a) (one :: b) pr | yes y with pr1 | yes x with pr2 | (z :: zs) with pr3 | no with pr4 rewrite pr1 | pr2 | pr3 | pr4 = exFalso (nonEmptyNotEmpty (transitivity (equalityCommutative pr3) (subLemma4 a b pr4 pr2))) subLemma3 (zero :: a) (one :: b) pr | yes y with pr1 | yes x with pr2 | (z :: zs) with pr3 | no with pr4 rewrite pr1 | pr2 | pr3 | pr4 = exFalso (nonEmptyNotEmpty (transitivity (equalityCommutative pr3) (subLemma4 a b pr4 pr2)))
subLemma3 (zero :: a) (one :: b) pr | yes y with pr1 | yes x with pr2 | (z :: zs) with pr3 | yes x₁ with pr4 rewrite pr1 | pr2 | pr3 | pr4 = exFalso (noNotYes (equalityCommutative pr)) subLemma3 (zero :: a) (one :: b) pr | yes y with pr1 | yes x with pr2 | (z :: zs) with pr3 | yes x₁ with pr4 rewrite pr1 | pr2 | pr3 | pr4 = exFalso (noNotYes (equalityCommutative pr))
subLemma3 (one :: a) (zero :: b) pr | yes y with pr1 with subLemma3 a b (mapMaybePreservesNo pr) subLemma3 (one :: a) (zero :: b) pr | yes y with pr1 with subLemma3 a b (mapMaybePreservesNo pr)
subLemma3 (one :: a) (zero :: b) pr | yes y with pr1 | inl x rewrite x = inl refl subLemma3 (one :: a) (zero :: b) pr | yes y with pr1 | inl x rewrite x = inl refl
subLemma3 (one :: a) (zero :: b) pr | yes y with pr1 | inr x with inspect (go zero (incr a) b) subLemma3 (one :: a) (zero :: b) pr | yes y with pr1 | inr x with inspect (go zero (incr a) b)
... | no with pr2 rewrite pr1 | pr2 = exFalso (noNotYes x) ... | no with pr2 rewrite pr1 | pr2 = exFalso (noNotYes x)
... | yes z with pr2 rewrite pr1 | pr2 = inr (applyEquality yes (transitivity (transitivity (applyEquality canonical (yesInjective (equalityCommutative pr1))) r) (yesInjective x))) ... | yes z with pr2 rewrite pr1 | pr2 = inr (applyEquality yes (transitivity (transitivity (applyEquality canonical (yesInjective (equalityCommutative pr1))) r) (yesInjective x)))
where where
r : canonical (zero :: z) canonical z r : canonical (zero :: z) canonical z
r rewrite yesInjective x = refl r rewrite yesInjective x = refl
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 with subLemma3 a b (mapMaybePreservesNo pr) subLemma3 (one :: a) (one :: b) pr | yes y with pr1 with subLemma3 a b (mapMaybePreservesNo pr)
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inl x with inspect (go one (incr a) b) subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inl x with inspect (go one (incr a) b)
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inl th | no with pr2 rewrite pr2 = exFalso (noNotYes pr1) subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inl th | no with pr2 rewrite pr2 = exFalso (noNotYes pr1)
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inl th | yes x with pr2 with goOneFromZero (incr a) b th subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inl th | yes x with pr2 with goOneFromZero (incr a) b th
... | bad rewrite pr2 = exFalso (noNotYes (equalityCommutative bad)) ... | bad rewrite pr2 = exFalso (noNotYes (equalityCommutative bad))
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr x with inspect (go one (incr a) b) subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr x with inspect (go one (incr a) b)
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr x | no with pr2 rewrite pr2 = exFalso (noNotYes pr1) subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr x | no with pr2 rewrite pr2 = exFalso (noNotYes pr1)
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr th | yes z with pr2 with inspect (go zero (incr a) b) subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr th | yes z with pr2 with inspect (go zero (incr a) b)
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr th | yes z with pr2 | no with pr3 rewrite pr3 = exFalso (noNotYes th) subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr th | yes z with pr2 | no with pr3 rewrite pr3 = exFalso (noNotYes th)
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr th | yes z with pr2 | yes x with pr3 with inspect (go zero a b) subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr th | yes z with pr2 | yes x with pr3 with inspect (go zero a b)
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr th | yes z with pr2 | yes x with pr3 | no with pr4 rewrite pr1 | th | pr2 | pr3 | pr4 | equalityCommutative (yesInjective pr1) = exFalso false subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr th | yes z with pr2 | yes x with pr3 | no with pr4 rewrite pr1 | th | pr2 | pr3 | pr4 | equalityCommutative (yesInjective pr1) = exFalso false
where where
false : False false : False
false with applyEquality (mapMaybe canonical) pr3 false with applyEquality (mapMaybe canonical) pr3
... | f rewrite th | subLemma5 (incr a) b f = exFalso (noNotYes pr2) ... | f rewrite th | subLemma5 (incr a) b f = exFalso (noNotYes pr2)
subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr th | yes z with pr2 | yes x with pr3 | yes w with pr4 rewrite pr4 = exFalso (noNotYes (equalityCommutative pr)) subLemma3 (one :: a) (one :: b) pr | yes y with pr1 | inr th | yes z with pr2 | yes x with pr3 | yes w with pr4 rewrite pr4 = exFalso (noNotYes (equalityCommutative pr))
goIncrOne : (a b : BinNat) mapMaybe canonical (go one a b) mapMaybe canonical (go zero a (incr b)) goIncrOne : (a b : BinNat) mapMaybe canonical (go one a b) mapMaybe canonical (go zero a (incr b))
goIncrOne [] b rewrite goOneEmpty' b | goZeroIncr b = refl goIncrOne [] b rewrite goOneEmpty' b | goZeroIncr b = refl
goIncrOne (zero :: a) [] = refl goIncrOne (zero :: a) [] = refl
goIncrOne (zero :: a) (zero :: b) = refl goIncrOne (zero :: a) (zero :: b) = refl
goIncrOne (zero :: a) (one :: b) with inspect (go one a b) goIncrOne (zero :: a) (one :: b) with inspect (go one a b)
goIncrOne (zero :: a) (one :: b) | no with pr1 with inspect (go zero a (incr b)) goIncrOne (zero :: a) (one :: b) | no with pr1 with inspect (go zero a (incr b))
goIncrOne (zero :: a) (one :: b) | no with pr1 | no with pr2 rewrite pr1 | pr2 = refl goIncrOne (zero :: a) (one :: b) | no with pr1 | no with pr2 rewrite pr1 | pr2 = refl
goIncrOne (zero :: a) (one :: b) | no with pr1 | yes x with pr2 with goIncrOne a b goIncrOne (zero :: a) (one :: b) | no with pr1 | yes x with pr2 with goIncrOne a b
... | f rewrite pr1 | pr2 = exFalso (noNotYes f) ... | f rewrite pr1 | pr2 = exFalso (noNotYes f)
goIncrOne (zero :: a) (one :: b) | yes x with pr1 with inspect (go zero a (incr b)) goIncrOne (zero :: a) (one :: b) | yes x with pr1 with inspect (go zero a (incr b))
goIncrOne (zero :: a) (one :: b) | yes x with pr1 | no with pr2 with goIncrOne a b goIncrOne (zero :: a) (one :: b) | yes x with pr1 | no with pr2 with goIncrOne a b
... | f rewrite pr1 | pr2 = exFalso (noNotYes (equalityCommutative f)) ... | f rewrite pr1 | pr2 = exFalso (noNotYes (equalityCommutative f))
goIncrOne (zero :: a) (one :: b) | yes x with pr1 | yes y with pr2 with goIncrOne a b goIncrOne (zero :: a) (one :: b) | yes x with pr1 | yes y with pr2 with goIncrOne a b
... | f rewrite pr1 | pr2 | yesInjective f = refl ... | f rewrite pr1 | pr2 | yesInjective f = refl
goIncrOne (one :: a) [] rewrite goEmpty a = refl goIncrOne (one :: a) [] rewrite goEmpty a = refl
goIncrOne (one :: a) (zero :: b) = refl goIncrOne (one :: a) (zero :: b) = refl
goIncrOne (one :: a) (one :: b) with inspect (go one a b) goIncrOne (one :: a) (one :: b) with inspect (go one a b)
goIncrOne (one :: a) (one :: b) | no with pr with inspect (go zero a (incr b)) goIncrOne (one :: a) (one :: b) | no with pr with inspect (go zero a (incr b))
goIncrOne (one :: a) (one :: b) | no with pr | no with pr2 with goIncrOne a b goIncrOne (one :: a) (one :: b) | no with pr | no with pr2 with goIncrOne a b
... | f rewrite pr | pr2 = refl ... | f rewrite pr | pr2 = refl
goIncrOne (one :: a) (one :: b) | no with pr | yes x with pr2 with goIncrOne a b goIncrOne (one :: a) (one :: b) | no with pr | yes x with pr2 with goIncrOne a b
... | f rewrite pr | pr2 = exFalso (noNotYes f) ... | f rewrite pr | pr2 = exFalso (noNotYes f)
goIncrOne (one :: a) (one :: b) | yes x with pr with inspect (go zero a (incr b)) goIncrOne (one :: a) (one :: b) | yes x with pr with inspect (go zero a (incr b))
goIncrOne (one :: a) (one :: b) | yes x with pr | no with pr2 with goIncrOne a b goIncrOne (one :: a) (one :: b) | yes x with pr | no with pr2 with goIncrOne a b
... | f rewrite pr | pr2 = exFalso (noNotYes (equalityCommutative f)) ... | f rewrite pr | pr2 = exFalso (noNotYes (equalityCommutative f))
goIncrOne (one :: a) (one :: b) | yes x with pr | yes y with pr2 with goIncrOne a b goIncrOne (one :: a) (one :: b) | yes x with pr | yes y with pr2 with goIncrOne a b
... | f rewrite pr | pr2 | yesInjective f = refl ... | f rewrite pr | pr2 | yesInjective f = refl
goIncrIncr : (a b : BinNat) mapMaybe canonical (go zero (incr a) (incr b)) mapMaybe canonical (go zero a b) goIncrIncr : (a b : BinNat) mapMaybe canonical (go zero (incr a) (incr b)) mapMaybe canonical (go zero a b)
goIncrIncr [] [] = refl goIncrIncr [] [] = refl
goIncrIncr [] (zero :: b) with inspect (go zero [] b) goIncrIncr [] (zero :: b) with inspect (go zero [] b)
... | no with pr rewrite goIncrIncr [] b | pr = refl ... | no with pr rewrite goIncrIncr [] b | pr = refl
... | yes y with pr rewrite goIncrIncr [] b | pr | goZeroEmpty' b {y} pr = refl ... | yes y with pr rewrite goIncrIncr [] b | pr | goZeroEmpty' b {y} pr = refl
goIncrIncr [] (one :: b) rewrite goZeroIncr b = refl goIncrIncr [] (one :: b) rewrite goZeroIncr b = refl
goIncrIncr (zero :: a) [] rewrite goEmpty a = refl goIncrIncr (zero :: a) [] rewrite goEmpty a = refl
goIncrIncr (zero :: a) (zero :: b) = refl goIncrIncr (zero :: a) (zero :: b) = refl
goIncrIncr (zero :: a) (one :: b) with inspect (go zero a (incr b)) goIncrIncr (zero :: a) (one :: b) with inspect (go zero a (incr b))
goIncrIncr (zero :: a) (one :: b) | no with pr with inspect (go one a b) goIncrIncr (zero :: a) (one :: b) | no with pr with inspect (go one a b)
goIncrIncr (zero :: a) (one :: b) | no with pr | no with pr2 rewrite pr | pr2 = refl goIncrIncr (zero :: a) (one :: b) | no with pr | no with pr2 rewrite pr | pr2 = refl
goIncrIncr (zero :: a) (one :: b) | no with pr | yes x with pr2 with goIncrOne a b goIncrIncr (zero :: a) (one :: b) | no with pr | yes x with pr2 with goIncrOne a b
... | f rewrite pr | pr2 = exFalso (noNotYes (equalityCommutative f)) ... | f rewrite pr | pr2 = exFalso (noNotYes (equalityCommutative f))
goIncrIncr (zero :: a) (one :: b) | yes y with pr with inspect (go one a b) goIncrIncr (zero :: a) (one :: b) | yes y with pr with inspect (go one a b)
goIncrIncr (zero :: a) (one :: b) | yes y with pr | yes z with pr2 with goIncrOne a b goIncrIncr (zero :: a) (one :: b) | yes y with pr | yes z with pr2 with goIncrOne a b
... | f rewrite pr | pr2 = applyEquality (λ i yes (one :: i)) (equalityCommutative (yesInjective f)) ... | f rewrite pr | pr2 = applyEquality (λ i yes (one :: i)) (equalityCommutative (yesInjective f))
goIncrIncr (zero :: a) (one :: b) | yes y with pr | no with pr2 with goIncrOne a b goIncrIncr (zero :: a) (one :: b) | yes y with pr | no with pr2 with goIncrOne a b
... | f rewrite pr | pr2 = exFalso (noNotYes f) ... | f rewrite pr | pr2 = exFalso (noNotYes f)
goIncrIncr (one :: a) [] with goOne a [] goIncrIncr (one :: a) [] with goOne a []
... | f with go one (incr a) [] ... | f with go one (incr a) []
goIncrIncr (one :: a) [] | f | no rewrite goEmpty a = exFalso (noNotYes f) goIncrIncr (one :: a) [] | f | no rewrite goEmpty a = exFalso (noNotYes f)
goIncrIncr (one :: a) [] | f | yes x rewrite goEmpty a | yesInjective f = refl goIncrIncr (one :: a) [] | f | yes x rewrite goEmpty a | yesInjective f = refl
goIncrIncr (one :: a) (zero :: b) with goOne a b goIncrIncr (one :: a) (zero :: b) with goOne a b
... | f with go one (incr a) b ... | f with go one (incr a) b
goIncrIncr (one :: a) (zero :: b) | f | no with go zero a b goIncrIncr (one :: a) (zero :: b) | f | no with go zero a b
goIncrIncr (one :: a) (zero :: b) | f | no | no = refl goIncrIncr (one :: a) (zero :: b) | f | no | no = refl
goIncrIncr (one :: a) (zero :: b) | f | yes x with go zero a b goIncrIncr (one :: a) (zero :: b) | f | yes x with go zero a b
goIncrIncr (one :: a) (zero :: b) | f | yes x | yes x₁ rewrite yesInjective f = refl goIncrIncr (one :: a) (zero :: b) | f | yes x | yes x₁ rewrite yesInjective f = refl
goIncrIncr (one :: a) (one :: b) with goIncrIncr a b goIncrIncr (one :: a) (one :: b) with goIncrIncr a b
... | f with go zero a b ... | f with go zero a b
goIncrIncr (one :: a) (one :: b) | f | no with go zero (incr a) (incr b) goIncrIncr (one :: a) (one :: b) | f | no with go zero (incr a) (incr b)
goIncrIncr (one :: a) (one :: b) | f | no | no = refl goIncrIncr (one :: a) (one :: b) | f | no | no = refl
goIncrIncr (one :: a) (one :: b) | f | yes x with go zero (incr a) (incr b) goIncrIncr (one :: a) (one :: b) | f | yes x with go zero (incr a) (incr b)
goIncrIncr (one :: a) (one :: b) | f | yes x | yes x₁ rewrite yesInjective f = refl goIncrIncr (one :: a) (one :: b) | f | yes x | yes x₁ rewrite yesInjective f = refl
subtractionConverse : (a b : ) a <N b go zero (NToBinNat a) (NToBinNat b) no subtractionConverse : (a b : ) a <N b go zero (NToBinNat a) (NToBinNat b) no
subtractionConverse zero (succ b) a<b with NToBinNat b subtractionConverse zero (succ b) a<b with NToBinNat b
subtractionConverse zero (succ b) a<b | [] = refl subtractionConverse zero (succ b) a<b | [] = refl
subtractionConverse zero (succ b) a<b | zero :: bl = refl subtractionConverse zero (succ b) a<b | zero :: bl = refl
subtractionConverse zero (succ b) a<b | one :: bl = goZeroIncr bl subtractionConverse zero (succ b) a<b | one :: bl = goZeroIncr bl
subtractionConverse (succ a) (succ b) a<b with inspect (NToBinNat a) subtractionConverse (succ a) (succ b) a<b with inspect (NToBinNat a)
subtractionConverse (succ a) (succ b) a<b | [] with pr with inspect (NToBinNat b) subtractionConverse (succ a) (succ b) a<b | [] with pr with inspect (NToBinNat b)
subtractionConverse (succ a) (succ b) a<b | [] with pr | [] with pr2 rewrite NToBinNatZero a pr | NToBinNatZero b pr2 = exFalso (TotalOrder.irreflexive TotalOrder a<b) subtractionConverse (succ a) (succ b) a<b | [] with pr | [] with pr2 rewrite NToBinNatZero a pr | NToBinNatZero b pr2 = exFalso (TotalOrder.irreflexive TotalOrder a<b)
subtractionConverse (succ a) (succ zero) a<b | [] with pr | (zero :: y) with pr2 rewrite NToBinNatZero a pr | pr2 = exFalso (TotalOrder.irreflexive TotalOrder a<b) subtractionConverse (succ a) (succ zero) a<b | [] with pr | (zero :: y) with pr2 rewrite NToBinNatZero a pr | pr2 = exFalso (TotalOrder.irreflexive TotalOrder a<b)
subtractionConverse (succ a) (succ (succ b)) a<b | [] with pr | (zero :: y) with pr2 with inspect (go zero [] y) subtractionConverse (succ a) (succ (succ b)) a<b | [] with pr | (zero :: y) with pr2 with inspect (go zero [] y)
... | no with pr3 rewrite NToBinNatZero a pr | pr2 | pr3 = refl ... | no with pr3 rewrite NToBinNatZero a pr | pr2 | pr3 = refl
... | yes t with pr3 with applyEquality canonical pr2 ... | yes t with pr3 with applyEquality canonical pr2
... | g rewrite (goZeroEmpty y pr3) = exFalso (incrNonzero (NToBinNat b) g) ... | g rewrite (goZeroEmpty y pr3) = exFalso (incrNonzero (NToBinNat b) g)
subtractionConverse (succ a) (succ b) a<b | [] with pr | (one :: y) with pr2 rewrite NToBinNatZero a pr | pr2 = applyEquality (mapMaybe (one ::_)) (goZeroIncr y) subtractionConverse (succ a) (succ b) a<b | [] with pr | (one :: y) with pr2 rewrite NToBinNatZero a pr | pr2 = applyEquality (mapMaybe (one ::_)) (goZeroIncr y)
subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr with inspect (NToBinNat b) subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr with inspect (NToBinNat b)
subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | [] with pr2 rewrite NToBinNatZero b pr2 = exFalso (bad a<b) subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | [] with pr2 rewrite NToBinNatZero b pr2 = exFalso (bad a<b)
where where
bad : {a : } succ a <N 1 False bad : {a : } succ a <N 1 False
bad {zero} (le zero ()) bad {zero} (le zero ())
bad {zero} (le (succ x) ()) bad {zero} (le (succ x) ())
bad {succ a} (le zero ()) bad {succ a} (le zero ())
bad {succ a} (le (succ x) ()) bad {succ a} (le (succ x) ())
subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | (zero :: z) with pr2 rewrite pr | pr2 = applyEquality (mapMaybe (zero ::_)) (mapMaybePreservesNo u) subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | (zero :: z) with pr2 rewrite pr | pr2 = applyEquality (mapMaybe (zero ::_)) (mapMaybePreservesNo u)
where where
t : go zero (NToBinNat a) (NToBinNat b) no t : go zero (NToBinNat a) (NToBinNat b) no
t = subtractionConverse a b (canRemoveSuccFrom<N a<b) t = subtractionConverse a b (canRemoveSuccFrom<N a<b)
u : go zero (zero :: y) (zero :: z) no u : go zero (zero :: y) (zero :: z) no
u = transitivity (transitivity {x = _} {go zero (NToBinNat a) (zero :: z)} (applyEquality (λ i go zero i (zero :: z)) (equalityCommutative pr)) (applyEquality (go zero (NToBinNat a)) (equalityCommutative pr2))) t u = transitivity (transitivity {x = _} {go zero (NToBinNat a) (zero :: z)} (applyEquality (λ i go zero i (zero :: z)) (equalityCommutative pr)) (applyEquality (go zero (NToBinNat a)) (equalityCommutative pr2))) t
subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | (one :: z) with pr2 with subtractionConverse a (succ b) (le (succ (_<N_.x a<b)) (transitivity (applyEquality succ (transitivity (applyEquality succ (Semiring.commutative Semiring (_<N_.x a<b) a)) (Semiring.commutative Semiring (succ a) (_<N_.x a<b)))) (_<N_.proof a<b))) subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | (one :: z) with pr2 with subtractionConverse a (succ b) (le (succ (_<N_.x a<b)) (transitivity (applyEquality succ (transitivity (applyEquality succ (Semiring.commutative Semiring (_<N_.x a<b) a)) (Semiring.commutative Semiring (succ a) (_<N_.x a<b)))) (_<N_.proof a<b)))
subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | (one :: z) with pr2 | thing=no with subLemma3 (NToBinNat a) (incr (NToBinNat b)) thing=no subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | (one :: z) with pr2 | thing=no with subLemma3 (NToBinNat a) (incr (NToBinNat b)) thing=no
subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | (one :: z) with pr2 | thing=no | inl x = x subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | (one :: z) with pr2 | thing=no | inl x = x
subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | (one :: z) with pr2 | thing=no | inr x rewrite pr | pr2 | mapMaybePreservesNo thing=no = exFalso (noNotYes x) subtractionConverse (succ a) (succ b) a<b | (zero :: y) with pr | (one :: z) with pr2 | thing=no | inr x rewrite pr | pr2 | mapMaybePreservesNo thing=no = exFalso (noNotYes x)
subtractionConverse (succ a) (succ b) a<b | (one :: y) with pr with goIncrIncr (NToBinNat a) (NToBinNat b) subtractionConverse (succ a) (succ b) a<b | (one :: y) with pr with goIncrIncr (NToBinNat a) (NToBinNat b)
... | f rewrite subtractionConverse a b (canRemoveSuccFrom<N a<b) = mapMaybePreservesNo f ... | f rewrite subtractionConverse a b (canRemoveSuccFrom<N a<b) = mapMaybePreservesNo f
bad : (b : ) {t : BinNat} incr (NToBinNat b) zero :: t canonical t [] False bad : (b : ) {t : BinNat} incr (NToBinNat b) zero :: t canonical t [] False
bad b {c} t pr with applyEquality canonical t bad b {c} t pr with applyEquality canonical t
... | bl with canonical c ... | bl with canonical c
bad b {c} t pr | bl | [] = exFalso (incrNonzero (NToBinNat b) bl) bad b {c} t pr | bl | [] = exFalso (incrNonzero (NToBinNat b) bl)
lemma6 : (a : BinNat) (b : ) canonical a [] NToBinNat b one :: a a [] lemma6 : (a : BinNat) (b : ) canonical a [] NToBinNat b one :: a a []
lemma6 [] b pr1 pr2 = refl lemma6 [] b pr1 pr2 = refl
lemma6 (a :: as) b pr1 pr2 with applyEquality canonical pr2 lemma6 (a :: as) b pr1 pr2 with applyEquality canonical pr2
lemma6 (a :: as) b pr1 pr2 | th rewrite pr1 | equalityCommutative (NToBinNatIsCanonical b) | pr2 = exFalso (bad' th) lemma6 (a :: as) b pr1 pr2 | th rewrite pr1 | equalityCommutative (NToBinNatIsCanonical b) | pr2 = exFalso (bad' th)
where where
bad' : one :: a :: as one :: [] False bad' : one :: a :: as one :: [] False
bad' () bad' ()
doublingLemma : (y : BinNat) NToBinNat (2 *N binNatToN y) canonical (zero :: y) doublingLemma : (y : BinNat) NToBinNat (2 *N binNatToN y) canonical (zero :: y)
doublingLemma y with inspect (canonical y) doublingLemma y with inspect (canonical y)
@@ -409,58 +409,58 @@ private
doubling : (a : ) {y : BinNat} (NToBinNat a zero :: y) binNatToN y +N (binNatToN y +N 0) a doubling : (a : ) {y : BinNat} (NToBinNat a zero :: y) binNatToN y +N (binNatToN y +N 0) a
doubling a {y} pr = NToBinNatInj (binNatToN y +N (binNatToN y +N zero)) a (transitivity (transitivity (equalityCommutative (NToBinNatIsCanonical (binNatToN y +N (binNatToN y +N zero)))) (doublingLemma y)) (applyEquality canonical (equalityCommutative pr))) doubling a {y} pr = NToBinNatInj (binNatToN y +N (binNatToN y +N zero)) a (transitivity (transitivity (equalityCommutative (NToBinNatIsCanonical (binNatToN y +N (binNatToN y +N zero)))) (doublingLemma y)) (applyEquality canonical (equalityCommutative pr)))
subtraction2 : (a b : ) {t : BinNat} (NToBinNat a) -B (NToBinNat b) yes t (binNatToN t) +N b a subtraction2 : (a b : ) {t : BinNat} (NToBinNat a) -B (NToBinNat b) yes t (binNatToN t) +N b a
subtraction2 zero zero {t} pr rewrite yesInjective (equalityCommutative pr) = refl subtraction2 zero zero {t} pr rewrite yesInjective (equalityCommutative pr) = refl
subtraction2 zero (succ b) pr with goZeroEmpty (NToBinNat (succ b)) pr subtraction2 zero (succ b) pr with goZeroEmpty (NToBinNat (succ b)) pr
... | t = exFalso (incrNonzero (NToBinNat b) t) ... | t = exFalso (incrNonzero (NToBinNat b) t)
subtraction2 (succ a) b {t} pr with inspect (NToBinNat a) subtraction2 (succ a) b {t} pr with inspect (NToBinNat a)
subtraction2 (succ a) b {t} pr | [] with pr2 with inspect (NToBinNat b) subtraction2 (succ a) b {t} pr | [] with pr2 with inspect (NToBinNat b)
subtraction2 (succ a) b {t} pr | [] with pr2 | [] with pr3 rewrite pr2 | pr3 | equalityCommutative (yesInjective pr) | NToBinNatZero a pr2 | NToBinNatZero b pr3 = refl subtraction2 (succ a) b {t} pr | [] with pr2 | [] with pr3 rewrite pr2 | pr3 | equalityCommutative (yesInjective pr) | NToBinNatZero a pr2 | NToBinNatZero b pr3 = refl
subtraction2 (succ a) b {t} pr | [] with pr2 | (zero :: bl) with pr3 with inspect (go zero [] bl) subtraction2 (succ a) b {t} pr | [] with pr2 | (zero :: bl) with pr3 with inspect (go zero [] bl)
subtraction2 (succ a) b {t} pr | [] with pr2 | (zero :: bl) with pr3 | no with pr4 rewrite pr2 | pr3 | pr4 = exFalso (noNotYes pr) subtraction2 (succ a) b {t} pr | [] with pr2 | (zero :: bl) with pr3 | no with pr4 rewrite pr2 | pr3 | pr4 = exFalso (noNotYes pr)
subtraction2 (succ a) b {t} pr | [] with pr2 | (zero :: bl) with pr3 | yes x with pr4 with goZeroEmpty bl pr4 subtraction2 (succ a) b {t} pr | [] with pr2 | (zero :: bl) with pr3 | yes x with pr4 with goZeroEmpty bl pr4
subtraction2 (succ a) (succ b) {t} pr | [] with pr2 | (zero :: bl) with pr3 | yes x with pr4 | r with goZeroEmpty' bl pr4 subtraction2 (succ a) (succ b) {t} pr | [] with pr2 | (zero :: bl) with pr3 | yes x with pr4 | r with goZeroEmpty' bl pr4
... | s rewrite pr2 | pr3 | pr4 | r | equalityCommutative (yesInjective pr) | NToBinNatZero a pr2 = exFalso (bad b pr3 r) ... | s rewrite pr2 | pr3 | pr4 | r | equalityCommutative (yesInjective pr) | NToBinNatZero a pr2 = exFalso (bad b pr3 r)
subtraction2 (succ a) b {t} pr | [] with pr2 | (one :: bl) with pr3 with inspect (go zero [] bl) subtraction2 (succ a) b {t} pr | [] with pr2 | (one :: bl) with pr3 with inspect (go zero [] bl)
subtraction2 (succ a) b {t} pr | [] with pr2 | (one :: bl) with pr3 | no with pr4 rewrite pr2 | pr3 | pr4 = exFalso (noNotYes pr) subtraction2 (succ a) b {t} pr | [] with pr2 | (one :: bl) with pr3 | no with pr4 rewrite pr2 | pr3 | pr4 = exFalso (noNotYes pr)
subtraction2 (succ a) b {t} pr | [] with pr2 | (one :: bl) with pr3 | yes x with pr4 with goZeroEmpty bl pr4 subtraction2 (succ a) b {t} pr | [] with pr2 | (one :: bl) with pr3 | yes x with pr4 with goZeroEmpty bl pr4
... | u with goZeroEmpty' bl pr4 ... | u with goZeroEmpty' bl pr4
... | v rewrite pr2 | pr3 | pr4 | u | NToBinNatZero a pr2 | lemma6 bl b u pr3 | equalityCommutative (yesInjective pr4) | equalityCommutative (yesInjective pr) = ans pr3 ... | v rewrite pr2 | pr3 | pr4 | u | NToBinNatZero a pr2 | lemma6 bl b u pr3 | equalityCommutative (yesInjective pr4) | equalityCommutative (yesInjective pr) = ans pr3
where where
z : bl [] z : bl []
z = lemma6 bl b u pr3 z = lemma6 bl b u pr3
ans : (NToBinNat b one :: bl) b 1 ans : (NToBinNat b one :: bl) b 1
ans pr with applyEquality binNatToN pr ans pr with applyEquality binNatToN pr
... | th rewrite z = transitivity (equalityCommutative (nToN b)) th ... | th rewrite z = transitivity (equalityCommutative (nToN b)) th
subtraction2 (succ a) b pr | (x :: y) with pr2 with inspect (NToBinNat b) subtraction2 (succ a) b pr | (x :: y) with pr2 with inspect (NToBinNat b)
subtraction2 (succ a) b pr | (zero :: y) with pr2 | [] with pr3 rewrite NToBinNatZero b pr3 | pr2 | pr3 | equalityCommutative (yesInjective pr) = applyEquality succ (transitivity (Semiring.sumZeroRight Semiring _) (doubling a pr2)) subtraction2 (succ a) b pr | (zero :: y) with pr2 | [] with pr3 rewrite NToBinNatZero b pr3 | pr2 | pr3 | equalityCommutative (yesInjective pr) = applyEquality succ (transitivity (Semiring.sumZeroRight Semiring _) (doubling a pr2))
subtraction2 (succ a) b pr | (one :: y) with pr2 | [] with pr3 rewrite NToBinNatZero b pr3 | pr2 | pr3 | equalityCommutative (yesInjective pr) = transitivity (Semiring.sumZeroRight Semiring (binNatToN (incr y) +N (binNatToN (incr y) +N zero))) (equalityCommutative (transitivity (equalityCommutative (nToN (succ a))) (applyEquality binNatToN (transitivity (equalityCommutative (NToBinNatSucc a)) (applyEquality incr pr2))))) subtraction2 (succ a) b pr | (one :: y) with pr2 | [] with pr3 rewrite NToBinNatZero b pr3 | pr2 | pr3 | equalityCommutative (yesInjective pr) = transitivity (Semiring.sumZeroRight Semiring (binNatToN (incr y) +N (binNatToN (incr y) +N zero))) (equalityCommutative (transitivity (equalityCommutative (nToN (succ a))) (applyEquality binNatToN (transitivity (equalityCommutative (NToBinNatSucc a)) (applyEquality incr pr2)))))
subtraction2 (succ a) (succ b) {t} pr | (y :: ys) with pr2 | (z :: zs) with pr3 = transitivity (transitivity (Semiring.commutative Semiring (binNatToN t) (succ b)) (applyEquality succ (transitivity (Semiring.commutative Semiring b (binNatToN t)) (applyEquality (_+N b) (equalityCommutative (binNatToNIsCanonical t)))))) (applyEquality succ inter) subtraction2 (succ a) (succ b) {t} pr | (y :: ys) with pr2 | (z :: zs) with pr3 = transitivity (transitivity (Semiring.commutative Semiring (binNatToN t) (succ b)) (applyEquality succ (transitivity (Semiring.commutative Semiring b (binNatToN t)) (applyEquality (_+N b) (equalityCommutative (binNatToNIsCanonical t)))))) (applyEquality succ inter)
where where
inter : binNatToN (canonical t) +N b a inter : binNatToN (canonical t) +N b a
inter with inspect (go zero (NToBinNat a) (NToBinNat b)) inter with inspect (go zero (NToBinNat a) (NToBinNat b))
inter | no with pr4 with goIncrIncr (NToBinNat a) (NToBinNat b) inter | no with pr4 with goIncrIncr (NToBinNat a) (NToBinNat b)
... | f rewrite pr | pr4 = exFalso (noNotYes (equalityCommutative f)) ... | f rewrite pr | pr4 = exFalso (noNotYes (equalityCommutative f))
inter | yes x with pr4 with goIncrIncr (NToBinNat a) (NToBinNat b) inter | yes x with pr4 with goIncrIncr (NToBinNat a) (NToBinNat b)
... | f with subtraction2 a b {x} pr4 ... | f with subtraction2 a b {x} pr4
... | g = transitivity (applyEquality (_+N b) (transitivity (applyEquality binNatToN h) (binNatToNIsCanonical x))) g ... | g = transitivity (applyEquality (_+N b) (transitivity (applyEquality binNatToN h) (binNatToNIsCanonical x))) g
where where
h : (canonical t) (canonical x) h : (canonical t) (canonical x)
h rewrite pr | pr4 = yesInjective f h rewrite pr | pr4 = yesInjective f
subtraction2' : (a b : ) {t : BinNat} (NToBinNat a) -B (NToBinNat b) yes t b ≤N a subtraction2' : (a b : ) {t : BinNat} (NToBinNat a) -B (NToBinNat b) yes t b ≤N a
subtraction2' a b {t} pr with subtraction2 a b pr subtraction2' a b {t} pr with subtraction2 a b pr
... | f with binNatToN t ... | f with binNatToN t
subtraction2' a b {t} pr | f | zero = inr f subtraction2' a b {t} pr | f | zero = inr f
subtraction2' a b {t} pr | f | succ g = inl (le g f) subtraction2' a b {t} pr | f | succ g = inl (le g f)
subtraction2'' : (a b : ) (pr : b ≤N a) mapMaybe binNatToN ((NToBinNat a) -B (NToBinNat b)) yes (subtractionNResult.result (-N pr)) subtraction2'' : (a b : ) (pr : b ≤N a) mapMaybe binNatToN ((NToBinNat a) -B (NToBinNat b)) yes (subtractionNResult.result (-N pr))
subtraction2'' a b pr with -N pr subtraction2'' a b pr with -N pr
subtraction2'' a b pr | record { result = result ; pr = subPr } with inspect (go zero (NToBinNat a) (NToBinNat b)) subtraction2'' a b pr | record { result = result ; pr = subPr } with inspect (go zero (NToBinNat a) (NToBinNat b))
subtraction2'' a b (inl pr) | record { result = result ; pr = subPr } | no with pr2 with subtraction (NToBinNat a) (NToBinNat b) pr2 subtraction2'' a b (inl pr) | record { result = result ; pr = subPr } | no with pr2 with subtraction (NToBinNat a) (NToBinNat b) pr2
... | bl rewrite nToN a | nToN b = exFalso (TotalOrder.irreflexive TotalOrder (TotalOrder.<Transitive TotalOrder pr bl)) ... | bl rewrite nToN a | nToN b = exFalso (TotalOrder.irreflexive TotalOrder (TotalOrder.<Transitive TotalOrder pr bl))
subtraction2'' a b (inr pr) | record { result = result ; pr = subPr } | no with pr2 with subtraction (NToBinNat a) (NToBinNat b) pr2 subtraction2'' a b (inr pr) | record { result = result ; pr = subPr } | no with pr2 with subtraction (NToBinNat a) (NToBinNat b) pr2
... | bl rewrite nToN a | nToN b | pr = exFalso (TotalOrder.irreflexive TotalOrder bl) ... | bl rewrite nToN a | nToN b | pr = exFalso (TotalOrder.irreflexive TotalOrder bl)
subtraction2'' a b pr | record { result = result ; pr = subPr } | yes x with pr2 with subtraction2 a b pr2 subtraction2'' a b pr | record { result = result ; pr = subPr } | yes x with pr2 with subtraction2 a b pr2
... | f rewrite pr2 | Semiring.commutative Semiring (binNatToN x) b = applyEquality yes (canSubtractFromEqualityLeft {b} {binNatToN x} (transitivity f (equalityCommutative subPr))) ... | f rewrite pr2 | Semiring.commutative Semiring (binNatToN x) b = applyEquality yes (canSubtractFromEqualityLeft {b} {binNatToN x} (transitivity f (equalityCommutative subPr)))

View File

@@ -16,12 +16,6 @@ numbers<N : (N : ) → List
numbers<N zero = [] numbers<N zero = []
numbers<N (succ N) = N :: numbers<N N numbers<N (succ N) = N :: numbers<N N
filter' : {a b : _} {A : Set a} {f : A Set b} (decidable : (x : A) (f x) || (f x False)) List A List A
filter' {f} decid [] = []
filter' {f} decid (x :: xs) with decid x
filter' {f} decid (x :: xs) | inl fx = x :: filter' decid xs
filter' {f} decid (x :: xs) | inr Notfx = filter' decid xs
filtered : (N : ) List filtered : (N : ) List
filtered N = filter' (orDecidable (divisionDecidable 3) (divisionDecidable 5)) (numbers<N N) filtered N = filter' (orDecidable (divisionDecidable 3) (divisionDecidable 5)) (numbers<N N)
@@ -31,5 +25,5 @@ ans n = binNatToN (fold _+B_ (NToBinNat 0) (map NToBinNat (filtered n)))
t : ans 10 23 t : ans 10 23
t = refl t = refl
--q : ans 1000 0 -- takes about 15secs for me to reduce the term that fills this hole --q : ans 1000 {!233168!} -- takes about 15secs for me to reduce the term that fills this hole
--q = refl --q = refl

176
ProjectEuler/Problem2.agda Normal file
View File

@@ -0,0 +1,176 @@
{-# OPTIONS --warning=error --safe --guardedness --without-K #-}
open import LogicalFormulae
open import Agda.Primitive using (Level; lzero; lsuc; _⊔_)
open import Numbers.Naturals.Semiring
open import Numbers.Naturals.Naturals
open import Numbers.Naturals.Order
open import Numbers.Naturals.EuclideanAlgorithm
open import Lists.Lists
open import Numbers.Primes.PrimeNumbers
open import Decidable.Relations
open import Numbers.BinaryNaturals.Definition
open import Numbers.BinaryNaturals.Addition
open import Numbers.BinaryNaturals.Order
open import Sequences
open import Vectors
open import Orders.Total.Definition
open import Setoids.Orders.Partial.Definition
open import Setoids.Orders.Partial.Sequences
open import Setoids.Orders.Total.Definition
open import Setoids.Setoids
open import Functions.Definition
open import Semirings.Definition
module ProjectEuler.Problem2 where
fibUnary :
fibUnary zero = 1
fibUnary (succ zero) = 1
fibUnary (succ (succ n)) = fibUnary (succ n) +N fibUnary n
fibUnaryStrictlyPositive : (a : ) 0 <N fibUnary a
fibUnaryStrictlyPositive zero = le zero refl
fibUnaryStrictlyPositive (succ zero) = le zero refl
fibUnaryStrictlyPositive (succ (succ a)) = addStrongInequalities (fibUnaryStrictlyPositive (succ a)) (fibUnaryStrictlyPositive a)
fibUnaryIncreasing : (a : ) (fibUnary (succ a)) <N (fibUnary (succ (succ a)))
fibUnaryIncreasing zero = le zero refl
fibUnaryIncreasing (succ a) = identityOfIndiscernablesLeft _<N_ (additionPreservesInequalityOnLeft (fibUnary (succ a) +N fibUnary a) (fibUnaryStrictlyPositive (succ a))) (Semiring.sumZeroRight Semiring (fibUnary (succ a) +N fibUnary a))
fibUnaryBiggerThanN : (a : ) (succ (succ (succ (succ a)))) <N fibUnary (succ (succ (succ (succ a))))
fibUnaryBiggerThanN zero = le zero refl
fibUnaryBiggerThanN (succ a) = TotalOrder.<Transitive TotalOrder (succPreservesInequality (fibUnaryBiggerThanN a)) (ans ((fibUnary (succ a) +N fibUnary a) +N fibUnary (succ a)) ans')
where
ans : {t : } (u : ) 1 <N u succ t <N t +N u
ans {t} u (le x proof) rewrite Semiring.commutative Semiring x 1 = le x (transitivity (applyEquality succ (Semiring.commutative Semiring x (succ t))) (transitivity (applyEquality (λ i succ (succ i)) (Semiring.commutative Semiring t x)) (transitivity (applyEquality (_+N t) proof) (Semiring.commutative Semiring u t))))
ans' : 1 <N (fibUnary (succ a) +N fibUnary a) +N fibUnary (succ a)
ans' with fibUnaryStrictlyPositive (succ a)
... | fibPos with fibUnary (succ a)
ans' | fibPos | succ bl rewrite Semiring.commutative Semiring (bl +N fibUnary a) (succ bl) = succPreservesInequality (le (bl +N (bl +N fibUnary a)) (Semiring.sumZeroRight Semiring _))
fibUnaryArchimedean : (a : ) Sg (λ i a <N fibUnary i)
fibUnaryArchimedean zero = 0 , le zero refl
fibUnaryArchimedean (succ zero) = 2 , le zero refl
fibUnaryArchimedean (succ (succ zero)) = 3 , le zero refl
fibUnaryArchimedean (succ (succ (succ zero))) = 4 , le 1 refl
fibUnaryArchimedean (succ (succ (succ (succ a)))) = (succ (succ (succ (succ a)))) , fibUnaryBiggerThanN a
record FibEntry : Set where
field
prev : BinNat
curr : BinNat
nextFib : FibEntry FibEntry
nextFib record { prev = prev ; curr = curr } = record { prev = curr ; curr = prev +B curr }
fib : Sequence BinNat
fib = Sequences.map FibEntry.curr (unfold nextFib record { prev = NToBinNat 0 ; curr = NToBinNat 1 })
fibMove : (n : ) FibEntry.prev (index (unfold nextFib (record { prev = [] ; curr = one :: [] })) (succ n)) FibEntry.curr (index (unfold nextFib (record { prev = [] ; curr = one :: [] })) n)
fibMove zero = refl
fibMove (succ n) rewrite indexAndUnfold nextFib (record { prev = [] ; curr = one :: [] }) (succ n) = refl
fibAlternative : (N : ) index fib N FibEntry.curr (index (unfold nextFib (record { prev = [] ; curr = one :: [] })) N)
fibAlternative n rewrite equalityCommutative (mapAndIndex (unfold nextFib record { prev = NToBinNat 0 ; curr = NToBinNat 1 }) FibEntry.curr n) = refl
fibAlternative' : (n : ) FibEntry.curr (index (unfold nextFib (record { prev = [] ; curr = one :: [] })) (succ n)) FibEntry.prev (index (unfold nextFib (record { prev = [] ; curr = one :: [] })) n) +B FibEntry.curr (index (unfold nextFib (record { prev = [] ; curr = one :: [] })) n)
fibAlternative' zero = refl
fibAlternative' (succ n) rewrite indexAndUnfold nextFib (record { prev = [] ; curr = one :: [] }) (succ n) = refl
fibsCanonical : (n : ) canonical (index fib n) index fib n
fibsCanonical zero = refl
fibsCanonical (succ zero) = refl
fibsCanonical (succ (succ n)) = transitivity (applyEquality canonical {index fib (succ (succ n))} {FibEntry.prev (index (unfold nextFib (nextFib (record { prev = [] ; curr = one :: [] }))) n) +B FibEntry.curr (index (unfold nextFib (nextFib (record { prev = [] ; curr = one :: [] }))) n)} (transitivity (fibAlternative (succ (succ n))) (fibAlternative' (succ n)))) (transitivity (sumCanonical (FibEntry.prev (index (unfold nextFib (nextFib (record { prev = [] ; curr = one :: [] }))) n)) (FibEntry.curr (index (unfold nextFib (nextFib (record { prev = [] ; curr = one :: [] }))) n)) (transitivity (transitivity (applyEquality canonical (fibMove n)) (transitivity (applyEquality canonical (equalityCommutative (fibAlternative n))) (transitivity (fibsCanonical n) (fibAlternative n)))) (equalityCommutative (fibMove n))) (transitivity (applyEquality canonical (mapAndIndex (unfold nextFib (nextFib (record { prev = [] ; curr = one :: [] }))) FibEntry.curr n)) (transitivity (fibsCanonical (succ n)) (equalityCommutative (mapAndIndex (unfold nextFib (nextFib (record { prev = [] ; curr = one :: [] }))) FibEntry.curr n))))) (equalityCommutative (transitivity (fibAlternative (succ (succ n))) (fibAlternative' (succ n)))))
fibStart : take 5 fib vecMap NToBinNat (1 ,- 1 ,- 2 ,- 3 ,- 5 ,- [])
fibStart = refl
fibsMatch : (n : ) binNatToN (index fib n) fibUnary n
fibsMatch zero = refl
fibsMatch (succ zero) = refl
fibsMatch (succ (succ n)) rewrite equalityCommutative (fibsMatch (succ n)) | equalityCommutative (fibsMatch n) | equalityCommutative (mapAndIndex (unfold nextFib record { prev = NToBinNat 0 ; curr = NToBinNat 1 }) FibEntry.curr (succ (succ n))) | indexAndUnfold nextFib (record { prev = [] ; curr = one :: [] }) (succ n) | equalityCommutative (mapAndIndex (unfold nextFib (nextFib (record { prev = [] ; curr = one :: [] }))) FibEntry.curr n) | equalityCommutative (mapAndIndex (unfold nextFib (record { prev = [] ; curr = one :: [] })) FibEntry.curr n) | indexAndUnfold nextFib (nextFib (record { prev = [] ; curr = one :: [] })) n | indexAndUnfold nextFib (record { prev = [] ; curr = one :: [] }) n = ans
where
x = FibEntry.curr (index (unfold nextFib (record { prev = [] ; curr = one :: [] })) n)
y = FibEntry.prev (index (unfold nextFib (record { prev = [] ; curr = one :: [] })) n)
ans : binNatToN (x +B (y +B x)) binNatToN (y +B x) +N binNatToN x
ans rewrite +BCommutative x (y +B x) = +BIsHom (y +B x) x
fibsMatch' : (n : ) NToBinNat (fibUnary n) index fib n
fibsMatch' n = transitivity (applyEquality NToBinNat (equalityCommutative (fibsMatch n))) (transitivity (binToBin (index fib n)) (fibsCanonical n))
ArchimedeanSequence : {a b c : _} {A : Set a} {S : Setoid {a} {b} A} {_<_ : Rel {a} {c} A} (pOrder : SetoidPartialOrder S _<_) (S : Sequence A) Set (a c)
ArchimedeanSequence {A = A} {_<_ = _<_} _ S = (x : A) Sg (λ n x < (index S n))
archimImpliesTailArchim : {a b c : _} {A : Set a} {S : Setoid {a} {b} A} {_<_ : Rel {a} {c} A} (pOrder : SetoidPartialOrder S _<_) {S : Sequence A} ArchimedeanSequence pOrder S (Sg (λ i index S 0 < index S i)) ArchimedeanSequence pOrder (Sequence.tail S)
archimImpliesTailArchim {S} pOrder arch 0small x with arch x
archimImpliesTailArchim pOrder {S} arch (zero , S0<SN) x | zero , pr = exFalso (SetoidPartialOrder.irreflexive pOrder S0<SN)
archimImpliesTailArchim pOrder {S} arch (succ N , S0<SN) x | zero , pr = N , SetoidPartialOrder.<Transitive pOrder pr S0<SN
archimImpliesTailArchim pOrder arch 0small x | succ N , pr = N , pr
takeUpTo : {a b c : _} {A : Set a} {S : Setoid {a} {b} A} {_<_ : Rel {a} {c} A} {pOrder : SetoidPartialOrder S _<_} {seq : Sequence A} (arch : ArchimedeanSequence pOrder seq) (lim : A) List A
takeUpTo {seq = S} arch lim with arch lim
takeUpTo {seq = S} arch lim | zero , pr = []
takeUpTo {seq = S} arch lim | succ N , pr = vecToList (take N S)
archim : ArchimedeanSequence (partialOrderToSetoidPartialOrder BinNatOrder) fib
archim x with fibUnaryArchimedean (binNatToN x)
archim x | N , pr = N , u
where
t : (canonical x) <B (NToBinNat (binNatToN (index (Sequences.map FibEntry.curr (unfold nextFib (record { prev = [] ; curr = one :: [] }))) N)))
t rewrite (fibsMatch N) = identityOfIndiscernablesLeft _<B_ (translate' _ _ pr) (binToBin x)
u : x <B (index (Sequences.map FibEntry.curr (unfold nextFib (record { prev = [] ; curr = one :: [] }))) N)
u rewrite equalityCommutative (mapAndIndex (unfold nextFib (record { prev = [] ; curr = one :: [] })) FibEntry.curr N) with transitivity (canonicalFirst x (NToBinNat (fibUnary N)) Equal) (identityOfIndiscernablesLeft _<B_ (translate' (binNatToN x) (fibUnary N) pr) (binToBin x))
... | r = identityOfIndiscernablesRight {a = x} {b = NToBinNat (fibUnary N)} {c = FibEntry.curr (index (unfold nextFib (record { prev = [] ; curr = one :: [] })) N)} _<B_ r (transitivity (fibsMatch' N) (fibAlternative N))
isEven : BinNat Set
isEven [] = True
isEven (zero :: xs) = True
isEven (one :: xs) = False
isEvenAgrees : (n : BinNat) isEven n 2 (binNatToN n)
isEvenAgrees [] nEven = divides (record { quot = zero ; rem = zero ; pr = refl ; remIsSmall = inl (le 1 refl) ; quotSmall = inl (le 1 refl)}) refl
isEvenAgrees (zero :: n) nEven = divides (record { quot = binNatToN n ; rem = zero ; pr = Semiring.sumZeroRight Semiring _ ; remIsSmall = inl (le 1 refl) ; quotSmall = inl (le 1 refl) }) refl
isEvenIncrs : (n : BinNat) isEven n isEven (incr (incr n))
isEvenIncrs [] nEven = record {}
isEvenIncrs (zero :: n) nEven = record {}
isEvenAgrees' : (n : ) 2 n isEven (NToBinNat n)
isEvenAgrees' zero nEven = record {}
isEvenAgrees' (succ zero) (divides record { quot = (succ zero) ; rem = zero ; pr = () ; remIsSmall = remIsSmall ; quotSmall = (inl x) } refl)
isEvenAgrees' (succ zero) (divides record { quot = (succ (succ quot)) ; rem = zero ; pr = () ; remIsSmall = remIsSmall ; quotSmall = (inl x) } refl)
isEvenAgrees' (succ (succ n)) (divides record { quot = succ quot ; rem = zero ; pr = pr ; remIsSmall = remIsSmall ; quotSmall = inl 0<2 } refl) with isEvenAgrees' n (divides record { quot = quot ; rem = zero ; pr = transitivity (transitivity (Semiring.sumZeroRight Semiring _) (Semiring.commutative Semiring quot (quot +N 0))) (succInjective (succInjective (transitivity (equalityCommutative (applyEquality succ (transitivity (Semiring.sumZeroRight Semiring (quot +N succ (quot +N zero))) (Semiring.commutative Semiring quot (succ (quot +N 0)))))) pr))) ; remIsSmall = remIsSmall ; quotSmall = inl 0<2 } refl)
... | bl = isEvenIncrs (NToBinNat n) bl
isEvenWellDefined : (n m : BinNat) canonical n canonical m isEven n isEven m
isEvenWellDefined [] [] n=m nEven = record {}
isEvenWellDefined [] (zero :: m) n=m nEven = record {}
isEvenWellDefined (zero :: n) [] n=m nEven = record {}
isEvenWellDefined (zero :: n) (zero :: m) n=m nEven = record {}
isEvenWellDefined (zero :: n) (one :: m) n=m nEven with canonical n
isEvenWellDefined (zero :: n) (one :: m) () nEven | []
isEvenWellDefined (zero :: n) (one :: m) () nEven | x :: bl
isEvenDecidable : DecidableRelation isEven
isEvenDecidable [] = inl (record {})
isEvenDecidable (zero :: x₁) = inl (record {})
isEvenDecidable (one :: x₁) = inr (λ x x)
increasing : StrictlyIncreasing (partialOrderToSetoidPartialOrder BinNatOrder) (Sequence.tail fib)
increasing m = SetoidPartialOrder.<WellDefined (partialOrderToSetoidPartialOrder BinNatOrder) (fibsMatch' (succ m)) (fibsMatch' (succ (succ m))) (translate' (fibUnary (succ m)) (fibUnary (succ (succ m))) (fibUnaryIncreasing m))
-- increasingNaturalsBound : (S : Sequence ) → StrictlyIncreasing S → (bound : ) → List
-- increasingNaturalsBound s n = {!!}
{-
fibsLessThan4Mil : List BinNat
fibsLessThan4Mil = takeUpToMonotone {tOrder = BinNatTOrder} (archimImpliesTailArchim {tOrder = BinNatTOrder} archim (2 , ordersAgree 1 2 (le zero refl))) increasing (one :: one :: one :: one :: zero :: one :: zero :: zero :: zero :: zero :: one :: zero :: zero :: one :: zero :: zero :: zero :: zero :: zero :: zero :: zero :: one :: [])
evens : List BinNat
evens = filter' isEvenDecidable fibsLessThan4Mil
ans : BinNat
ans = fold _+B_ [] evens
-}

View File

@@ -83,3 +83,11 @@ Sequence.tail (subsequence x selector increasing) = subsequence (tailFrom (succ
take : {a : _} {A : Set a} (n : ) (s : Sequence A) Vec A n take : {a : _} {A : Set a} (n : ) (s : Sequence A) Vec A n
take zero s = [] take zero s = []
take (succ n) s = Sequence.head s ,- take n (Sequence.tail s) take (succ n) s = Sequence.head s ,- take n (Sequence.tail s)
unfold : {a : _} {A : Set a} (A A) A Sequence A
Sequence.head (unfold f a) = a
Sequence.tail (unfold f a) = unfold f (f a)
indexAndUnfold : {a : _} {A : Set a} (f : A A) (start : A) (n : ) index (unfold f start) (succ n) f (index (unfold f start) n)
indexAndUnfold f s zero = refl
indexAndUnfold f s (succ n) = indexAndUnfold f (f s) n

View File

@@ -6,7 +6,7 @@ open import LogicalFormulae
open import Orders.Total.Definition open import Orders.Total.Definition
open import Orders.Partial.Definition open import Orders.Partial.Definition
open import Setoids.Setoids open import Setoids.Setoids
open import Functions open import Functions.Definition
open import Sequences open import Sequences
open import Setoids.Orders.Partial.Definition open import Setoids.Orders.Partial.Definition

View File

@@ -14,6 +14,8 @@ data Vec {a : _} (X : Set a) : -> Set a where
[] : Vec X zero [] : Vec X zero
_,-_ : {n : } -> X -> Vec X n -> Vec X (succ n) _,-_ : {n : } -> X -> Vec X n -> Vec X (succ n)
infixr 10 _,-_
vecLen : {a : _} {X : Set a} {n : } Vec X n vecLen : {a : _} {X : Set a} {n : } Vec X n
vecLen {a} {X} {n} v = n vecLen {a} {X} {n} v = n