[isabelle-dev] Notes on datatype_new list

Makarius makarius at sketis.net
Fri May 23 23:39:05 CEST 2014


The following is relevant to the BNF guys, with continously growing team 
strength (according to Isabelle/aa7f051ba6ab).

Today we've had a tutorial with mostly fresh users, which is always useful 
to see remaining snags.  There were also 2-3 experienced Coq users, who 
have the usual problems of a different kind: being stuck to Emacs or using 
strange Window managers like Xmonad.


Examples for beginners usually use the list datatype, and the Prover IDE 
makes it easy to find its definition.  Many users started looking in the 
HOL theories routinely, to get an idea how things are defined and how 
proofs are done with them.  Navigation makes the sources more accessible 
and raises the demands for their quality.  (I have ocasionally cleaned up 
typical hyperlink target positions in Pure, to make them look more 
obvious, if users happen to enter there.)


For the new high-end BNF version of 'a list there were a few funny 
effects.

(1) Its definition looks terrific:

datatype_new (set: 'a) list (map: map rel: list_all2) =
     =: Nil (defaults tl: "[]")  ("[]")
   | Cons (hd: 'a) (tl: "'a list")  (infixr "#" 65)

It means it can no longer serve as example template for your own datatype 
definitions.  Note that I have already put the independent Seq.thy example 
in a prominent place some years ago, to decouple basic examples from the 
particularly difficult List.thy.

(2) Some users somehow used the "hd" and "tl" selector specifications 
above as suggestion to define primitive recursive functions, e.g. like 
this:

primref foo where
   "foo [] = ..."
| "foo (Cons hd tl) = ..."

Of course this fails, since these are constants, not variables.  It 
results in type-inference errors that beginners find hard to understand, 
and the Prover IDE has no position information about type errors yet.

(3) A genuine name space problem: "list" is concealed, and thus cannot be 
completed in semantic completion.

Looking briefly through the sources, I merely found some odd workarounds 
in BNF_Util.typedef -- it is usually worth investing the time to sort out 
the fine points that lead to such complications and eliminate them:
(*TODO: is this really different from Typedef.add_typedef_global?*)


 	Makarius


More information about the isabelle-dev mailing list