[isabelle-dev] performance regression of typedef command

Makarius makarius at sketis.net
Fri Mar 26 21:33:22 CET 2010


On Fri, 26 Mar 2010, Brian Huffman wrote:

> In Isabelle 2009, the typedef takes about 5 hundredths of a second on
> my machine, with another few hundredths for the "by simp" part.
>
> In the current development version, with the new "local theory"
> typedef package, the typedef takes nearly *half a second*.

Depends what you mean by current development version.  In cef3c78ace0a 
it's not so slow anymore due to some basic tuning of type signature merge 
operations, which have been historically only used at the beginning of a 
theory but now show up whenever types are declared within a local context.


> In exchange for the extreme slowness, we get the ability to use typedef 
> commands inside locales.

There is much more to the local theory infrastructure than making things 
work in a locale, which is just one example of a "local theory target".

Several years ago we've had a big mess of certain attempts to implement 
structured specifications, i.e. specifications that depend local context 
information, or build up local contexts.  The local theory concept has 
successfully integrated all this and provides a general high level 
infrastructure both for local packages (definition, theorem, inductive, 
function, primrec, etc.), and for local theory targets (locale, class, 
instantiation, overloading, global theory etc.).


Here are just two current examples what you gain from that.

(1) Sane specification primitives for implementing packages.  You say 
Local_Theory.define x t and get a literal x == t (for a locally fixed 
hypothetical x).  The infrastructure takes care of the rest, since version 
09e238561460 the dreaded "hidden polymorphism" is treated here as well, 
i.e. the pathological situation where a definition c == t has more type
variables in t than in the type of t.

In your TPHOLs 2005 paper you've stumbled over that and had to use typedef 
(open) as a workaround.  I've later added some strange workarounds to 
typedef to amend that, but it is a bit much to ask this of every package 
implementation.  See here eafaa9990712 how this cruft disappears at last.

Many other packages were suffering from the same problem, and you can 
hardly call it a bug of these packages, but a misunderstanding about the 
proper specification primitives.  E.g. here is an example workaround 
http://isabelle.in.tum.de/repos/isabelle/annotate/2623b23e41fc/src/HOL/Quickcheck.thy#l148 
to make the function package work with hidden polymorphism of an internal 
inductive definition -- the final result does not even have these extra 
type variables.  (This one is still not updated, the parasitic 'a itself 
argument is no longer necessary.)

In fact, it was Alex who pointed out that Local_Theory.define is the 
proper place to hide such oddities from the user and package implementor, 
and concenrate on the application logic instead.


(2) Control over consequences within the application context, especially 
name spaces and concrete syntax.  Since the idea of interpreting local 
theory content in other situations has been part of the game from the very 
beginning, it opens the possibility for mechanisms to control name space 
scopes and availability of concrete syntax in certain ranges of the formal 
theory text.  You can even do it right now in this simplistic way:

locale loc
begin

typedef 'a foo  ("** _ **") = "{undefined :: 'a}" by simp

typ "nat foo"
typ "** nat **"

end

typ "nat loc.foo"

interpretation loc .

typ "nat foo"
typ "** nat **"


Here the mechanisms to delimit local ranges need some further 
refinements, but you should get the idea even now.

Moreover, one can think of turning the present global theory target into 
something that is closer to locale infrastructure, i.e. keep the name 
space accesses and syntax separate from the other content.  Then we are 
back to the recent discussion about controling scopes and syntax ... and 
it's still not easy to do with lots of historical specification packages 
still around.

Now that typedecl/typedef are localized at last, the other packages that 
depend on them can follow.


 	Makarius



More information about the isabelle-dev mailing list