[isabelle-dev] adhoc overloading

Christian Sternagel c.sternagel at gmail.com
Thu May 30 05:31:44 CEST 2013

Dear Florian,

On 05/30/2013 06:03 AM, Florian Haftmann wrote:
> Hi Christian,
>> - For Overload_Data instead of Theory_Data, I should use Generic_Data
>> (such that it is available in top-level theories and local theories).
>> Currently that means that I do the following in the setup (where
>> Adhoc_Overloading.setup is now of type "Context.generic ->
>> Context.generic").
>>    setup {* fn thy =>
>>      Adhoc_Overloading.setup (Context.Theory thy)
>>      Context.theory_of *}
>> This looks strange, I'm sure I'm doing something wrong / non-canonical.
> I think Adhoc_Overloading.setup should stay theory -> theory: this is
> the installation of the necessary syntax check phases, which is done
> once globally on import of the corresponding theory – unlike the dynamic
> addition via add_overloaded and add_variant
Sorry, my question should have been: how to apply a function of type 
"Generic.context -> Generic.context" in a situation where "theory -> 
theory" is expected (the former type comes from using Generic_Data, and 
the latter is what "setup" should have). In the meanwhile I found

   Context.theory_map: (Context.generic -> Context.generic) -> theory -> 

> Alternatively, use Context.>> directly in the body of the ML file
> (which, I guess, is nowadays preferred over explicit setup in the
> surrounding theory).
Thanks for the hint. I'm now using "Context.>>" instead of a setup 
function called from a thy-file.

>> - Apparently "constants" (in the sense of locally fixed variables of a
>> local theory) are represented as "term"s rather than "string"s (in the
>> notation command). In adhoc_overloading.ML, until now we used "string"s
>> to represent top-level constants. A change (if really necessary) implies
>> the following questions:
> It depends how far you want to push the game.
> * The simplest one I can imagine is to stay on the »constant as string«
> level, but have declarations within local theories;  if these would be
> morphed e.g. due to interpretation, they would only be kept if their
> resulting shape is again a constant.
> * Treat one component as general term appropriately (maybe the variant?).
> * Treat both components as general term appropriately.
My naive approach was to just turn the previous Symtabs into Termtabs, 
i.e., previously:

   internalize : (string * typ) list Symtab.table
   (*maps overloaded constants to lists of variants (together with their 
   externalize : string Symtab.table
   (*maps variants to corresponding overloaded constants*)

(An aside: I'm leaning towards renaming those two tables and related 
functions as follows:

   internalize ~> variant_tab
   externalize ~> oconst_tab

which would make more sense to me, but maybe the old naming has a 
Isabelle-specific reason I'm not aware of?)

As a first attempt I just changed this into

   variant_tab : term list Termtab.table (*we can get the type of a term*)
   oconst_tab : term Termtab.table

But of course that is not what I intended, since types are now also 
inspected when looking up a key in a table, but at least for overloaded 
constants only their name is important. This seems to point towards one 
of your first two suggestions. The first one, would require the least 
amount of changes (and would allow to print readable error messages). 
The question is whether I'm asking for problems, when I treat "Free" 
variables (i.e., "constants" in local theories) and "Const"s both as 
strings? Any opinions?

A related question. Until now I can only register overloaded constants 
and variants via the ML interface, since the "adhoc_overloading" command 
I implemented does not seem to effect the surrounding theory. I will 
have a look at "notation" again to see how functions of type 
"local_theory -> local_theory" are able to make "non-local" changes 
persistent, i.e., update the tables in my Generic_Data. Maybe somebody 
does already have suggestions in that respect?



>>    * How to print a "constant" represented as "term" in the error
>> messages inside Overload_Data (I do not see how I could access the
>> context here)
> Good question.  Note that most »fully localized« data store prefer
> Item_Net.T as store index, where merge always seems to prefer on branch
> (I only did skim over the sources, so this conclusion might be erroneous).
>>    * I also would like to add the possibility to remove overloading and
>> variants again. Is that against some monotonicity requirement I'm not
>> aware of?
> It should work, with the usual problems on the theory level that things
> deleted in one theory come up again after merge with another theory with
> partly shared but different ancestry.
>> - Concerning syntax, I thought about providing commands like:
>>    adhoc_overloading
>>      bind bind_list bind_option and
>>      permute permute_list permute_option
>> (which would declare "bind" and "permute" as ad-hoc overloaded and add
>> the variants "bind_list" and "bind_option", and "permute_list" and
>> "permute_option", respectively.) Maybe some punctuation between the
>> overloaded constant and its variant would increase readability?
> Maybe \<rightharpoonup> / => similar to existing syntax things=
>> - In the check and uncheck functions I now would have to unify typed
>> terms instead of mere constants. Could that be too expensive to be
>> practicable?
> I have no particular idea about that.
> Cheers,
> 	Florian
> _______________________________________________
> isabelle-dev mailing list
> isabelle-dev at in.tum.de
> https://mailmanbroy.informatik.tu-muenchen.de/mailman/listinfo/isabelle-dev

More information about the isabelle-dev mailing list