Skip to content

[ refactor ] Data.Fin.Properties of decidable equality, plus knock-ons #2740

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

Open
wants to merge 15 commits into
base: master
Choose a base branch
from

Conversation

jamesmckinna
Copy link
Contributor

@jamesmckinna jamesmckinna commented Jun 21, 2025

This PR supersedes the knock-on changes for Permutation in #2738 and adds some new lemmas about transpose which simplify the dependency graph. The contribution can be seen as a belated corollary to the changes introduced in #645 / #1732 .

Downstream, we might want to revisit the dependency graph now between

  • Relation.Nullary.Decidable
  • Axiom.UniquenessOfIdentityProofs
  • Relation.Binary.PropositionalEquality

in putting these pieces together?

Outstanding (naming) issue: I followed the existing Data.Nat.Properties.≟-diag convention in Data.Fin.Properties, and then backported the refl instantiation of this to Data.Nat.Properties.≟-diag-refl... but it occurs to me that it's hard to imagine instances of ≟-diag which would use a general equality, and even if they were to, the use of diag ought (?) to be a codeword for a repeated argument/reflexive equality? I just couldn't face the deprecation headache though... so a v3.0 downstream breaking change might be in order?

@jamesmckinna
Copy link
Contributor Author

jamesmckinna commented Jun 26, 2025

In the absence of a review yet, I'll lift out the bug fixes as a separate PR, as per @JacquesCarette 's comment on #2743

punchOut {i = i} {πˡ (πʳ (punchIn i j))} _ ≡⟨ punchOut-cong i (inverseˡ π) ⟩
punchOut {i = i} {punchIn i j} _ ≡⟨ punchOut-punchIn i ⟩
j ∎
from (to j)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know the original is likely too wide, but it is oh so much more readable! Could we refrain from reformatting in those cases?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, but I can't help but disagree, not Keats given that in Feijen's original presentation, the justifications were indeed supposed to be interleaved with the expressions being calculated. The long lines break any kind of readability.

But happy to revert against a downstream discussion issue/PR.

punchOut {i = πʳ i} {πʳ (πˡ (punchIn (πʳ i) j))} _ ≡⟨ punchOut-cong (πʳ i) (inverseʳ π) ⟩
punchOut {i = πʳ i} {punchIn (πʳ i) j} _ ≡⟨ punchOut-punchIn (πʳ i) ⟩
j ∎
to (from j)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@@ -42,17 +35,31 @@ transpose i j k with does (k ≟ i)
-- Properties
------------------------------------------------------------------------

transpose-iij : ∀ {n} (i j : Fin n) → transpose i i j ≡ j
transpose-iij i j with j ≟ i in j≟i
... | true because [j≡i] = sym (invert [j≡i])
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since you're actually using the proof here, does laziness (i.e. avoiding yes) matter?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps not!

≡-irrelevant : Irrelevant {A = Fin n} _≡_
≡-irrelevant = Decidable⇒UIP.≡-irrelevant _≟_

≟-diag : (eq : i ≡ j) → (i ≟ j) ≡ yes eq
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I almost commented on the CHANGELOG that surely these lemmas are instances of things that are true about combinations of Decidable and Irrelevant, but decided to wait until I saw the proofs... and indeed.

So, do these pay for themselves? I do agree that at the use-site, it sure looks nicer. I'm inclined to say yes.

@@ -110,6 +110,12 @@ m ≟ n = map′ (≡ᵇ⇒≡ m n) (≡⇒≡ᵇ m n) (T? (m ≡ᵇ n))
≟-diag : (eq : m ≡ n) → (m ≟ n) ≡ yes eq
≟-diag = ≡-≟-identity _≟_

≟-diag-refl : ∀ n → (n ≟ n) ≡ yes refl
≟-diag-refl _ = ≟-diag refl
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one, on the other hand, seems to fail the Fairbairn test.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, the reflexive case us what I use for Fin, and I dislike having the APIs for Nat and Fin diverging... what is really prefer would be to only have diag refer to the refl version but... legacy!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants