Skip to content

feat: explicit defeq attribute #8419

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

Draft
wants to merge 43 commits into
base: nightly-with-mathlib
Choose a base branch
from

Conversation

nomeata
Copy link
Collaborator

@nomeata nomeata commented May 20, 2025

This PR introduces an explicit defeq attribute to mark theorems that can be used by dsimp. The benefit of an explicit attribute over the prior logic of looking at the proof body is that we can reliably omit theorem bodies across module boundaries. It also helps with intra-file parallelism.

If a theorem is syntactically defined by := rfl, then the attribute is assumed and need not given explicitly. This is a purely syntactic check and can be fooled, e.g. if in the current namespace, rfl is not actually “the” rfl of Eq. In that case, some other syntax has be used, such as := (rfl). This is also the way to go if a theorem can be proved by defeq, but one does not actually want dsimp to use this fact.

The defeq attribute will look at the type of the declaration, not the body, to check if it really holds definitionally. Because of different reduction settings, this can sometimes go wrong. Then one should also write := (rfl), if one does not want this to be a defeq theorem. (If one does then this is currently not possible, but it’s probably a bad idea anyways).

The set_option debug.tactic.simp.checkDefEqAttr true, dsimp will warn if could not apply a lemma due to a missing defeq attribute.

With set_option backward.dsimp.useDefEqAttr.get false one can revert to the old behavior of inferring rfl-ness based on the theorem body.

Both options will go away eventually (too bad we can’t mark them as deprecated right away, see #7969)

Meta programs that generate theorems (e.g. equational theorems) can use inferDefEqAttr to set the attribute based on the theorem body of the just created declaration.

This builds on #8501 to update Init to @[expose] a fair amount of definitions that, if not exposed, would prevent some existing := rfl theorems from being defeq theorems. In the interest of starting backwards compatible, I exposed these function. Hopefully many can be un-exposed later again.

A mathlib adaption branch exists that includes both the meta programming fixes and changes to the theorems (e.g. changing := by rfl to := rfl).

With the module system there is now no special handling for defeq theorem bodies, because we don’t look at the body anymore. The previous hack is removed. The defeq-ness of the theorem needs to be checked in the context of the theorem’s type; the error message contains a hint if the defeq check fails because of the exported context.


TODO:

  • The attribute does not play as well with parallelism as I hoped.
  • With private theorems or definitions, the defeq check should run in withoutExporting. But it seems that not even the type check for a private theorem happens in that context yet, so maybe not there yet?

@nomeata nomeata added the changelog-language Language features, tactics, and metaprograms label May 20, 2025
@github-actions github-actions bot added the changes-stage0 Contains stage0 changes, merge manually using rebase label May 20, 2025
@nomeata nomeata force-pushed the joachim/dsimp-attr branch from f694af3 to 88c553f Compare May 20, 2025 14:52
@github-actions github-actions bot added the toolchain-available A toolchain is available for this PR, at leanprover/lean4-pr-releases:pr-release-NNNN label May 20, 2025
leanprover-community-mathlib4-bot added a commit to leanprover-community/batteries that referenced this pull request May 20, 2025
leanprover-community-mathlib4-bot added a commit to leanprover-community/mathlib4 that referenced this pull request May 20, 2025
@leanprover-community-bot
Copy link
Collaborator

leanprover-community-bot commented May 20, 2025

Mathlib CI status (docs):

@leanprover-community-bot leanprover-community-bot added the breaks-mathlib This is not necessarily a blocker for merging: but there needs to be a plan label May 20, 2025
leanprover-community-mathlib4-bot added a commit to leanprover-community/batteries that referenced this pull request May 20, 2025
leanprover-community-mathlib4-bot added a commit to leanprover-community/mathlib4 that referenced this pull request May 20, 2025
leanprover-community-mathlib4-bot added a commit to leanprover-community/batteries that referenced this pull request May 21, 2025
leanprover-community-mathlib4-bot added a commit to leanprover-community/mathlib4 that referenced this pull request May 21, 2025
@leanprover-community-bot leanprover-community-bot added builds-mathlib CI has verified that Mathlib builds against this PR and removed breaks-mathlib This is not necessarily a blocker for merging: but there needs to be a plan labels May 21, 2025
@nomeata nomeata force-pushed the joachim/dsimp-attr branch from 1a1eb75 to 16e9976 Compare May 27, 2025 14:17
This PR adds the `@[expose]` attribute to many functions (and changes
some theorems to be by `:= (rfl)`) in preparation for the `@[defeq]`
attribute change in #8419.
@nomeata nomeata force-pushed the joachim/dsimp-attr branch from 3695c03 to 04a2875 Compare May 27, 2025 14:48
@github-actions github-actions bot added changes-stage0 Contains stage0 changes, merge manually using rebase and removed changes-stage0 Contains stage0 changes, merge manually using rebase labels May 27, 2025
leanprover-community-mathlib4-bot added a commit to leanprover-community/batteries that referenced this pull request May 27, 2025
leanprover-community-mathlib4-bot added a commit to leanprover-community/mathlib4 that referenced this pull request May 27, 2025
@leanprover-community-bot leanprover-community-bot added breaks-mathlib This is not necessarily a blocker for merging: but there needs to be a plan builds-mathlib CI has verified that Mathlib builds against this PR and removed builds-mathlib CI has verified that Mathlib builds against this PR breaks-mathlib This is not necessarily a blocker for merging: but there needs to be a plan labels May 27, 2025
@nomeata nomeata changed the title feat: explicit rfl attribute feat: explicit defeq attribute May 28, 2025
github-merge-queue bot pushed a commit that referenced this pull request May 28, 2025
This PR adds the `@[expose]` attribute to many functions (and changes
some theorems to be by `:= (rfl)`) in preparation for the `@[defeq]`
attribute change in #8419.
@nomeata nomeata force-pushed the joachim/dsimp-attr branch from bb2092f to ae54e5b Compare May 28, 2025 08:15
leanprover-community-mathlib4-bot added a commit to leanprover-community/batteries that referenced this pull request May 28, 2025
leanprover-community-mathlib4-bot added a commit to leanprover-community/mathlib4 that referenced this pull request May 28, 2025
@leanprover-community-bot leanprover-community-bot added breaks-mathlib This is not necessarily a blocker for merging: but there needs to be a plan and removed builds-mathlib CI has verified that Mathlib builds against this PR labels May 28, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
breaks-mathlib This is not necessarily a blocker for merging: but there needs to be a plan changelog-language Language features, tactics, and metaprograms changes-stage0 Contains stage0 changes, merge manually using rebase toolchain-available A toolchain is available for this PR, at leanprover/lean4-pr-releases:pr-release-NNNN
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants