Skip to content

definition of Irreducible and Rough; refactoring of Prime and Composite cf. #2180 #2181

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 79 commits into from
Nov 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
1cf7c7f
definition of `Irreducible`; refactoring of `Prime` and `Composite`
jamesmckinna Oct 23, 2023
3ba8e50
tidying up old cruft
jamesmckinna Oct 23, 2023
5d31e32
knock-on consequences: `Coprimality`
jamesmckinna Oct 23, 2023
ea73f50
considerable refactoring of `Primality`
jamesmckinna Oct 23, 2023
ea39392
knock-on consequences: `Coprimality`
jamesmckinna Oct 24, 2023
94bbc53
refactoring: no appeal to `Data.Nat.Induction`
jamesmckinna Oct 24, 2023
c5074a8
refactoring: renamed `SmoothAt` and its constructor; added pattern sy…
jamesmckinna Oct 24, 2023
f240003
knock-on consequences: `Coprimality`
jamesmckinna Oct 24, 2023
114a017
refactoring: removed `NonZero` analysis; misc. tweaks
jamesmckinna Oct 24, 2023
4119dff
knock-on consequences: `Coprimality`; tightened `import`s
jamesmckinna Oct 24, 2023
dce2edc
knock-on consequences: `Coprimality`; tightened `import`s
jamesmckinna Oct 24, 2023
44c2c19
refactoring: every number is `1-rough`
jamesmckinna Oct 24, 2023
bab2dca
knock-on consequences: `Coprimality`; use of smart constructor
jamesmckinna Oct 25, 2023
a2194b6
refactoring: every number is `0-rough`; streamlining; inverse to `pri…
jamesmckinna Oct 25, 2023
963ff13
attempt to optimise for a nearly-common case pseudo-constructor
jamesmckinna Oct 25, 2023
1327c56
fiddling now
jamesmckinna Oct 25, 2023
c798889
refactoring: better use of `primality` API
jamesmckinna Oct 26, 2023
ddf151e
`Rough` is bounded
jamesmckinna Oct 27, 2023
00086b7
removed unnecessary implicits
jamesmckinna Oct 27, 2023
232b6d6
comment
jamesmckinna Oct 27, 2023
0a6954d
refactoring: comprehensive shift over to `NonTrivial` instances
jamesmckinna Oct 28, 2023
ea015fd
refactoring: oops!
jamesmckinna Oct 28, 2023
b1d9940
tidying up: removed infixes
jamesmckinna Oct 28, 2023
cc9e3a9
tidying up: restored `rough⇒≤`
jamesmckinna Oct 28, 2023
dfb25fa
further refinements; added `NonTrivial` proofs
jamesmckinna Oct 28, 2023
4340360
tidying up
jamesmckinna Nov 1, 2023
df55fb1
moving definitions to `Data.Nat.Base`
jamesmckinna Nov 3, 2023
66b3da6
propagated changes; many more explicit s required?
jamesmckinna Nov 3, 2023
8d04f15
`NonTrivial` is `Recomputable`
jamesmckinna Nov 3, 2023
5df96b0
all instances of `NonTrivial` now irrelevant; weird to need `NonTrivi…
jamesmckinna Nov 3, 2023
52c393a
tidying up `Coprimality`, eg with `variable`s
jamesmckinna Nov 3, 2023
f42577f
`NonTrivial` is `Decidable`
jamesmckinna Nov 3, 2023
4022d3e
systematise proofs of `Decidable` properties via the `UpTo` predicates
jamesmckinna Nov 3, 2023
8ed4c42
explicit quantifier now in `composite≢`
jamesmckinna Nov 3, 2023
88f1b4b
Nathan's simplification
jamesmckinna Nov 3, 2023
de78ca9
interaction of `NonZero` and `NonTrivial` instances
jamesmckinna Nov 3, 2023
2f456a8
divisor now a record field; final lemmas: closure under divisibility;…
jamesmckinna Nov 3, 2023
522135c
Merge branch 'master' into issue2180
jamesmckinna Nov 3, 2023
207cda4
'(non-)instances' become '(counter-)examples'
jamesmckinna Nov 3, 2023
d4cb3d4
stylistics
jamesmckinna Nov 3, 2023
e9b151b
removed `k` as a variable/parameter
jamesmckinna Nov 6, 2023
6e3c576
renamed fields and smart constructors
jamesmckinna Nov 6, 2023
e2e88cc
moved smart constructors; made a local definition
jamesmckinna Nov 6, 2023
ba7c782
tidying up
jamesmckinna Nov 6, 2023
22e6c38
refactoring per review comments: equivalence of `UpTo` predicates; ma…
jamesmckinna Nov 6, 2023
b38a6ac
tidying up: names congruent to ordering relation
jamesmckinna Nov 6, 2023
eaf3d6b
removed variable `k`; removed old proof in favour of new one with `No…
jamesmckinna Nov 6, 2023
5ce66fb
removed `recomputable` in favour of a private lemma
jamesmckinna Nov 6, 2023
d8d26ee
regularised use of instance brackets
jamesmckinna Nov 6, 2023
c75bf55
made instances more explicit
jamesmckinna Nov 6, 2023
b142293
made instances more explicit
jamesmckinna Nov 6, 2023
1a079f5
blank line
jamesmckinna Nov 6, 2023
698d53f
made `nonTrivial⇒nonZero` take an explicit argument in lieu of being …
jamesmckinna Nov 6, 2023
4a1c53e
regularised use of instance brackets
jamesmckinna Nov 6, 2023
9ce27c3
regularised use of instance brackets
jamesmckinna Nov 6, 2023
81394ad
trimming
jamesmckinna Nov 8, 2023
ee46670
tidied up `Coprimality` entries
jamesmckinna Nov 15, 2023
f87fdcc
Make HasBoundedNonTrivialDivisor infix
MatthewDaggitt Nov 16, 2023
cc65401
Make NonTrivial into a record to fix instance resolution bug
MatthewDaggitt Nov 16, 2023
4cc0687
Move HasNonTrivialDivisor to Divisibility.Core and hide UpTo lemmas
MatthewDaggitt Nov 16, 2023
2df019e
Rearrange file to follow standard ordering of lemmas in the rest of t…
MatthewDaggitt Nov 16, 2023
6e932a9
Move UpTo predicates into decidability proofs
MatthewDaggitt Nov 16, 2023
33ccd45
No-op refactoring to curb excessively long lines
MatthewDaggitt Nov 16, 2023
d6bf882
Make a couple of names consistent with style-guide
MatthewDaggitt Nov 16, 2023
92b1e03
new definition of `Prime`
jamesmckinna Nov 16, 2023
dd508e2
renamed fundamental definition
jamesmckinna Nov 16, 2023
8ff57d3
one last reference in `CHANGELOG`
jamesmckinna Nov 16, 2023
2141011
more better words; one fewer definition
jamesmckinna Nov 17, 2023
1e36fc6
tidied up `Definitions` section; rejigged order of proofs of properti…
jamesmckinna Nov 18, 2023
fa2ed6f
refactored proof of `prime⇒irreducible`
jamesmckinna Nov 18, 2023
fb8a7c8
finishing touches
jamesmckinna Nov 18, 2023
59eb7c4
missing lemma from irrelevant instance list
jamesmckinna Nov 18, 2023
46a6e48
regularised final proof to use `contradiction`
jamesmckinna Nov 19, 2023
3475d9c
added fixity `infix 10`
jamesmckinna Nov 19, 2023
9537512
added fixity `infix 10`; made `composite` a pattern synonym; knock-on…
jamesmckinna Nov 19, 2023
1f8da07
comprehensive `CHNAGELOG` entry; whitespace fixes
jamesmckinna Nov 19, 2023
1f2050c
Rename 1<2+ to sz<ss
MatthewDaggitt Nov 23, 2023
1f02654
Rename hasNonTrivialDivisor relation
MatthewDaggitt Nov 24, 2023
218d089
Updated CHANGELOG
MatthewDaggitt Nov 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 74 additions & 30 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -645,10 +645,14 @@ Non-backwards compatible changes
* To make it easier to use, reason about and read, the definition has been
changed to:
```agda
Prime 0 = ⊥
Prime 1 = ⊥
Prime n = ∀ {d} → 2 ≤ d → d < n → d ∤ n
record Prime (p : ℕ) : Set where
constructor prime
field
.{{nontrivial}} : NonTrivial p
notComposite : ¬ Composite p
```
where `Composite` is now defined as the diagonal of the new relation
`_HasNonTrivialDivisorLessThan_` in `Data.Nat.Divisibility.Core`.

### Changes to operation reduction behaviour in `Data.Rational(.Unnormalised)`

Expand Down Expand Up @@ -2731,6 +2735,18 @@ Additions to existing modules
s≤″s⁻¹ : suc m ≤″ suc n → m ≤″ n
s<″s⁻¹ : suc m <″ suc n → m <″ n

pattern 2+ n = suc (suc n)
pattern 1<2+n {n} = s<s (z<s {n})

NonTrivial : Pred ℕ 0ℓ
instance nonTrivial : NonTrivial (2+ n)
n>1⇒nonTrivial : 1 < n → NonTrivial n
nonZero⇒≢1⇒nonTrivial : .{{NonZero n}} → n ≢ 1 → NonTrivial n
recompute-nonTrivial : .{{NonTrivial n}} → NonTrivial n
nonTrivial⇒nonZero : .{{NonTrivial n}} → NonZero n
nonTrivial⇒n>1 : .{{NonTrivial n}} → 1 < n
nonTrivial⇒≢1 : .{{NonTrivial n}} → n ≢ 1

_⊔′_ : ℕ → ℕ → ℕ
_⊓′_ : ℕ → ℕ → ℕ
∣_-_∣′ : ℕ → ℕ → ℕ
Expand All @@ -2756,20 +2772,42 @@ Additions to existing modules
<-asym : Asymmetric _<_
```

