@@ -1,6 +1,6 @@
{- # OPTIONS - - warning=error - - safe - - without - K # -}
open import WellFoundedInduction
open import Orders. WellFounded. Induction
open import LogicalFormulae
open import Functions
open import Lists.Lists
@@ -9,7 +9,7 @@ open import Numbers.Naturals.Order.Lemmas
open import Numbers.Naturals.Semiring
open import Groups.Definition
open import Numbers.BinaryNaturals.Definition
open import Orders
open import Orders.Total.Definition
open import Semirings.Definition
module Numbers.BinaryNaturals.Order where
@@ -288,25 +288,25 @@ module Numbers.BinaryNaturals.Order where
chopDouble a b i with TotalOrder.totality ℕ TotalOrder ( binNatToN a) ( binNatToN b)
chopDouble a b zero | inl ( inl a<b) with TotalOrder.totality ℕ TotalOrder ( 2 *N binNatToN a) ( 2 *N binNatToN b)
chopDouble a b zero | inl ( inl a<b) | inl ( inl x) = refl
chopDouble a b zero | inl ( inl a<b) | inl ( inr b<a) = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) b<a ( lessRespectsMultiplicationLeft ( binNatToN a) ( binNatToN b) 2 a<b ( le 1 refl) ) ) )
chopDouble a b zero | inl ( inl a<b) | inr a=b rewrite productCancelsLeft 2 ( binNatToN a) ( binNatToN b) ( le 1 refl) a=b = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) a<b)
chopDouble a b zero | inl ( inl a<b) | inl ( inr b<a) = exFalso ( Tot alOrder.irreflexive ℕ TotalOrder ( Tot alOrder.<Transitive ℕ TotalOrder b<a ( lessRespectsMultiplicationLeft ( binNatToN a) ( binNatToN b) 2 a<b ( le 1 refl) ) ) )
chopDouble a b zero | inl ( inl a<b) | inr a=b rewrite productCancelsLeft 2 ( binNatToN a) ( binNatToN b) ( le 1 refl) a=b = exFalso ( Tot alOrder.irreflexive ℕ TotalOrder a<b)
chopDouble a b one | inl ( inl a<b) with TotalOrder.totality ℕ TotalOrder ( 2 *N binNatToN a) ( 2 *N binNatToN b)
chopDouble a b one | inl ( inl a<b) | inl ( inl 2 a<2b) = refl
chopDouble a b one | inl ( inl a<b) | inl ( inr 2 b<2a) = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) a<b ( cancelInequalityLeft { 2 } 2 b<2a) ) )
chopDouble a b one | inl ( inl a<b) | inr 2 a=2b rewrite productCancelsLeft 2 ( binNatToN a) ( binNatToN b) ( le 1 refl) 2 a=2b = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) a<b)
chopDouble a b one | inl ( inl a<b) | inl ( inr 2 b<2a) = exFalso ( Tot alOrder.irreflexive ℕ TotalOrder ( Tot alOrder.<Transitive ( ℕ TotalOrder) a<b ( cancelInequalityLeft { 2 } 2 b<2a) ) )
chopDouble a b one | inl ( inl a<b) | inr 2 a=2b rewrite productCancelsLeft 2 ( binNatToN a) ( binNatToN b) ( le 1 refl) 2 a=2b = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) a<b)
chopDouble a b zero | inl ( inr b<a) with TotalOrder.totality ℕ TotalOrder ( 2 *N binNatToN a) ( 2 *N binNatToN b)
chopDouble a b zero | inl ( inr b<a) | inl ( inl 2 a<2b) = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) b<a ( cancelInequalityLeft { 2 } { binNatToN a} { binNatToN b} 2 a<2b) ) )
chopDouble a b zero | inl ( inr b<a) | inl ( inl 2 a<2b) = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) ( Tot alOrder.<Transitive ( ℕ TotalOrder) b<a ( cancelInequalityLeft { 2 } { binNatToN a} { binNatToN b} 2 a<2b) ) )
chopDouble a b zero | inl ( inr b<a) | inl ( inr 2 b<2a) = refl
chopDouble a b zero | inl ( inr b<a) | inr 2 a=2b rewrite productCancelsLeft 2 ( binNatToN a) ( binNatToN b) ( le 1 refl) 2 a=2b = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) b<a)
chopDouble a b zero | inl ( inr b<a) | inr 2 a=2b rewrite productCancelsLeft 2 ( binNatToN a) ( binNatToN b) ( le 1 refl) 2 a=2b = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) b<a)
chopDouble a b one | inl ( inr b<a) with TotalOrder.totality ℕ TotalOrder ( 2 *N binNatToN a) ( 2 *N binNatToN b)
chopDouble a b one | inl ( inr b<a) | inl ( inl 2 a<2b) = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) b<a ( cancelInequalityLeft { 2 } 2 a<2b) ) )
chopDouble a b one | inl ( inr b<a) | inl ( inl 2 a<2b) = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) ( Tot alOrder.<Transitive ( ℕ TotalOrder) b<a ( cancelInequalityLeft { 2 } 2 a<2b) ) )
chopDouble a b one | inl ( inr b<a) | inl ( inr x) = refl
chopDouble a b one | inl ( inr b<a) | inr 2 a=2b rewrite productCancelsLeft 2 ( binNatToN a) ( binNatToN b) ( le 1 refl) 2 a=2b = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) b<a)
chopDouble a b one | inl ( inr b<a) | inr 2 a=2b rewrite productCancelsLeft 2 ( binNatToN a) ( binNatToN b) ( le 1 refl) 2 a=2b = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) b<a)
chopDouble a b i | inr x with TotalOrder.totality ℕ TotalOrder ( binNatToN ( i : : a) ) ( binNatToN ( i : : b) )
chopDouble a b zero | inr a=b | inl ( inl a<b) rewrite a=b = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) a<b)
chopDouble a b one | inr a=b | inl ( inl a<b) rewrite a=b = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) a<b)
chopDouble a b zero | inr a=b | inl ( inr b<a) rewrite a=b = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) b<a)
chopDouble a b one | inr a=b | inl ( inr b<a) rewrite a=b = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) b<a)
chopDouble a b zero | inr a=b | inl ( inl a<b) rewrite a=b = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) a<b)
chopDouble a b one | inr a=b | inl ( inl a<b) rewrite a=b = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) a<b)
chopDouble a b zero | inr a=b | inl ( inr b<a) rewrite a=b = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) b<a)
chopDouble a b one | inr a=b | inl ( inr b<a) rewrite a=b = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) b<a)
chopDouble a b i | inr a=b | inr x = refl
succNotLess : { n : ℕ } → succ n <N n → False
@@ -315,12 +315,12 @@ module Numbers.BinaryNaturals.Order where
<BIsInherited : ( a b : BinNat) → a <BInherited b ≡ a <B b
<BIsInherited [] b with TotalOrder.totality ℕ TotalOrder 0 ( 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 ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) x)
<BIsInherited [] b | inl ( inl x) | 0 with ≡ pr rewrite binNatToNZero b pr | pr = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) x)
<BIsInherited [] b | inl ( inl x) | ( succ bl) with ≡ pr rewrite pr = equalityCommutative ( zeroLess b λ p → zeroNotSucc bl b p pr)
<BIsInherited [] b | inr 0 = b rewrite canonicalSecond [] b Equal | binNatToNZero b ( equalityCommutative 0 = b) = refl
<BIsInherited ( a : : as) [] with TotalOrder.totality ℕ TotalOrder ( binNatToN ( a : : as) ) 0
<BIsInherited ( a : : as) [] | inl ( inr x) with inspect ( binNatToN ( a : : as) )
<BIsInherited ( a : : as) [] | inl ( inr x) | zero with ≡ pr rewrite binNatToNZero ( a : : as) pr | pr = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) x)
<BIsInherited ( a : : as) [] | inl ( inr x) | zero with ≡ pr rewrite binNatToNZero ( a : : as) pr | pr = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) x)
<BIsInherited ( a : : as) [] | inl ( inr x) | succ y with ≡ pr rewrite pr = equalityCommutative ( zeroLess' ( a : : as) λ i → zeroNotSucc y ( a : : as) i pr)
<BIsInherited ( a : : as) [] | inr x rewrite canonicalFirst ( a : : as) [] Equal | binNatToNZero ( a : : as) x = refl
<BIsInherited ( zero : : a) ( zero : : b) = transitivity ( chopDouble a b zero) ( <BIsInherited a b)
@@ -331,21 +331,21 @@ module Numbers.BinaryNaturals.Order where
t : a <BInherited b ≡ FirstLess
t with TotalOrder.totality ℕ TotalOrder ( binNatToN a) ( binNatToN b)
t | inl ( inl x) = refl
t | inl ( inr x) = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) x a<b) )
t | inr x rewrite x = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) a<b)
t | inl ( inr x) = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) ( Tot alOrder.<Transitive ( ℕ TotalOrder) x a<b) )
t | inr x rewrite x = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) a<b)
indHyp : FirstLess ≡ go<B Equal a b
indHyp = transitivity ( equalityCommutative t) ( <BIsInherited a b)
<BIsInherited ( zero : : a) ( one : : b) | inl ( inl 2 a<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) ) 2 a<2b+1)
<BIsInherited ( zero : : a) ( one : : b) | inl ( inl 2 a<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 ( inr 2 b+1<2a) with TotalOrder.totality ℕ TotalOrder ( binNatToN a) ( binNatToN b)
<BIsInherited ( zero : : a) ( one : : b) | inl ( inr 2 b+1<2a) | inl ( inl a<b) = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) 2 b+1<2a ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) ( lessRespectsMultiplicationLeft ( binNatToN a) ( binNatToN b) 2 a<b ( le 1 refl) ) ( le zero refl) ) ) )
<BIsInherited ( zero : : a) ( one : : b) | inl ( inr 2 b+1<2a) | inl ( inl a<b) = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) ( Tot alOrder.<Transitive ( ℕ TotalOrder) 2 b+1<2a ( Tot alOrder.<Transitive ( ℕ TotalOrder) ( lessRespectsMultiplicationLeft ( binNatToN a) ( binNatToN b) 2 a<b ( le 1 refl) ) ( le zero refl) ) ) )
<BIsInherited ( zero : : a) ( one : : b) | inl ( inr 2 b+1<2a) | inl ( inr b<a) = equalityCommutative ( equalToFirstGreater FirstLess a b ( equalityCommutative indHyp) )
where
t : a <BInherited b ≡ FirstGreater
t with TotalOrder.totality ℕ TotalOrder ( binNatToN a) ( binNatToN b)
t | inl ( inl x) = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) x b<a) )
t | inl ( inl x) = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) ( Tot alOrder.<Transitive ( ℕ TotalOrder) x b<a) )
t | inl ( inr x) = refl
t | inr x rewrite x = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) b<a)
t | inr x rewrite x = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) b<a)
indHyp : FirstGreater ≡ go<B Equal a b
indHyp = transitivity ( equalityCommutative t) ( <BIsInherited a b)
<BIsInherited ( zero : : a) ( one : : b) | inl ( inr 2 b+1<2a) | inr a=b rewrite a=b = exFalso ( succNotLess 2 b+1<2a)
@@ -356,12 +356,12 @@ module Numbers.BinaryNaturals.Order where
where
t : a <BInherited b ≡ FirstLess
t with TotalOrder.totality ℕ TotalOrder ( binNatToN a) ( binNatToN b)
t | inl ( inr x) = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) x a<b) )
t | inl ( inr x) = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) ( Tot alOrder.<Transitive ( ℕ TotalOrder) x a<b) )
t | inl ( inl x) = refl
t | inr x rewrite x = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) a<b)
t | inr x rewrite x = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) a<b)
indHyp : FirstLess ≡ go<B Equal a b
indHyp = transitivity ( equalityCommutative t) ( <BIsInherited a b)
<BIsInherited ( one : : a) ( zero : : b) | inl ( inl 2 a+1<2b) | inl ( inr b<a) = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) 2 a+1<2b ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) ( lessRespectsMultiplicationLeft ( binNatToN b) ( binNatToN a) 2 b<a ( le 1 refl) ) ( le zero refl) ) ) )
<BIsInherited ( one : : a) ( zero : : b) | inl ( inl 2 a+1<2b) | inl ( inr b<a) = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) ( Tot alOrder.<Transitive ( ℕ TotalOrder) 2 a+1<2b ( Tot alOrder.<Transitive ( ℕ TotalOrder) ( lessRespectsMultiplicationLeft ( binNatToN b) ( binNatToN a) 2 b<a ( le 1 refl) ) ( le zero refl) ) ) )
<BIsInherited ( one : : a) ( zero : : b) | inl ( inl 2 a+1<2b) | inr a=b rewrite a=b = exFalso ( succNotLess 2 a+1<2b)
<BIsInherited ( one : : a) ( zero : : b) | inl ( inr 2 b<2a+1) with TotalOrder.totality ℕ TotalOrder ( binNatToN a) ( binNatToN b)
<BIsInherited ( one : : a) ( zero : : b) | inl ( inr 2 b<2a+1) | inl ( inl a<b) = exFalso ( noIntegersBetweenXAndSuccX { 2 *N binNatToN b} ( 2 *N binNatToN a) ( lessRespectsMultiplicationLeft ( binNatToN a) ( binNatToN b) 2 a<b ( le 1 refl) ) 2 b<2a+1)
@@ -369,9 +369,9 @@ module Numbers.BinaryNaturals.Order where
where
t : a <BInherited b ≡ FirstGreater
t with TotalOrder.totality ℕ TotalOrder ( binNatToN a) ( binNatToN b)
t | inl ( inl x) = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) ( Parti alOrder.<Transitive ( TotalOrder.order ℕ TotalOrder) x b<a) )
t | inl ( inl x) = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) ( Tot alOrder.<Transitive ( ℕ TotalOrder) x b<a) )
t | inl ( inr x) = refl
t | inr x rewrite x = exFalso ( Parti alOrder.irreflexive ( TotalOrder.order ℕ TotalOrder) b<a)
t | inr x rewrite x = exFalso ( Tot alOrder.irreflexive ( ℕ TotalOrder) b<a)
indHyp : FirstGreater ≡ go<B Equal a b
indHyp = transitivity ( equalityCommutative t) ( <BIsInherited a b)
<BIsInherited ( one : : a) ( zero : : b) | inl ( inr 2 b<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) )