[isabelle-dev] BNF: number of dead variables

Jasmin Christian Blanchette jasmin.blanchette at gmail.com
Wed Dec 3 15:46:56 CET 2014

Hi Chris,

> is there a reliable way to check - given the name of a type constructor - how many dead type parameters it has?
> I tried
>  (case BNF_FP_Def_Sugar.fp_sugar_of lthy tname of
>    SOME sugar =>
>      if BNF_Def.dead_of_bnf (#fp_bnf sugar) > 0 then
>        error "..."
>  ...
> However having something like
>  datatype foo = Foo | Bar
> I noticed that
>  print_bnfs
> does not list type "foo",

It doesn't because it's a nullary BNF and all types are trivially nullary BNFs, so there's no point in storing this pointless information in our databases. Instead, we store only a single such type, namely 'a, where 'a is dead. This BNF is called DEADID -- it's listed when you execute "print_bnfs", and you can grep for it in "src/HOL/*.thy" to find out where it is registered.

So when you look up "foo", you get, somewhat confusingly, the BNF entry for 'a.

A more reliable way to count the number of deads is to use the equation:

    num_dead_vars = num_type_vars - num_live_vars

"BNF_Def.live_of_bnf" and "Sign.arity_number" are your friends.

I hope this solves your problem.

Don't hesitate to let us know if you run into issues again. Those interfaces were never very polished, nor documented (although I might come to add a section to "isabelle doc datatypes" about the ML functions -- there is an embryonic, commented out "Using the Standard ML Interface" section already).



More information about the isabelle-dev mailing list