* Added a new pattern synonym to `Data.Nat.Divisibility.Core`:
* Added a new pattern synonym and a new definition to `Data.Nat.Divisibility.Core`:
```agda
pattern divides-refl q = divides q refl
record _HasNonTrivialDivisorLessThan_ (m n : ℕ) : Set where
```

* Added new proofs to `Data.Nat.Divisibility`:
```agda
hasNonTrivialDivisor-≢ : .{{NonTrivial d}} → .{{NonZero n}} → d ≢ n → d ∣ n → n HasNonTrivialDivisorLessThan n
hasNonTrivialDivisor-∣ : m HasNonTrivialDivisorLessThan n → m ∣ o → o HasNonTrivialDivisorLessThan n
hasNonTrivialDivisor-≤ : m HasNonTrivialDivisorLessThan n → n ≤ o → m HasNonTrivialDivisorLessThan o
```

* Added new definitions and proofs to `Data.Nat.Primality`:
* Added new definitions, smart constructors and proofs to `Data.Nat.Primality`:
```agda
Composite : ℕ → Set
composite? : Decidable Composite
composite⇒¬prime : Composite n → ¬ Prime n
¬composite⇒prime : 2 ≤ n → ¬ Composite n → Prime n
prime⇒¬composite : Prime n → ¬ Composite n
¬prime⇒composite : 2 ≤ n → ¬ Prime n → Composite n
euclidsLemma : Prime p → p ∣ m * n → p ∣ m ⊎ p ∣ n
infix 10 _Rough_
_Rough_ : ℕ → Pred ℕ _
0-rough : 0 Rough n
1-rough : 1 Rough n
2-rough : 2 Rough n
rough⇒≤ : .{{NonTrivial n}} → m Rough n → m ≤ n
∤⇒rough-suc : m ∤ n → m Rough n → (suc m) Rough n
rough∧∣⇒rough : m Rough o → n ∣ o → m Rough n
Composite : ℕ → Set
composite-≢ : .{{NonTrivial d}} → .{{NonZero n}} → d ≢ n → d ∣ n → Composite n
composite-∣ : .{{NonZero n}} → Composite m → m ∣ n → Composite n
composite? : Decidable Composite
Irreducible : ℕ → Set
irreducible? : Decidable Irreducible
composite⇒¬prime : Composite n → ¬ Prime n
¬composite⇒prime : .{{NonTrivial n} → ¬ Composite n → Prime n
prime⇒¬composite : Prime n → ¬ Composite n
¬prime⇒composite : .{{NonTrivial n} → ¬ Prime n → Composite n
prime⇒irreducible : Prime p → Irreducible p
irreducible⇒prime : .{{NonTrivial p}} → Irreducible p → Prime p
euclidsLemma : Prime p → p ∣ m * n → p ∣ m ⊎ p ∣ n
```

* Added new proofs in `Data.Nat.Properties`:
Expand All @@ -2779,16 +2817,20 @@ Additions to existing modules
n+1+m≢m : n + suc m ≢ m
m*n≡0⇒m≡0 : .{{_ : NonZero n}} → m * n ≡ 0 → m ≡ 0
n>0⇒n≢0 : n > 0 → n ≢ 0
m^n≢0 : .{{_ : NonZero m}} → NonZero (m ^ n)
m*n≢0 : .{{_ : NonZero m}} .{{_ : NonZero n}} → NonZero (m * n)
m*n≢0⇒m≢0 : .{{NonZero (m * n)}} → NonZero m
m*n≢0⇒n≢0 : .{{NonZero (m * n)}} → NonZero n
m≢0∧n>1⇒m*n>1 : .{{_ : NonZero m}} .{{_ : NonTrivial n}} → NonTrivial (m * n)
n≢0∧m>1⇒m*n>1 : .{{_ : NonZero n}} .{{_ : NonTrivial m}} → NonTrivial (m * n)
m^n≢0 : .{{_ : NonZero m}} → NonZero (m ^ n)
m≤n⇒n∸m≤n : m ≤ n → n ∸ m ≤ n

s<s-injective : s<s p ≡ s<s q → p ≡ q
<-step : m < n → m < 1 + n
m<1+n⇒m<n∨m≡n : m < suc n → m < n ⊎ m ≡ n

pred-mono-≤ : m ≤ n → pred m ≤ pred n
pred-mono-< : ._ : NonZero m → m < n → pred m < pred n
pred-mono-< : .{{_ : NonZero m}} → m < n → pred m < pred n

z<′s : zero <′ suc n
s<′s : m <′ n → suc m <′ suc n
Expand Down Expand Up @@ -2829,7 +2871,7 @@ Additions to existing modules
⊓≡⊓′ : m ⊓ n ≡ m ⊓′ n
∣-∣≡∣-∣′ : ∣ m - n ∣ ≡ ∣ m - n ∣′

nonZero? : Decidable NonZero
nonTrivial? : Decidable NonTrivial
eq? : A ↣ ℕ → DecidableEquality A
≤-<-connex : Connex _≤_ _<_
≥->-connex : Connex _≥_ _>_
Expand All @@ -2855,21 +2897,21 @@ Additions to existing modules
m%n≤n : .{{_ : NonZero n}} → m % n ≤ n
m*n/m!≡n/[m∸1]! : .{{_ : NonZero m}} → m * n / m ! ≡ n / (pred m) !

%-congˡ : ._ : NonZero o → m ≡ n → m % o ≡ n % o
%-congʳ : ._ : NonZero m ⦄ .⦃ _ : NonZero n → m ≡ n → o % m ≡ o % n
m≤n⇒[n∸m]%m≡n%m : ._ : NonZero m → m ≤ n → (n ∸ m) % m ≡ n % m
m*n≤o⇒[o∸m*n]%n≡o%n : ._ : NonZero n → m * n ≤ o → (o ∸ m * n) % n ≡ o % n
m∣n⇒o%n%m≡o%m : ._ : NonZero m ⦄ .⦃ _ : NonZero n → m ∣ n → o % n % m ≡ o % m
m<n⇒m%n≡m : ._ : NonZero n → m < n → m % n ≡ m
m*n/o*n≡m/o : ._ : NonZero o ⦄ ⦃ _ : NonZero (o * n) → m * n / (o * n) ≡ m / o
m<n*o⇒m/o<n : ._ : NonZero o → m < n * o → m / o < n
[m∸n]/n≡m/n∸1 : ._ : NonZero n → (m ∸ n) / n ≡ pred (m / n)
[m∸n*o]/o≡m/o∸n : ._ : NonZero o → (m ∸ n * o) / o ≡ m / o ∸ n
m/n/o≡m/[n*o] : ._ : NonZero n ⦄ .⦃ _ : NonZero o ⦄ .⦃ _ : NonZero (n * o) → m / n / o ≡ m / (n * o)
m%[n*o]/o≡m/o%n : ._ : NonZero n ⦄ .⦃ _ : NonZero o ⦄ ⦃ _ : NonZero (n * o) → m % (n * o) / o ≡ m / o % n
m%n*o≡m*o%[n*o] : ._ : NonZero n ⦄ ⦃ _ : NonZero (n * o) → m % n * o ≡ m * o % (n * o)
%-congˡ : .{{_ : NonZero o}} → m ≡ n → m % o ≡ n % o
%-congʳ : .{{_ : NonZero m}} .{{_ : NonZero n}} → m ≡ n → o % m ≡ o % n
m≤n⇒[n∸m]%m≡n%m : .{{_ : NonZero m}} → m ≤ n → (n ∸ m) % m ≡ n % m
m*n≤o⇒[o∸m*n]%n≡o%n : .{{_ : NonZero n}} → m * n ≤ o → (o ∸ m * n) % n ≡ o % n
m∣n⇒o%n%m≡o%m : .{{_ : NonZero m}} .{{_ : NonZero n}} → m ∣ n → o % n % m ≡ o % m
m<n⇒m%n≡m : .{{_ : NonZero n}} → m < n → m % n ≡ m
m*n/o*n≡m/o : .{{_ : NonZero o}} {{_ : NonZero (o * n)}} → m * n / (o * n) ≡ m / o
m<n*o⇒m/o<n : .{{_ : NonZero o}} → m < n * o → m / o < n
[m∸n]/n≡m/n∸1 : .{{_ : NonZero n}} → (m ∸ n) / n ≡ pred (m / n)
[m∸n*o]/o≡m/o∸n : .{{_ : NonZero o}} → (m ∸ n * o) / o ≡ m / o ∸ n
m/n/o≡m/[n*o] : .{{_ : NonZero n}} .{{_ : NonZero o}} .{{_ : NonZero (n * o)}} → m / n / o ≡ m / (n * o)
m%[n*o]/o≡m/o%n : .{{_ : NonZero n}} .{{_ : NonZero o}} {{_ : NonZero (n * o)}} → m % (n * o) / o ≡ m / o % n
m%n*o≡m*o%[n*o] : .{{_ : NonZero n}} {{_ : NonZero (n * o)}} → m % n * o ≡ m * o % (n * o)

