Zulip Chat Archive

Stream: general

Topic: proposal for new `simp` syntax


Scott Morrison (May 31 2020 at 06:43):

How about being able to write:

simp : T

which fails unless the resulting goal unifies with the type T? This would allow some flexibility with non-terminal simps. It's possible to arrange this already with suffices, but it takes two lines and some boilerplate.

Scott Morrison (May 31 2020 at 06:43):

We could also have simp at h : T to indicate the expected type of the new hypothesis.

Mario Carneiro (May 31 2020 at 06:46):

This looks the same as simp, change T

Mario Carneiro (May 31 2020 at 06:47):

I don't think this makes the simp any less brittle though

Johan Commelin (May 31 2020 at 06:47):

try { simp; change T }?

Mario Carneiro (May 31 2020 at 06:47):

why try?

Johan Commelin (May 31 2020 at 06:47):

Aah, you say that it's enough if the change T fails

Johan Commelin (May 31 2020 at 06:47):

fair enough

Mario Carneiro (May 31 2020 at 06:48):

If simp closes the goal, I guess this would also be a simp : T failure

Mario Carneiro (May 31 2020 at 06:48):

so I think simp, change T is correct

Mario Carneiro (May 31 2020 at 06:48):

except that change T can also do defeq changes, which may or may not be a good idea here, hard to tell

Mario Carneiro (May 31 2020 at 06:49):

I think there is a assert_goal tactic, usually used for tests, that does no defeq changes

Scott Morrison (May 31 2020 at 06:58):

Good points: simp, change T is indeed all that I wanted.

Scott Morrison (May 31 2020 at 06:59):

It's true that this breaks just as often as just a non-terminal simp: the point is that hopefully it's fixable, because even when it's broken you know what state you need to get back to for the rest of the proof to go through.

Johan Commelin (May 31 2020 at 07:09):

I think suffices : T, simpa is a bit more stable

Yury G. Kudryashov (May 31 2020 at 07:27):

The main downside of suffices : T, simpa is that when a new lemma is added to the default simp set, you miss an opportunity to make your proof use it.

Kenny Lau (May 31 2020 at 07:29):

proposal for new simp syntax: don't

Yury G. Kudryashov (May 31 2020 at 07:30):

And with simp, change T or simp, guard_target T you (a) see which simp failed, (b) can choose whether to fix it with simp [-new_lemma] or adjust the proof.

Mario Carneiro (May 31 2020 at 07:35):

you don't know what new_lemma is necessarily though

Mario Carneiro (May 31 2020 at 07:35):

worst case you could squeeze_simp it and then start deleting lemmas until it matches the claim again

Mario Carneiro (May 31 2020 at 07:36):

better is just to use simp only so that this doesn't happen

Scott Morrison (May 31 2020 at 07:41):

simp only still makes me sad, that us poor humans are writing out (even if it's just point and click these days) irrelevant details. I'll live.

Mario Carneiro (May 31 2020 at 07:42):

It's more verbose than it could be, but I think this is what we should be aiming for: a slow but powerful tactic that rewrites itself to a fast but maybe less comprehensible certificate

Mario Carneiro (May 31 2020 at 07:43):

It would be even better if the certificate could be out of the source itself, but it needs to be version controlled which makes things tricky

Scott Morrison (May 31 2020 at 07:54):

certificates in an unobtrusive parallel file would be fantastic :-)

Mario Carneiro (May 31 2020 at 07:55):

I guess the nolints file is a precedent for this approach

Mario Carneiro (May 31 2020 at 08:00):

Here's an architecture that could work without too much in the way of changes to lean: Certificates are kept in some file, indexed by declaration name, like

foo.mythm: CERT
foo.otherthm: CERT2

Then there is a command like load_certificates "foo.cert" that will use IO to read the file and create declarations foo.mythm.cert1 : string := "CERT" (or whatever the appropriate data structure is for the certificate). Finally, fancy_tactic, when used in foo.mythm, checks if definition foo.mythm.cert1 exists, and if so uses the certificate. For this last part I think we need extra support because tactics don't have access to the currently elaborating definition IIUC.

Yury G. Kudryashov (May 31 2020 at 08:00):

Mario Carneiro said:

you don't know what new_lemma is necessarily though

If we're talking about code in mathlib, then the one who adds a lemma fixes all compile failures.

Mario Carneiro (May 31 2020 at 08:01):

assuming the change is small enough that it is easy to locate which new lemma is the culprit

Mario Carneiro (May 31 2020 at 08:01):

if the code is being rehabilitated, the problem is much worse

Mario Carneiro (May 31 2020 at 08:03):

The certificate file could also be a machine generated lean source file, like

theorem foo.mythm.cert1 : technical lemma := by fancy_tactic using incomprehensible_sequence_of_characters

Bryan Gin-ge Chen (May 31 2020 at 08:16):

Is this similar to #2300?

Scott Morrison (May 31 2020 at 08:22):

#2300 is doing something related, but a bit crazy. It is (I think) serialising the proof term generated by each begin ... end block into a file on disk, and the next time the begin ... end block is compiled it intercepts that and attempts to just load the previous term from disk and typecheck it.

Mario Carneiro (May 31 2020 at 08:33):

You could use exprs as the certificate but I'm assuming that particular tactics can do a lot better with smaller certificates, like the lemma list in simp only

Kevin Buzzard (May 31 2020 at 08:43):

The advantage of simp : T over suffices : T, by simpa using this is that when the proof breaks it's easy to fix (by switching back to suffices) but there's also the option to improve the proof.


Last updated: Dec 20 2023 at 11:08 UTC