[isabelle-dev] NEWS: text cartouches

Makarius makarius at sketis.net
Thu Jan 23 00:28:55 CET 2014

* Lexical syntax (inner and outer) supports text cartouches with
arbitrary nesting, and without escapes of quotes etc.

This refers to Isabelle/3eb7bcca5b90.

LCF-style provers had funny quotes, backquotes, antiquotes etc. from early 
on, and there were occasional attempts to get rid of them.  Just dropping 
quotes and pretending that there is just one big syntax ends up in a 
melange that is hard to define, and sub-languages tend to fight over 
different kinds of keywords versus identifiers etc.  (Even some Coq 
experts now regret that they had gone that way many years ago.)

Postmodern Isabelle/Isar has accumulated various alternative quotation 
forms with slightly different rules for nesting and escapes:

   {* ... *}
   " ... "
   ` ... `
   '' ... ''

Together with antiquotations this quickly runs into limitations of 
syntactic expression, of what is conceptually no problem: the arbitrary 
nesting of "domain-specific formal languages".


lemma "A ⟶ A" by (tactic {* rtac @{thm impI} 1 *})

ML {* @{lemma "A ⟶ A" by (tactic "rtac @{thm impI} 1")} *}

text {* @{ML "@{lemma \"A ⟶ A\" by (tactic \"rtac @{thm impI} 1\")}"} *}
   -- "!?!?!?"

Gladly the ancient Egyptians had a different way to "quote" the royal name 
of the Pharao: http://en.wikipedia.org/wiki/Cartouches

An alternative explanation for the name for this syntactic device is 

In Isabelle it looks like this: symbols \<open> ... \<close> define the 
boundary of a text range, with arbitrary nesting and no escapes nor 
special rules for the body.  The unicode rendering uses the rarely used 
codepoints ‹ ... › to make this look nice and non-intrusive.  Both the 
Isabelle symbols and unicode glyphs are sufficiently exotic to stay 
outside of usual application languages.

A playground with an exploration of possibilities is in 
$ISABELLE_HOME/src/HOL/ex/Cartouche_Examples.thy e.g. see the "Uniform 
nesting of sub-languages" example:

         @{term_cartouche ‹STR ""›};
         @{term_cartouche ‹STR "abc"›};
         @{term_cartouche ‹STR "abc" @ STR "xyz"›};
         @{term_cartouche ‹STR "⏎"›};
         @{term_cartouche ‹STR "\001\010\100"›}

Here the inner quotes are Isabelle/HOL string literals!

Isabelle/jEdit already knows about these special parantheses, so the 
ragular jEdit operations to work with "code blocks" can be used, e.g. to 
select or navigate through the nested structure.

For the moment this is just some fresh air to get new ideas.  I don't 
propose any bigger reforms just now.

The only concrete change that is already active is a slightly simplified 
syntax for the @{rail} antiquotation, which avoids escapes of backslashes 
and quotes in the body.  (See examples in $ISABELLE_HOME/src/Doc/IsarRef 
and elsewhere.)


More information about the isabelle-dev mailing list