coq-club AT inria.fr
Subject: The Coq mailing list
List archive
- From: Meven Lennon-Bertrand <mgapb2 AT cam.ac.uk>
- To: coq-club AT inria.fr
- Subject: Re: [Coq-Club] moving a definition to a different file
- Date: Thu, 12 Oct 2023 12:11:30 +0100
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cam.ac.uk; dmarc=pass action=none header.from=cam.ac.uk; dkim=pass header.d=cam.ac.uk; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dvQJmfYJ6BE+L2BWiURogzqIjeusIg5S8J/xcnuUktI=; b=LMa7+CEMW/l0Y7WSEocMvcdyvMy0YxANqlKlOatsQtuXlk4AfTM0iV1mx2aeaop4m3eeiHIFxNrPgadqCjqSbWknTmjtpiSiAkH5chSI/QeNtR9jmyoKw1bEKAKGyXD07t0lJvelZ+J5qiTXBE52oBPDF16Y1UusRt0JIbDF45NvD3RXNaAyQNX+FGEVMiq85x4G0SRKwy+DyHOMN+QVPStpGjeqRsCBwzN3O9HQ42p+E+gbVqg+PrGER4TdQ0lvCQoShlTXdNscWiAm3annbcWkuE5M9oKYqbLF6xNm05K4vqO502MPAVdKTkh9OLx7yqwQb6iRsVfWND5MMEP8wQ==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=B2HT0ZU6dSHQMIdPsguqGxIUo+l5opOXabkxXDMMXolskJ/DVB1SinGo4wUuoSUeRb0AcokUvmVFZVquRe3lkDeCXOR/tUEHkzXyO26WESW3ED5kT92GseyJnq+Imc2EpQwD30dJl8qfuGrTrpaMbfZGbWDK0tMfMqTfhbTfl7xHHT0nXzbMT7c5sIVJr0jsgM1EZZEAyLtjHYTxI7rL1m2s33bvwGPNVv2RMGF/f9KwDVdHiHqxEC/56s+qA7XPIKR1jVu4xYALj15QdKbLAAIr9zS1XPpacRHXa9o/PiDeb07V8lwymvfvrraxQzRAtWIzuDu8iQWLIPCiQdNt7g==
- Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=mgapb2 AT cam.ac.uk; spf=Pass smtp.mailfrom=mgapb2 AT cam.ac.uk; spf=Pass smtp.helo=postmaster AT GBR01-CWX-obe.outbound.protection.outlook.com
- Ironport-data: A9a23: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
- Ironport-hdrordr: A9a23:xQ1u0a2lfS6T7Zy5cIdjvAqjBUJyeYIsimQD101hICG9Lfb0qy n+pp4mPEHP4wr5OEtOpTnyAtjmfZq8z/5ICOwqUYtKMzOW2ldAQLsSlbcKhgeQYBEWldQtqZ uIEZIOa+EYZGIS5aia3OD7KadY/DDuytHUuQ609QYIcegFUdAH0+40MHf/LqUgLzM2f6bRWa DskvZvln6FQzA6f867Dn4KU6zqoMDKrovvZVojCwQ84AeDoDu04PqieiLoqCs2Yndq+/MP4G LFmwv26uGKtOy68AbV0yv2445NkNXs59NfDIini9QTKB/rlgG0Db4RLIGqjXQQmqWC+VwqmN 7Dr1MJONly0WrYeiWPrR7ky2DboUUTwk6n7WXdrWrooMT/Sj5/IdFGn5hlfhzQ7FdllM1g0Y pQtljp/aZ/PFflpmDQ9tLIXxZlmg6funw5i9MeiHRZTM83dKJRl4oC50lYea1wVx4S0LpXXN WGMfusq8q/KTihHj7kVyhUsZSRt00Ib1q7qhNogL3V79BU9EoJv3fwivZv3kvoz6hNOqWs19 60TZiAq4s+MPP+TZgNdtvpEvHHf1AlByi8eV6vHQ==
- Ironport-phdr: A9a23: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
- Ironport-sdr: 6527d46e_v/SUGLJgB1gNz2iS5Bp0j1PaGnAEFTuhXSq24IO7gY0ugkB lq2LHWXWaxM5YkMWWwwJOfhmy5Hsf62wDsVgNWA==
I support the fact that this is a common need. MetaCoq suffers quite a bit from lemmas that were not moved to their "right" place when proven, and now untangling the whole thing has become rather tricky (if I remember correctly, one of us tried such a large-scale reorganisation and got lost in it). Having a way to automate this task would make the cost of these reorganisations much lower, and hopefully with a lower access threshold we would have less of these ill-placed lemmas in further development.
Meven LENNON-BERTRAND Postdoc – Computer Lab, University of Cambridge www.meven.ac
On 11/10/2023 19:01, Abhishek Anand
wrote:
CAB44C3ksfCf8zyN6QUsUvx+Cj7ODac4mm48uBxxXnK3Mu94VEQ AT mail.gmail.com">My use case is quite common I think.When working in a proof in X.v, if we need to edit a definition D which either already exists in Y.v or doesn't exists but belongs there (X.v imports Y.v), we often write/copy D right there in X.v (often with Set Nested Proofs On). Then, during cleanup, we do need to move it to Y.v. Sometimes, the Y.v does not even actually exist.(For example, in our work, we follow a convention of having the specs functions defined in Y.cpp in Y_cpp_spec.v and the location of the latter is precisely determined by the location of the former.)With lots of imports and section variables and notations, it often takes even 20 minutes to upstream D to Y.vMost of the time is spent in figuring out the missing imports, which should be completely automatable, at least for most usecases: we can look into the fully elaborated definition of D in X.v (I hope Set Printing All always prints fully qualified names of all the referred-to constants). company-coq's jump to definition does a good job of splitting the fully qualified name into the logical path of the .vo file and the rest, although there are some corner cases.Set Printing All will miss the imports of files containing the notations used in D. But I think .glob files record where the notations were defined (I guess that's what coqdoc html uses to hyperlink notations to their definition sites, e.g. in this page, click at any reference of ≼ https://plv.mpi-sws.org/coqdoc/iris/iris.algebra.cmra.html)Our build system can tell the logical path of a .v file. Some parsing may be needed to figure out which notation scopes to open and which modules to open if the notations are hidden under a module. This is where some help from coqtop/coq-lsp would be nice.
Then, often some time is spent adding the missing section variables. Figuring out the "missing" section variables in Y may be tricky (especially if Y.v already exists and has some section variables) but under some common discipline, this should be doable. I do not yet have a formal characterization of this discipline but given that when I do it manually, it is never hard (it is often tedious), I expect there exists one that covers majority of use-cases. The IDE could try to instantiate the full definition of D X.v (after closing sections) with the existing section variables in Y.v to figure out which ones already exist and which ones need to be added. Typically, there are not more than 10 section variables so even some bruteforce approaches may be feasible.
It would be nice to offload this computation to coqtop/coq-lsp as much as possible instead of my GPT-generated elisps for company-coq, so that other IDEs can benefit more easily as well. One API could be to add the following to commands coqtop (I know coqtop well so I am using that as an example, but something similar may make sense for coq-lsp as well)
1) ExportContextInfoRelevantToLastSentence: when this command is sent just after a Definition/Inductive, e.g. D in X.v, it records all the contextual info relevant for the body of D to typecheck *exactly as written by the user*. the output could be in a file, say /tmp/D2) ImportContextInfo /tmp/D: when this command is sent at the destination point in Y.v, it will suggest all the missing imports, context variables, notation scope commands so that if the next command is D, it will typecheck exactly as written during the export.
(Please let me know if I should post these questions on the Coq zulip. I was not sure whether everyone who could help me is on Zulip. I myself tend to forget to open Zulip for years, but emails are harder to miss)
-- Abhishekhttp://www.cs.cornell.edu/~aa755/
On Wed, Oct 11, 2023 at 11:17 AM Jim Fehrle <jim.fehrle AT gmail.com> wrote:
What is your use case? It sounds like this would be useful to extract a definition to a simpler (minimal) environment for study or debugging. Or is it meant as a refactoring (inserting the definition into an existing file)?
I'm not aware of a command that outputs the information you need. It shouldn't be conceptually that difficult to add for someone who knows the internals. Doing your own parsing is likely fragile because parsing Coq input is complex (eg interpreting notations).
It would be good if tools like this could be integrated as plugins in Coq GUIs. However, I'm not aware of any plans to support that.
Jim
On Tue, Oct 10, 2023, 9:22 AM Abhishek Anand <abhishek.anand.iitg AT gmail.com> wrote:
I have been planning to build a tool to move a definition/inductive/fixpoint (no proof script, for now)from one file to another file. Has someone built something like it already?
The objective is to change the environment at the destination so that the exact text of the definition type checks at the destination (vs elaborating the definition e.g. using Set Printing All).It seems possible for the tool to automatically add the missing imports and missingsection typeclass variables (under certain discipline assumptions). Obtaining the body of the definition at the source location after closing sections doing "Set Printing All" seems to be very helpful here, as is "Locate" and "Locate Library" at the destination, though I haven't yet figured out all the details.What I have less clue about is notations: how to recreate the same notation environment at the destination?Is there a coqtop query to print the state of open notation scopes at a point?Maybe I can read the .glob files to figure out where the notations are defined and import those files. But I would also need to parse the notation declarations to figure out which scopes to open. Some coqtop support would make things much easier.
Also, if people have some corner cases in mind, please let me know.
-- Abhishekhttp://www.cs.cornell.edu/~aa755/
- [Coq-Club] moving a definition to a different file, Abhishek Anand, 10/10/2023
- Re: [Coq-Club] moving a definition to a different file, Jim Fehrle, 10/11/2023
- Re: [Coq-Club] moving a definition to a different file, Abhishek Anand, 10/11/2023
- Re: [Coq-Club] moving a definition to a different file, Jim Fehrle, 10/11/2023
- Re: [Coq-Club] moving a definition to a different file, Abhishek Anand, 10/12/2023
- Re: [Coq-Club] moving a definition to a different file, Jim Fehrle, 10/12/2023
- Re: [Coq-Club] moving a definition to a different file, Abhishek Anand, 10/12/2023
- Re: [Coq-Club] moving a definition to a different file, Meven Lennon-Bertrand, 10/12/2023
- Re: [Coq-Club] moving a definition to a different file, Jim Fehrle, 10/11/2023
- Re: [Coq-Club] moving a definition to a different file, Abhishek Anand, 10/11/2023
- Re: [Coq-Club] moving a definition to a different file, Jim Fehrle, 10/11/2023
Archive powered by MHonArc 2.6.19+.