From b6ef9b46f291660cc7071310a8d1750111546422 Mon Sep 17 00:00:00 2001 From: Patrick Stevens Date: Sun, 29 Dec 2019 12:11:21 +0000 Subject: [PATCH] Reshuffle orders (#91) --- Everything/Safe.agda | 4 +- Fields/CauchyCompletion/Approximation.agda | 1 - Fields/Fields.agda | 2 - Fields/Orders/Lemmas.agda | 1 - Fields/Orders/Partial/Definition.agda | 1 - Fields/Orders/Total/Definition.agda | 1 - Groups/FirstIsomorphismTheorem.agda | 1 - Groups/Homomorphisms/Image.agda | 1 - Groups/Homomorphisms/Kernel.agda | 1 - Groups/Subgroups/Normal/Definition.agda | 1 - Groups/Subgroups/Normal/Examples.agda | 1 - Groups/Subgroups/Normal/Lemmas.agda | 1 - KeyValue/KeyValue.agda | 24 +- KeyValue/LinearStore/Definition.agda | 62 +-- KeyValue/LinearStore/Implementation.agda | 381 +++++++++--------- Numbers/BinaryNaturals/Addition.agda | 2 +- Numbers/BinaryNaturals/Definition.agda | 2 +- Numbers/BinaryNaturals/Order.agda | 52 +-- Numbers/BinaryNaturals/Subtraction.agda | 2 +- Numbers/BinaryNaturals/SubtractionGo.agda | 1 - Numbers/Integers/Order.agda | 3 +- .../RingStructure/EuclideanDomain.agda | 2 +- Numbers/Modulo/Addition.agda | 2 +- Numbers/Modulo/Definition.agda | 1 - Numbers/Modulo/Group.agda | 2 +- Numbers/Naturals/EuclideanAlgorithm.agda | 4 +- Numbers/Naturals/Naturals.agda | 3 +- Numbers/Naturals/Order.agda | 3 +- Numbers/Naturals/Order/Lemmas.agda | 1 - Numbers/Naturals/Order/WellFounded.agda | 4 +- Numbers/Naturals/Semiring.agda | 2 - Numbers/Naturals/Subtraction.agda | 2 - Numbers/Naturals/WithK.agda | 2 - Numbers/Primes/IntegerFactorisation.agda | 4 +- Numbers/Primes/PrimeNumbers.agda | 4 +- Numbers/Rationals/Lemmas.agda | 8 +- Orders.agda | 109 ----- Orders/Partial/Definition.agda | 16 + Orders/Total/Definition.agda | 36 ++ Orders/Total/Lemmas.agda | 81 ++++ Orders/WellFounded/Definition.agda | 14 + Orders/WellFounded/Induction.agda | 26 ++ Rings/EuclideanDomains/Definition.agda | 2 +- Rings/Examples/Proofs.agda | 4 +- Rings/Ideals/Prime/Definition.agda | 1 - Rings/IntegralDomains/Definition.agda | 1 - Rings/IntegralDomains/Examples.agda | 1 - Rings/IntegralDomains/Lemmas.agda | 1 - Rings/Primes/Lemmas.agda | 1 - Setoids/Orders.agda | 7 +- Sets/CantorBijection/CantorBijection.agda | 2 - Sets/CantorBijection/Order.agda | 6 +- Sets/CantorBijection/Proofs.agda | 4 +- Sets/Cardinality.agda | 3 +- Sets/FinSet.agda | 1 - Vectors.agda | 4 +- WellFoundedInduction.agda | 29 -- 57 files changed, 476 insertions(+), 462 deletions(-) delete mode 100644 Orders.agda create mode 100644 Orders/Partial/Definition.agda create mode 100644 Orders/Total/Definition.agda create mode 100644 Orders/Total/Lemmas.agda create mode 100644 Orders/WellFounded/Definition.agda create mode 100644 Orders/WellFounded/Induction.agda delete mode 100644 WellFoundedInduction.agda diff --git a/Everything/Safe.agda b/Everything/Safe.agda index 4186068..2ec4126 100644 --- a/Everything/Safe.agda +++ b/Everything/Safe.agda @@ -96,8 +96,8 @@ open import KeyValue.KeyValue open import KeyValue.LinearStore.Definition open import Maybe -open import Orders -open import WellFoundedInduction +open import Orders.Total.Lemmas +open import Orders.WellFounded.Induction open import ClassicalLogic.ClassicalFive diff --git a/Fields/CauchyCompletion/Approximation.agda b/Fields/CauchyCompletion/Approximation.agda index 4d6f924..43ca92c 100644 --- a/Fields/CauchyCompletion/Approximation.agda +++ b/Fields/CauchyCompletion/Approximation.agda @@ -1,7 +1,6 @@ {-# OPTIONS --safe --warning=error --without-K --guardedness #-} open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) -open import Orders open import Setoids.Setoids open import Rings.Definition open import Rings.Lemmas diff --git a/Fields/Fields.agda b/Fields/Fields.agda index 980fd1d..b01b3b0 100644 --- a/Fields/Fields.agda +++ b/Fields/Fields.agda @@ -6,8 +6,6 @@ open import Groups.Definition open import Rings.Definition open import Rings.Lemmas open import Setoids.Setoids -open import Setoids.Orders -open import Orders open import Rings.IntegralDomains.Definition open import Functions open import Sets.EquivalenceRelations diff --git a/Fields/Orders/Lemmas.agda b/Fields/Orders/Lemmas.agda index 20ec5a5..80bfe0c 100644 --- a/Fields/Orders/Lemmas.agda +++ b/Fields/Orders/Lemmas.agda @@ -10,7 +10,6 @@ open import Rings.Orders.Total.Definition open import Rings.Lemmas open import Setoids.Setoids open import Setoids.Orders -open import Orders open import Rings.IntegralDomains.Definition open import Functions open import Sets.EquivalenceRelations diff --git a/Fields/Orders/Partial/Definition.agda b/Fields/Orders/Partial/Definition.agda index 3ea5c37..e04a206 100644 --- a/Fields/Orders/Partial/Definition.agda +++ b/Fields/Orders/Partial/Definition.agda @@ -8,7 +8,6 @@ open import Rings.Orders.Partial.Definition open import Rings.Lemmas open import Setoids.Setoids open import Setoids.Orders -open import Orders open import Functions open import Sets.EquivalenceRelations open import Fields.Fields diff --git a/Fields/Orders/Total/Definition.agda b/Fields/Orders/Total/Definition.agda index bf6fd38..acaaaac 100644 --- a/Fields/Orders/Total/Definition.agda +++ b/Fields/Orders/Total/Definition.agda @@ -9,7 +9,6 @@ open import Rings.Orders.Total.Definition open import Rings.Lemmas open import Setoids.Setoids open import Setoids.Orders -open import Orders open import Functions open import Sets.EquivalenceRelations open import Fields.Fields diff --git a/Groups/FirstIsomorphismTheorem.agda b/Groups/FirstIsomorphismTheorem.agda index a0cbb30..1479a51 100644 --- a/Groups/FirstIsomorphismTheorem.agda +++ b/Groups/FirstIsomorphismTheorem.agda @@ -2,7 +2,6 @@ open import Groups.Groups open import Groups.Definition -open import Orders open import Numbers.Integers.Integers open import Setoids.Setoids open import LogicalFormulae diff --git a/Groups/Homomorphisms/Image.agda b/Groups/Homomorphisms/Image.agda index f0f1eec..a0627ac 100644 --- a/Groups/Homomorphisms/Image.agda +++ b/Groups/Homomorphisms/Image.agda @@ -2,7 +2,6 @@ open import Groups.Groups open import Groups.Definition -open import Orders open import Numbers.Integers.Integers open import Setoids.Setoids open import Setoids.Subset diff --git a/Groups/Homomorphisms/Kernel.agda b/Groups/Homomorphisms/Kernel.agda index e5d6ed1..52b914b 100644 --- a/Groups/Homomorphisms/Kernel.agda +++ b/Groups/Homomorphisms/Kernel.agda @@ -2,7 +2,6 @@ open import Groups.Groups open import Groups.Definition -open import Orders open import Numbers.Integers.Integers open import Setoids.Setoids open import LogicalFormulae diff --git a/Groups/Subgroups/Normal/Definition.agda b/Groups/Subgroups/Normal/Definition.agda index 28bacff..1fabb91 100644 --- a/Groups/Subgroups/Normal/Definition.agda +++ b/Groups/Subgroups/Normal/Definition.agda @@ -2,7 +2,6 @@ open import Groups.Groups open import Groups.Definition -open import Orders open import Numbers.Integers.Integers open import Setoids.Setoids open import LogicalFormulae diff --git a/Groups/Subgroups/Normal/Examples.agda b/Groups/Subgroups/Normal/Examples.agda index 1779bc4..9d86107 100644 --- a/Groups/Subgroups/Normal/Examples.agda +++ b/Groups/Subgroups/Normal/Examples.agda @@ -2,7 +2,6 @@ open import Groups.Groups open import Groups.Definition -open import Orders open import Numbers.Integers.Integers open import Setoids.Setoids open import LogicalFormulae diff --git a/Groups/Subgroups/Normal/Lemmas.agda b/Groups/Subgroups/Normal/Lemmas.agda index 76c4790..15fe3a4 100644 --- a/Groups/Subgroups/Normal/Lemmas.agda +++ b/Groups/Subgroups/Normal/Lemmas.agda @@ -2,7 +2,6 @@ open import Groups.Groups open import Groups.Definition -open import Orders open import Numbers.Integers.Integers open import Setoids.Setoids open import LogicalFormulae diff --git a/KeyValue/KeyValue.agda b/KeyValue/KeyValue.agda index 74dd67e..9fc59db 100644 --- a/KeyValue/KeyValue.agda +++ b/KeyValue/KeyValue.agda @@ -1,7 +1,6 @@ {-# OPTIONS --warning=error --safe --without-K #-} open import LogicalFormulae -open import Orders open import Maybe open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) open import Vectors @@ -9,14 +8,15 @@ open import Vectors open import Numbers.Naturals.Semiring open import Numbers.Naturals.Order -module KeyValue.KeyValue where - record KeyValue {a b c : _} (keys : Set a) (values : Set b) (maps : Set c) : Set (a ⊔ b ⊔ c) where - field - tryFind : maps → keys → Maybe values - add : (map : maps) → keys → values → maps - empty : maps - count : maps → ℕ - lookupAfterAdd : (map : maps) → (k : keys) → (v : values) → tryFind (add map k v) k ≡ yes v - lookupAfterAdd' : (map : maps) → (k1 : keys) → (v : values) → (k2 : keys) → (k1 ≡ k2) || (tryFind (add map k1 v) k2 ≡ tryFind map k2) - countAfterAdd' : (map : maps) → (k : keys) → (v : values) → (tryFind map k ≡ no) → count (add map k v) ≡ succ (count map) - countAfterAdd : (map : maps) → (k : keys) → (v1 v2 : values) → (tryFind map k ≡ yes v2) → count (add map k v1) ≡ count map +module KeyValue.KeyValue {a b : _} (keys : Set a) (values : Set b) where + +record KeyValue {c : _} (maps : Set c) : Set (a ⊔ b ⊔ c) where + field + tryFind : maps → keys → Maybe values + add : (map : maps) → keys → values → maps + empty : maps + count : maps → ℕ + lookupAfterAdd : (map : maps) → (k : keys) → (v : values) → tryFind (add map k v) k ≡ yes v + lookupAfterAdd' : (map : maps) → (k1 : keys) → (v : values) → (k2 : keys) → (k1 ≡ k2) || (tryFind (add map k1 v) k2 ≡ tryFind map k2) + countAfterAdd' : (map : maps) → (k : keys) → (v : values) → (tryFind map k ≡ no) → count (add map k v) ≡ succ (count map) + countAfterAdd : (map : maps) → (k : keys) → (v1 v2 : values) → (tryFind map k ≡ yes v2) → count (add map k v1) ≡ count map diff --git a/KeyValue/LinearStore/Definition.agda b/KeyValue/LinearStore/Definition.agda index 17dccd3..6b6c43f 100644 --- a/KeyValue/LinearStore/Definition.agda +++ b/KeyValue/LinearStore/Definition.agda @@ -1,35 +1,37 @@ {-# OPTIONS --warning=error --safe --without-K #-} -open import KeyValue.LinearStore.Implementation -open import KeyValue.KeyValue -open import Orders +open import Orders.Total.Definition open import LogicalFormulae open import Maybe -module KeyValue.LinearStore.Definition where - LinearStore : {a b c : _} (keys : Set a) (values : Set b) (keyOrder : TotalOrder {_} {c} keys) → KeyValue keys values (Map keys values keyOrder) - KeyValue.tryFind (LinearStore keys values keyOrder) = lookup {keys = keys} {values} {keyOrder} - KeyValue.add (LinearStore keys values keyOrder) = addMap - KeyValue.empty (LinearStore keys values keyOrder) = empty - KeyValue.count (LinearStore keys values keyOrder) = count {keys = keys} {values} {keyOrder} - KeyValue.lookupAfterAdd (LinearStore keys values keyOrder) empty k v with TotalOrder.totality keyOrder k k - KeyValue.lookupAfterAdd (LinearStore keys values keyOrder) empty k v | inl (inl x) = exFalso (TotalOrder.irreflexive keyOrder x) - KeyValue.lookupAfterAdd (LinearStore keys values keyOrder) empty k v | inl (inr x) = exFalso (TotalOrder.irreflexive keyOrder x) - KeyValue.lookupAfterAdd (LinearStore keys values keyOrder) empty k v | inr x = refl - KeyValue.lookupAfterAdd (LinearStore keys values keyOrder) (nonempty x) k v = lookupReducedSucceedsAfterAdd k v x - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) empty k1 v k2 with TotalOrder.totality keyOrder k1 k2 - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) empty k1 v k2 | inl (inl x) = inr refl - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) empty k1 v k2 | inl (inr x) = inr refl - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) empty k1 v k2 | inr x = inl x - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) (nonempty x) k1 v k2 with TotalOrder.totality keyOrder k1 k2 - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) (nonempty map) k1 v k2 | inl (inl x) with inspect (lookupReduced map k2) - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) (nonempty map) k1 v k2 | inl (inl x) | no with≡ pr rewrite pr = inr (lookupReducedFailsAfterUnrelatedAdd k1 v k2 (inl x) map pr) - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) (nonempty map) k1 v k2 | inl (inl x) | (yes lookedUp) with≡ pr rewrite pr = inr (lookupReducedSucceedsAfterUnrelatedAdd k1 v k2 lookedUp (inl x) map pr) - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) (nonempty map) k1 v k2 | inl (inr x) with inspect (lookupReduced map k2) - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) (nonempty map) k1 v k2 | inl (inr x) | no with≡ pr rewrite pr = inr (lookupReducedFailsAfterUnrelatedAdd k1 v k2 (inr x) map pr) - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) (nonempty map) k1 v k2 | inl (inr x) | yes lookedUp with≡ pr rewrite pr = inr (lookupReducedSucceedsAfterUnrelatedAdd k1 v k2 lookedUp (inr x) map pr) - KeyValue.lookupAfterAdd' (LinearStore keys values keyOrder) (nonempty map) k1 v k2 | inr x = inl x - KeyValue.countAfterAdd' (LinearStore keys values keyOrder) empty _ _ _ = refl - KeyValue.countAfterAdd' (LinearStore keys values keyOrder) (nonempty x) k v = countReducedBehavesWhenAddingNotPresent k v x - KeyValue.countAfterAdd (LinearStore keys values keyOrder) empty _ _ _ () - KeyValue.countAfterAdd (LinearStore keys values keyOrder) (nonempty map) k v1 v2 = countReducedBehavesWhenAddingPresent k v1 v2 map +module KeyValue.LinearStore.Definition {a b : _} (keySet : Set a) (valueSet : Set b) {c : _} (keyOrder : TotalOrder keySet {c}) where + +open import KeyValue.KeyValue keySet valueSet +open import KeyValue.LinearStore.Implementation keySet valueSet keyOrder + +LinearStore : KeyValue Map +KeyValue.tryFind LinearStore = lookup +KeyValue.add LinearStore = addMap +KeyValue.empty LinearStore = empty +KeyValue.count LinearStore = count +KeyValue.lookupAfterAdd LinearStore empty k v with TotalOrder.totality keyOrder k k +KeyValue.lookupAfterAdd LinearStore empty k v | inl (inl x) = exFalso (TotalOrder.irreflexive keyOrder x) +KeyValue.lookupAfterAdd LinearStore empty k v | inl (inr x) = exFalso (TotalOrder.irreflexive keyOrder x) +KeyValue.lookupAfterAdd LinearStore empty k v | inr x = refl +KeyValue.lookupAfterAdd LinearStore (nonempty x) k v = lookupReducedSucceedsAfterAdd k v x +KeyValue.lookupAfterAdd' LinearStore empty k1 v k2 with TotalOrder.totality keyOrder k1 k2 +KeyValue.lookupAfterAdd' LinearStore empty k1 v k2 | inl (inl x) = inr refl +KeyValue.lookupAfterAdd' LinearStore empty k1 v k2 | inl (inr x) = inr refl +KeyValue.lookupAfterAdd' LinearStore empty k1 v k2 | inr x = inl x +KeyValue.lookupAfterAdd' LinearStore (nonempty x) k1 v k2 with TotalOrder.totality keyOrder k1 k2 +KeyValue.lookupAfterAdd' LinearStore (nonempty map) k1 v k2 | inl (inl x) with inspect (lookupReduced map k2) +KeyValue.lookupAfterAdd' LinearStore (nonempty map) k1 v k2 | inl (inl x) | no with≡ pr rewrite pr = inr (lookupReducedFailsAfterUnrelatedAdd k1 v k2 (inl x) map pr) +KeyValue.lookupAfterAdd' LinearStore (nonempty map) k1 v k2 | inl (inl x) | (yes lookedUp) with≡ pr rewrite pr = inr (lookupReducedSucceedsAfterUnrelatedAdd k1 v k2 lookedUp (inl x) map pr) +KeyValue.lookupAfterAdd' LinearStore (nonempty map) k1 v k2 | inl (inr x) with inspect (lookupReduced map k2) +KeyValue.lookupAfterAdd' LinearStore (nonempty map) k1 v k2 | inl (inr x) | no with≡ pr rewrite pr = inr (lookupReducedFailsAfterUnrelatedAdd k1 v k2 (inr x) map pr) +KeyValue.lookupAfterAdd' LinearStore (nonempty map) k1 v k2 | inl (inr x) | yes lookedUp with≡ pr rewrite pr = inr (lookupReducedSucceedsAfterUnrelatedAdd k1 v k2 lookedUp (inr x) map pr) +KeyValue.lookupAfterAdd' LinearStore (nonempty map) k1 v k2 | inr x = inl x +KeyValue.countAfterAdd' LinearStore empty _ _ _ = refl +KeyValue.countAfterAdd' LinearStore (nonempty x) k v = countReducedBehavesWhenAddingNotPresent k v x +KeyValue.countAfterAdd LinearStore empty _ _ _ () +KeyValue.countAfterAdd LinearStore (nonempty map) k v1 v2 = countReducedBehavesWhenAddingPresent k v1 v2 map diff --git a/KeyValue/LinearStore/Implementation.agda b/KeyValue/LinearStore/Implementation.agda index e917b34..41c6689 100644 --- a/KeyValue/LinearStore/Implementation.agda +++ b/KeyValue/LinearStore/Implementation.agda @@ -1,7 +1,8 @@ {-# OPTIONS --warning=error --safe --without-K #-} open import LogicalFormulae -open import Orders +open import Orders.Total.Definition +open import Orders.Total.Lemmas open import Maybe open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) open import Vectors @@ -9,223 +10,223 @@ open import Vectors open import Numbers.Naturals.Semiring open import Numbers.Naturals.Order -module KeyValue.LinearStore.Implementation where +module KeyValue.LinearStore.Implementation {a b c} (keySet : Set a) (valueSet : Set b) (keyOrder : TotalOrder {_} keySet {c}) where -record ReducedMap {a b c : _} (keys : Set a) (values : Set b) (keyOrder : TotalOrder {_} {c} keys) (min : keys) : Set (a ⊔ b ⊔ c) -record ReducedMap {a} {b} {c} keys values keyOrder min where +record ReducedMap (min : keySet) : Set (a ⊔ b ⊔ c) +record ReducedMap min where inductive field - firstEntry : values - next : Maybe (Sg keys (λ nextKey → (ReducedMap keys values keyOrder nextKey) && (TotalOrder._<_ keyOrder min nextKey))) + firstEntry : valueSet + next : Maybe (Sg keySet (λ nextKey → (ReducedMap nextKey) && (TotalOrder._<_ keyOrder min nextKey))) -addReducedMap : {a b c : _} → {keys : Set a} → {values : Set b} → {keyOrder : TotalOrder {_} {c} keys} → {min : keys} → (k : keys) → (v : values) → (m : ReducedMap {a} {b} keys values keyOrder min) → ReducedMap keys values keyOrder (TotalOrder.min keyOrder min k) -addReducedMap {keyOrder = keyOrder} {min} k v m with TotalOrder.totality keyOrder min k -addReducedMap {keyOrder = keyOrder} {min} k v record { firstEntry = firstEntry ; next = no } | inl (inl min Set a where [] : Vec X zero _,-_ : {n : ℕ} -> X -> Vec X n -> Vec X (succ n) diff --git a/WellFoundedInduction.agda b/WellFoundedInduction.agda deleted file mode 100644 index 86681d3..0000000 --- a/WellFoundedInduction.agda +++ /dev/null @@ -1,29 +0,0 @@ -{-# OPTIONS --safe --warning=error --without-K #-} - -open import LogicalFormulae -open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) -open import Functions - -module WellFoundedInduction where - -data Accessible {a} {b} {A} (_<_ : Rel {a} {b} A) (x : A) : Set (lsuc a ⊔ b) where - access : (∀ y → y < x → Accessible _<_ y) → Accessible _<_ x - -WellFounded : {a b : _} → ∀ {A} → Rel {a} {b} A → Set (lsuc a ⊔ b) -WellFounded {a} _<_ = ∀ x → Accessible _<_ x - -foldAcc : {a b c : _} → {A : Set a} → {_<_ : Rel {a} {c} A} → - (P : A → Set b) → - (∀ x → (∀ y → y < x → P y) → P x) → - ∀ z → Accessible _<_ z → - P z -foldAcc {a} {b} {c} {A} {_<_} P inductionProof = go - where - go : (z : A) → (Accessible _<_ z) → P z - go z (access prf) = inductionProof z (λ y yLessZ → go y (prf y yLessZ)) - -rec : {a b c : _} → {A : Set a} → {_<_ : Rel {a} {c} A} → - WellFounded _<_ → - (P : A → Set b) → - (∀ x → (∀ y → y < x → P y) → P x) → (∀ z → P z) -rec wf P inductionProof z = foldAcc P inductionProof _ (wf z)