Skip to content

Commit 51e06a7

Browse files
[ new ] Fin n as a refinement (#2975)
* [ new ] Fin n as a refinement This version has a better runtime representation This version lets us have efficient implementations of things like splitAt and quotRem * ASCII-fy Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * Rename `nonZero` Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * [ fix ] move lemma to Data.Nat.Properties * [ cosmetic ] use idiom brackets * Simplify opposite Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * [ cleanup ] gadget to convert irrelevant-domains * [ james ] rename unview -> view⁻¹ * [ james ] More descriptive CHANGELOG entry Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * [ tmp ] merging James' punch* functions Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * [ cleanup ] avoid recompute, rebuilding (T (i < j)) --------- Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com>
1 parent b52ddca commit 51e06a7

6 files changed

Lines changed: 416 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ Deprecated names
134134
truncate-irrelevant ↦ Relation.Binary.PropositionalEquality.Core.refl
135135
```
136136

137+
* In `Function.Base`:
138+
```agda
139+
λ∙ : (.(x : A) → B x) → ((x : A) → B x)
140+
```
141+
137142
* In `Relation.Binary.Construct.Intersection`:
138143
```agda
139144
decidable ↦ _∩?_
@@ -181,6 +186,11 @@ New modules
181186

182187
* `Algebra.Properties.Semiring`.
183188

189+
* A variation on `Fin` seen as a `Nat` refinement, with better runtime representation and performance.
190+
```
191+
Data.Nat.Bounded.Base
192+
```
193+
184194
* `Data.List.Fresh.Membership.DecSetoid`.
185195

186196
* Various additions over non-empty lists:
@@ -296,6 +306,12 @@ Additions to existing modules
296306
```
297307
NB. the latter is based on `IsCommutativeRing`, with the former on `IsSemiring`.
298308

309+
310+
* In `Data.Bool.Properties`:
311+
```agda
312+
¬T-≡ : (¬ T x) ⇔ x ≡ false
313+
```
314+
299315
* In `Data.Fin.Permutation.Components`:
300316
```agda
301317
transpose[i,i,j]≡j : (i j : Fin n) → transpose i i j ≡ j
@@ -410,6 +426,7 @@ Additions to existing modules
410426
m⊔n∸[m∸n]≡n : ∀ m n → m ⊔ n ∸ (m ∸ n) ≡ n
411427
m⊔n≡m∸n+n : ∀ m n → m ⊔ n ≡ m ∸ n + n
412428
∣m-n∣≡m⊔n∸m⊓n : ∀ m n → ∣ m - n ∣ ≡ m ⊔ n ∸ m ⊓ n
429+
<″⇒< : _<″_ ⇒ _<_
413430
```
414431

415432
* In `Data.Product.Properties`:

src/Data/Bool/Properties.agda

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ open import Relation.Binary.PropositionalEquality.Properties
4141
using (module ≡-Reasoning; setoid; decSetoid; isEquivalence)
4242
open import Relation.Nullary.Decidable.Core
4343
using (True; yes; no; fromWitness ; toWitness)
44-
open import Relation.Nullary.Negation.Core using (contradiction)
44+
open import Relation.Nullary.Negation.Core using (¬_; contradiction)
4545
import Relation.Unary as U
4646

4747
open import Algebra.Definitions {A = Bool} _≡_
@@ -835,6 +835,10 @@ if-cong₂ _ refl refl = refl
835835

836836
open Relation.Nullary.Decidable.Core public using (T?)
837837

838+
¬T-≡ : {x} (¬ T x) ⇔ x ≡ false
839+
¬T-≡ {false} = mk⇔ (const refl) (const id)
840+
¬T-≡ {true} = mk⇔ (contradiction _) (λ ())
841+
838842
T-≡ : {x} T x ⇔ x ≡ true
839843
T-≡ {false} = mk⇔ (λ ()) (λ ())
840844
T-≡ {true} = mk⇔ (const refl) (const _)

src/Data/Fin/Base.agda

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@ cast {zero} {zero} eq k = k
5454
cast {suc m} {suc n} eq zero = zero
5555
cast {suc m} {suc n} eq (suc k) = suc (cast (cong ℕ.pred eq) k)
5656

57+
-- Tests showing that cast does compute on constructors
58+
59+
module _ .(eqs : suc m ≡ suc n) where
60+
61+
_ : cast eqs zero ≡ zero
62+
_ = refl
63+
64+
_ : .(eq : m ≡ n) (k : Fin m)
65+
cast eqs (suc k) ≡ suc (cast eq k)
66+
_ = λ eq k refl
67+
5768
------------------------------------------------------------------------
5869
-- Conversions
5970

@@ -77,7 +88,7 @@ fromℕ<″ : ∀ m {n} → .(m ℕ.<″ n) → Fin n
7788
fromℕ<″ zero {suc _} _ = zero
7889
fromℕ<″ (suc m) {suc _} m<″n = suc (fromℕ<″ m (ℕ.s<″s⁻¹ m<″n))
7990

80-
-- canonical liftings of i:Fin m to larger index
91+
-- Canonical liftings of i:Fin m to larger index
8192

8293
-- injection on the left: "i" ↑ˡ n = "i" in Fin (m + n)
8394
infixl 5 _↑ˡ_
@@ -91,6 +102,7 @@ _↑ʳ_ : ∀ {m} n → Fin m → Fin (n ℕ.+ m)
91102
zero ↑ʳ i = i
92103
(suc n) ↑ʳ i = suc (n ↑ʳ i)
93104

105+
94106
-- reduce≥ "m + i" _ = "i".
95107

96108
reduce≥ : (i : Fin (m ℕ.+ n)) .(m ℕ.≤ toℕ i) Fin n

0 commit comments

Comments
 (0)