Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] Curly braces in Coq notations

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] Curly braces in Coq notations


Chronological Thread 
  • From: Gaëtan Gilbert <gaetan.gilbert AT skyskimmer.net>
  • To: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] Curly braces in Coq notations
  • Date: Sun, 22 Oct 2023 18:04:25 +0200
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=gaetan.gilbert AT skyskimmer.net; spf=Pass smtp.mailfrom=gaetan.gilbert AT skyskimmer.net; spf=Pass smtp.helo=postmaster AT relay8-d.mail.gandi.net
  • Ironport-data: A9a23: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 vSRD6ACOXm4
  • Ironport-hdrordr: A9a23:STYQoKqTaJGEEzC0K33Pe6IaV5oYeYIsimQD101hICG9Afbo9f xG+85rsyMc6QxhP03I/OrrBEDuex/hHPJOkOws1PKZLW3bUQiTQ72Kj7GO/9SIIUSXndK1l5 0QEJSWY+eQMbEVt6bHCUWDfeoI8Z2o143tv+/Fyh5WPHhXV50=
  • Ironport-phdr: A9a23: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
  • Ironport-sdr: 6535480b_LZ0wko2ey/EEnWIeaVHQCGwiQAJ6+N7OjWgDIBYGdmVXFX5 w9mT7KBzaNQCjRs2Ok6IE4K6gilSiID0xGQKaiA==

There is some special handling of patterns `{ one_nonterminal }` in a constr
notation.
I don't know much about it (I just grepped `"{"` in the code) but at least in
your example it seems to be possible to work around it with an auxiliary custom entry:

From Coq Require Import Strings.String. Import String.

Declare Custom Entry foo.
Declare Scope foo_scope.
Open Scope foo_scope.

Notation "*" :=
"*"%string (in custom foo)
: foo_scope.

Declare Custom Entry foo_aux.

Notation "<{ x }>" := x
(x custom foo_aux) : foo_scope.

Notation "{ P } e { Q }" :=
("<{ {" ++ P ++ "} " ++ e ++ " {" ++ Q ++ "} }>")%string
(in custom foo_aux,
e custom foo,
P custom foo,
Q custom foo) : foo_scope.

(* works *)
Compute ( <{ { * } * { * } }> ).


Gaëtan Gilbert

On 22/10/2023 17:50, Benjamin Pierce wrote:
Dear Coq folk,

I'm having my every-couple-of-years try at making the Imp and Hoare logic
notations nicer in Software Foundations.  At the moment, we use

   <{ c }>

for bare Imp commands and

   {{P}} c {{Q}}

for Hoare triples.  I'd like to change the latter to

   <{ {P} c {Q} }>

but this doesn't appear to work, as the simple experiment below shows. 
Indeed, it appears that the curly braces are actually the problem (replacing
them with parens gives the result I expected).

Many thanks for any insight or advice,

   - Benjamin

From Coq Require Import Strings.String. Import String.

Declare Custom Entry foo.
Declare Scope foo_scope.
Open Scope foo_scope.

Notation "*" :=
  "*"%string (in custom foo)
    : foo_scope.

(* Defining a "hoare triple like" notation with parens works: *)
Notation "<{ ( P ) e ( Q ) }>" :=
  ("<{ (" ++ P ++ ") " ++ e ++ " (" ++ Q ++ ") }>")%string
    (e custom foo,
      P custom foo,
      Q custom foo) : foo_scope.
Compute ( <{ ( * ) * ( * ) }> ).

(* But doing the same thing with curly braces does not: *)
Notation "<{ { P } e { Q } }>" :=
  ("<{ {" ++ P ++ "} " ++ e ++ " {" ++ Q ++ "} }>")%string
    (e custom foo,
      P custom foo,
      Q custom foo) : foo_scope.
(* Syntax error here: *)
Compute ( <{ { * } * { * } }> ).




Archive powered by MHonArc 2.6.19+.

Top of Page