Skip to Content.
Sympa Menu

coq-club - [Coq-Club] Question about permutations, sorting and reification

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

[Coq-Club] Question about permutations, sorting and reification


Chronological Thread 
  • From: Thomas Sewell <tals4 AT cam.ac.uk>
  • To: "coq-club AT inria.fr" <coq-club AT inria.fr>
  • Subject: [Coq-Club] Question about permutations, sorting and reification
  • Date: Thu, 31 Mar 2022 13:35:43 +0000
  • Accept-language: en-GB, en-US
  • 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=N4K+WMhv43gCC7agl/WGCsuCoHANEGHxdahMFH+2f30=; b=UIyKw6v8MM1holX3D3ZZLF/IVMwVJgOzXBVasEPjYKN6ovlK4PGCFNtHm1rkPjXL80khystM1Mxq7ydc6CU2BNU+DrzSqUDUMfEvyFUNAe1J0YG8vgpWYgtVwTl54WIg7rm+5Arj9kv3HF6nHNn+lNkchycZhtFL92QMS/6KaAY0nbvxM6l42n3Y5bBCgx8wtBqgCF8r/LOmKnOtWl6kKKQu9SJlkKYDU3Zhe2cVMamYbuTjJdY1njOBiULZWQqYVfLkgUCJkh/FIZ2TwLV3l4i1sKFy5HAt5ehVCF/ADIP233IkDm6mXEsi+aBlkhxgnkKe2OSWIHKaOdGMigB31w==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GMNAYSYpr7da0Ff8gqE2Gs3mo82ZfN9/dzhEhuDoDQekR8ISHjLR3598FilshvptC2SUjpXKV40I7ei8zpKIDzCevMYy/wb5gTPUw7TmL2wYaSRk6ekMOD2fxp1mlffpZVqRfmFwnRyqdU0hUoW5ik2G9KIjG3E47h6OaOM/izhP0ZYiPZCqN9Xm1LJteE219ord0OEhHVLdvNQAjPcynpGoCl6vVVj1diSdDGb7JJvJa3IfmmYouWDBMyMPG78JTxEmAe+J+4iXNLluQod7ONwBgZT0Jl97Qfp2wfiCxRK1JuwYQAqLERTN78KfYBmZElxhMAf5ymgGJdtf277hCg==
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=tals4 AT cam.ac.uk; spf=Pass smtp.mailfrom=tals4 AT cam.ac.uk; spf=Pass smtp.helo=postmaster AT GBR01-CWL-obe.outbound.protection.outlook.com
  • Ironport-data: A9a23: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
  • Ironport-hdrordr: A9a23:xG4XUam/k/fxPlnjn3BxFvne6i/pDfI53DAbv31ZSRFFG/Fw8P rFoB1773TJYVkqNk3I9ersBEDEewK+yXcK2+gs1MaZMDUO0VHARL2Kr7GD/9SKIULDH4BmpM VdmtBFebjNMWQ=
  • Ironport-phdr: A9a23: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 aSBHDzNQvRYhP19djIz4DI=
  • Ironport-sdr: oKlfwrbIUY/aOSJg4dKhs4J5ACzAsVuK8sXl+uk46M9/mDM9ukfNklluJXKfaXapiTZnRGHUQ6 1F4yDqB9TPu+5zSNtswBodVGAlt0PYim2TYRzvSYdlGxeF4uxJ0QGT3dBbJxiXWWTSbAYo8PdX 98JRRiOjM0EbHMlaNO+tQ9o1JJjeoMwkl5ssxUOow+He0bcYhv4ChLY44ve8cJkEtqbxPkPF2i aJ4Su4yKjXUbyKdKpgYtzWUUYJBl/xgclOQfAiET0VrlfogNqIJ4ybuw1tTYxVdFJlI300FbL0 J7HEjL6lmL0nLFHmngyeiQRT
  • Msip_labels:

Hello, apologies about the beginner questions. I'm playing with a fiddly
exercise trying to learn a bit about Coq, and I'd be interested in any
feedback.

I'm revisiting a toy problem which I've also attempted in other tools
(Isabelle/HOL, HOL4, ACL2). The idea is to simplify Permutation goals,
e.g. "Permutation (x :: y :: z :: bs) ((y :: cs) ++ (x :: ds))" might reduce to
"Permutation (z :: bs) (cs ++ ds)".

This problem is good for highlighting performance aspects, since you can easily
scale up the goals by computing longer lists (e.g. with seq) and time your
tactic on bigger problems. In Isabelle and HOL4, the aim is use SML snippets
effectively, but in ACL2 and Coq it looks like reification/reflection is the
way to go.

I skimmed the reflection chapter of Chilpala's CPDT book to see some examples.
I have reification working based on an approach I saw there, which uses (or
abuses?) Ltac matching to identify syntactically equal terms. This is then used
to assign a number to all the list elements with equal elements (e.g. the
repeated x and y above) getting the same number. Unfortunately this requires a
lot of term comparisons, roughly O(n^2) in the number of unique terms. Could we
do better? Probably an OCaml plugin has access to a term order and can build a
binary tree, but this seems like a heavy replacement for a couple of Ltac
functions. Is there anything more efficient I can do while staying mostly in
Ltac (or Ltac2 or similar)?

With the list elements numbered, the idea is then to sort them on each side,
scan, and move duplicated elements into a special comparison. This requires a
(roughly) a sort operation on list (nat * A), i.e. sorting actual elements (of
unknown type) by comparing computational identifiers (here nat, but this could
be replaced with a more efficient type).

This is where things start going wrong. There's a merge-sort provided in the
standard theories, but it gets its type parameter as a module parameter. To my
understanding, there's no way to use it polymorphically to sort list (nat * A)
or anything similar. Is that right? Is there a mechanism I haven't thought of?

The same seems to be true of other structures in the standard library (e.g. the
MSet implementations backed by sorted trees) which could be used to sort
indirectly. I also collided with some anomalies when trying to instantiate some
modules, but apparently some of these are fixed in other versions of Coq, so
I'll skip reporting them in detail and hope the issue goes away in time.

Was I wrong to assume that this part would be easy?

I've finished my exercise via the simple but clunky fix: copy the Mergesort
library locally and factor out most of the implementation and some of the
proofs into a part that uses a section variable rather than a module parameter
to pass the comparison function. Can anyone think of a better way?

Best regards and thanks for your patience,
    Thomas.



Archive powered by MHonArc 2.6.19+.

Top of Page