[m*n+o]%[p*n]≡[m*n]%[p*n]+o : _ : NonZero (p * n) → o < n → (m * n + o) % (p * n) ≡ (m * n) % (p * n) + o
[m*n+o]%[p*n]≡[m*n]%[p*n]+o : {{_ : NonZero (p * n)}} → o < n → (m * n + o) % (p * n) ≡ (m * n) % (p * n) + o
```

* Added new proofs in `Data.Nat.Divisibility`:
Expand Down Expand Up @@ -3606,7 +3648,9 @@ This is a full list of proofs that have changed form to use irrelevant instance

* In `Data.Nat.Coprimality`:
```
Bézout-coprime : ∀ {i j d} → Bézout.Identity (suc d) (i * suc d) (j * suc d) → Coprime i j
¬0-coprimeTo-2+ : ∀ {n} → ¬ Coprime 0 (2 + n)
Bézout-coprime : ∀ {i j d} → Bézout.Identity (suc d) (i * suc d) (j * suc d) → Coprime i j
prime⇒coprime : ∀ m → Prime m → ∀ n → 0 < n → n < m → Coprime m n
```

* In `Data.Nat.Divisibility`
Expand Down
55 changes: 47 additions & 8 deletions src/Data/Nat/Base.agda
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,17 @@ open import Relation.Binary.Core using (Rel)
open import Relation.Binary.PropositionalEquality.Core
using (_≡_; _≢_; refl)
open import Relation.Nullary.Negation.Core using (¬_; contradiction)
open import Relation.Unary using (Pred)

------------------------------------------------------------------------
-- Types

open import Agda.Builtin.Nat public
using (zero; suc) renaming (Nat to ℕ)

--smart constructor
pattern 2+ n = suc (suc n)

------------------------------------------------------------------------
-- Boolean equality relation

Expand Down Expand Up @@ -59,8 +63,9 @@ m < n = suc m ≤ n

-- Smart constructors of _<_

pattern z<s {n} = s≤s (z≤n {n})
pattern z<s {n} = s≤s (z≤n {n})
pattern s<s {m} {n} m<n = s≤s {m} {n} m<n
pattern sz<ss {n} = s<s (z<s {n})

-- Smart destructors of _≤_, _<_

Expand All @@ -72,7 +77,7 @@ s<s⁻¹ (s<s m<n) = m<n


------------------------------------------------------------------------
-- other ordering relations
-- Other derived ordering relations

_≥_ : Rel ℕ 0ℓ
m ≥ n = n ≤ m
Expand All @@ -95,13 +100,19 @@ a ≯ b = ¬ a > b
------------------------------------------------------------------------
-- Simple predicates

-- Defining `NonZero` in terms of `T` and therefore ultimately `⊤` and
-- `⊥` allows Agda to automatically infer nonZero-ness for any natural
-- of the form `suc n`. Consequently in many circumstances this
-- eliminates the need to explicitly pass a proof when the NonZero
-- argument is either an implicit or an instance argument.
-- Defining these predicates in terms of `T` and therefore ultimately
-- `⊤` and `⊥` allows Agda to automatically infer them for any natural
-- of the correct form. Consequently in many circumstances this
-- eliminates the need to explicitly pass a proof when the predicate
-- argument is either an implicit or an instance argument. See `_/_`
-- and `_%_` further down this file for examples.
--
-- See `Data.Nat.DivMod` for an example.
-- Furthermore, defining these predicates as single-field records
-- (rather defining them directly as the type of their field) is
-- necessary as the current version of Agda is far better at
-- reconstructing meta-variable values for the record parameters.

-- A predicate saying that a number is not equal to 0.

record NonZero (n : ℕ) : Set where
field
Expand Down Expand Up @@ -130,6 +141,34 @@ instance
>-nonZero⁻¹ : ∀ n → .{{NonZero n}} → n > 0
>-nonZero⁻¹ (suc n) = z<s

-- The property of being a non-zero, non-unit

record NonTrivial (n : ℕ) : Set where
field
nonTrivial : T (1 <ᵇ n)

-- Instances

instance
nonTrivial : ∀ {n} → NonTrivial (2+ n)
nonTrivial = _

-- Constructors

n>1⇒nonTrivial : ∀ {n} → n > 1 → NonTrivial n
n>1⇒nonTrivial sz<ss = _

-- Destructors

nonTrivial⇒nonZero : ∀ n → .{{NonTrivial n}} → NonZero n
nonTrivial⇒nonZero (2+ _) = _

nonTrivial⇒n>1 : ∀ n → .{{NonTrivial n}} → n > 1
nonTrivial⇒n>1 (2+ _) = sz<ss

nonTrivial⇒≢1 : ∀ {n} → .{{NonTrivial n}} → n ≢ 1
nonTrivial⇒≢1 {{()}} refl

------------------------------------------------------------------------
-- Raw bundles

Expand Down
Loading