mirror of
https://github.com/Smaug123/agdaproofs
synced 2025-10-15 00:18:39 +00:00
Lots of without-K (#110)
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
{-# OPTIONS --warning=error --safe --without-K #-}
|
||||
|
||||
open import LogicalFormulae
|
||||
open import Decidable.Lemmas
|
||||
|
||||
module Numbers.Naturals.Definition where
|
||||
|
||||
@@ -34,3 +35,16 @@ aIsNotSuccA (succ a) pr = aIsNotSuccA a (succInjective pr)
|
||||
ℕDecideEquality' a b with ℕDecideEquality a b
|
||||
ℕDecideEquality' a b | inl x = BoolTrue
|
||||
ℕDecideEquality' a b | inr x = BoolFalse
|
||||
|
||||
record _=N'_ (a b : ℕ) : Set where
|
||||
field
|
||||
.eq : a ≡ b
|
||||
|
||||
squashN : {a b : ℕ} → a =N' b → a ≡ b
|
||||
squashN record { eq = eq } = squash ℕDecideEquality eq
|
||||
|
||||
collapseN : {a b : ℕ} → a ≡ b → a =N' b
|
||||
collapseN refl = record { eq = refl }
|
||||
|
||||
=N'Refl : {a b : ℕ} → (p1 p2 : a =N' b) → p1 ≡ p2
|
||||
=N'Refl p1 p2 = refl
|
||||
|
@@ -2,6 +2,7 @@
|
||||
|
||||
open import LogicalFormulae
|
||||
open import Numbers.Naturals.Semiring
|
||||
open import Numbers.Naturals.Definition
|
||||
open import Numbers.Naturals.Naturals
|
||||
open import Numbers.Naturals.Order
|
||||
open import Numbers.Naturals.Order.Lemmas
|
||||
@@ -14,6 +15,7 @@ module Numbers.Naturals.EuclideanAlgorithm where
|
||||
|
||||
open TotalOrder ℕTotalOrder
|
||||
open Semiring ℕSemiring
|
||||
open import Decidable.Lemmas ℕDecideEquality
|
||||
|
||||
record divisionAlgResult (a : ℕ) (b : ℕ) : Set where
|
||||
field
|
||||
@@ -23,6 +25,50 @@ record divisionAlgResult (a : ℕ) (b : ℕ) : Set where
|
||||
remIsSmall : (rem <N a) || (a ≡ 0)
|
||||
quotSmall : (0 <N a) || ((0 ≡ a) && (quot ≡ 0))
|
||||
|
||||
record divisionAlgResult' (a : ℕ) (b : ℕ) : Set where
|
||||
field
|
||||
quot : ℕ
|
||||
rem : ℕ
|
||||
.pr : a *N quot +N rem ≡ b
|
||||
remIsSmall : (rem <N' a) || (a =N' 0)
|
||||
quotSmall : (0 <N' a) || ((0 =N' a) && (quot =N' 0))
|
||||
|
||||
collapseDivAlgResult : {a b : ℕ} → (divisionAlgResult a b) → divisionAlgResult' a b
|
||||
collapseDivAlgResult record { quot = q ; rem = r ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inl y) } = record { quot = q ; rem = r ; pr = pr ; remIsSmall = inl (<NTo<N' x) ; quotSmall = inl (<NTo<N' y) }
|
||||
collapseDivAlgResult record { quot = q ; rem = r ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inr y) } = record { quot = q ; rem = r ; pr = pr ; remIsSmall = inl (<NTo<N' x) ; quotSmall = inr (collapseN (_&&_.fst y) ,, collapseN (_&&_.snd y)) }
|
||||
collapseDivAlgResult record { quot = q ; rem = r ; pr = pr ; remIsSmall = (inr x) ; quotSmall = inl y } = record { quot = q ; rem = r ; pr = pr ; remIsSmall = inr (collapseN x) ; quotSmall = inl (<NTo<N' y) }
|
||||
collapseDivAlgResult record { quot = q ; rem = r ; pr = pr ; remIsSmall = (inr x) ; quotSmall = inr y } = record { quot = q ; rem = r ; pr = pr ; remIsSmall = inr (collapseN x) ; quotSmall = inr (collapseN (_&&_.fst y) ,, collapseN (_&&_.snd y)) }
|
||||
|
||||
squashDivAlgResult : {a b : ℕ} → divisionAlgResult' a b → divisionAlgResult a b
|
||||
squashDivAlgResult record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inl y) } = record { quot = quot ; rem = rem ; pr = squash pr ; remIsSmall = inl (<N'To<N x) ; quotSmall = inl (<N'To<N y) }
|
||||
squashDivAlgResult record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inr y) } = record { quot = quot ; rem = rem ; pr = squash pr ; remIsSmall = inl (<N'To<N x) ; quotSmall = inr (squashN (_&&_.fst y) ,, squashN (_&&_.snd y)) }
|
||||
squashDivAlgResult record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inr x) ; quotSmall = (inl y) } = record { quot = quot ; rem = rem ; pr = squash pr ; remIsSmall = inr (squashN x) ; quotSmall = inl (<N'To<N y) }
|
||||
squashDivAlgResult record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inr x) ; quotSmall = (inr y) } = record { quot = quot ; rem = rem ; pr = squash pr ; remIsSmall = inr (squashN x) ; quotSmall = inr (squashN (_&&_.fst y) ,, squashN (_&&_.snd y)) }
|
||||
|
||||
squashPreservesRem : {a b : ℕ} → (p : divisionAlgResult' a b) → divisionAlgResult.rem (squashDivAlgResult p) ≡ divisionAlgResult'.rem p
|
||||
squashPreservesRem record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inl x₁) } = refl
|
||||
squashPreservesRem record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inr x₁) } = refl
|
||||
squashPreservesRem record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inr x) ; quotSmall = (inl x₁) } = refl
|
||||
squashPreservesRem record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inr x) ; quotSmall = (inr x₁) } = refl
|
||||
|
||||
squashPreservesQuot : {a b : ℕ} → (p : divisionAlgResult' a b) → divisionAlgResult.quot (squashDivAlgResult p) ≡ divisionAlgResult'.quot p
|
||||
squashPreservesQuot record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inl x₁) } = refl
|
||||
squashPreservesQuot record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inr x₁) } = refl
|
||||
squashPreservesQuot record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inr x) ; quotSmall = (inl x₁) } = refl
|
||||
squashPreservesQuot record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inr x) ; quotSmall = (inr x₁) } = refl
|
||||
|
||||
collapsePreservesRem : {a b : ℕ} → (p : divisionAlgResult a b) → divisionAlgResult'.rem (collapseDivAlgResult p) ≡ divisionAlgResult.rem p
|
||||
collapsePreservesRem record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inl x₁) } = refl
|
||||
collapsePreservesRem record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inr x₁) } = refl
|
||||
collapsePreservesRem record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inr x) ; quotSmall = (inl x₁) } = refl
|
||||
collapsePreservesRem record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inr x) ; quotSmall = (inr x₁) } = refl
|
||||
|
||||
collapsePreservesQuot : {a b : ℕ} → (p : divisionAlgResult a b) → divisionAlgResult'.quot (collapseDivAlgResult p) ≡ divisionAlgResult.quot p
|
||||
collapsePreservesQuot record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inl x₁) } = refl
|
||||
collapsePreservesQuot record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inl x) ; quotSmall = (inr x₁) } = refl
|
||||
collapsePreservesQuot record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inr x) ; quotSmall = (inl x₁) } = refl
|
||||
collapsePreservesQuot record { quot = quot ; rem = rem ; pr = pr ; remIsSmall = (inr x) ; quotSmall = (inr x₁) } = refl
|
||||
|
||||
divAlgLessLemma : (a b : ℕ) → (0 <N a) → (r : divisionAlgResult a b) → (divisionAlgResult.quot r ≡ 0) || (divisionAlgResult.rem r <N b)
|
||||
divAlgLessLemma zero b pr _ = exFalso (TotalOrder.irreflexive ℕTotalOrder pr)
|
||||
divAlgLessLemma (succ a) b _ record { quot = zero ; rem = a%b ; pr = pr ; remIsSmall = remIsSmall } = inl refl
|
||||
@@ -97,6 +143,15 @@ divisionAlg (succ a) = rec <NWellfounded (λ n → divisionAlgResult (succ a) n)
|
||||
data _∣_ : ℕ → ℕ → Set where
|
||||
divides : {a b : ℕ} → (res : divisionAlgResult a b) → divisionAlgResult.rem res ≡ zero → a ∣ b
|
||||
|
||||
data _∣'_ : ℕ → ℕ → Set where
|
||||
divides' : {a b : ℕ} → (res : divisionAlgResult' a b) → .(divisionAlgResult'.rem res ≡ zero) → a ∣' b
|
||||
|
||||
divToDiv' : {a b : ℕ} → a ∣ b → a ∣' b
|
||||
divToDiv' (divides res x) = divides' (collapseDivAlgResult res) (transitivity (collapsePreservesRem res) x)
|
||||
|
||||
div'ToDiv : {a b : ℕ} → a ∣' b → a ∣ b
|
||||
div'ToDiv (divides' res x) = divides (squashDivAlgResult res) (transitivity (squashPreservesRem res) (squashN record { eq = x }))
|
||||
|
||||
zeroDividesNothing : (a : ℕ) → zero ∣ succ a → False
|
||||
zeroDividesNothing a (divides record { quot = quot ; rem = rem ; pr = pr } x) = naughtE p
|
||||
where
|
||||
|
@@ -2,12 +2,14 @@
|
||||
|
||||
open import LogicalFormulae
|
||||
open import Semirings.Definition
|
||||
open import Numbers.Naturals.Definition
|
||||
open import Numbers.Naturals.Semiring
|
||||
open import Orders.Total.Definition
|
||||
open import Orders.Partial.Definition
|
||||
|
||||
module Numbers.Naturals.Order where
|
||||
open Semiring ℕSemiring
|
||||
open import Decidable.Lemmas ℕDecideEquality
|
||||
|
||||
private
|
||||
infix 5 _<NLogical_
|
||||
@@ -24,6 +26,13 @@ record _<N_ (a : ℕ) (b : ℕ) : Set where
|
||||
x : ℕ
|
||||
proof : (succ x) +N a ≡ b
|
||||
|
||||
infix 5 _<N'_
|
||||
record _<N'_ (a : ℕ) (b : ℕ) : Set where
|
||||
constructor le'
|
||||
field
|
||||
x : ℕ
|
||||
.proof : (succ x) +N a ≡ b
|
||||
|
||||
infix 5 _≤N_
|
||||
_≤N_ : ℕ → ℕ → Set
|
||||
a ≤N b = (a <N b) || (a ≡ b)
|
||||
@@ -182,3 +191,13 @@ canFlipMultiplicationsInIneq {a} {b} {c} {d} pr = identityOfIndiscernablesRight
|
||||
|
||||
lessRespectsMultiplication : (a b c : ℕ) → (a <N b) → (zero <N c) → (a *N c <N b *N c)
|
||||
lessRespectsMultiplication a b c prAB cPos = canFlipMultiplicationsInIneq {c} {a} {c} {b} (lessRespectsMultiplicationLeft a b c prAB cPos)
|
||||
|
||||
<NTo<N' : {a b : ℕ} → a <N b → a <N' b
|
||||
<NTo<N' (le x proof) = le' x proof
|
||||
|
||||
<N'To<N : {a b : ℕ} → a <N' b → a <N b
|
||||
<N'To<N {a} {b} (le' x proof) = le x (squash proof)
|
||||
|
||||
<N'Refl : {a b : ℕ} → (p1 p2 : a <N' b) → p1 ≡ p2
|
||||
<N'Refl p1 p2 with <NWellDefined (<N'To<N p1) (<N'To<N p2)
|
||||
... | refl = refl
|
||||
|
Reference in New Issue
Block a user