[isabelle-dev] [Fwd: [isabelle] Monad_Syntax breaks display of abbreviations]
Christian Sternagel
c.sternagel at gmail.com
Tue Sep 24 07:12:52 CEST 2013
Some more details:
until 0d0c20a0a34f we have the expected behavior. With
changeset: 52622:e0ff1625e96d
user: wenzelm
date: Fri Jul 12 16:19:05 2013 +0200
summary: localized and modernized adhoc-overloading (patch by
Christian Sternagel);
term "bind (Some my_abbrev) f"
is not accepted at all (red, but no error message; but I think this is
an orthogonal issue of implicit assumptions on my side that where not
correct and which was resolved in the meanwhile). Nevertheless, this is
the changeset I suspect to introduce the new behavior, since here the
implementation of "insert_internal_same" (which is now called
"insert_overloaded") is drastically changed.
Before this changeset variants are always Consts and thus replacing
variants with their overloaded constant is easily done by
pattern-matching on variants.
After this changeset, variants may be arbitrary terms (due to
localization). Now replacing a variant by the corresponding overloaded
constant is done by rewriting (as Florian already pointed out, this
happens in "insert_overloaded") as follows
fun insert_overloaded ctxt variant =
(case try Term.type_of variant of
NONE => variant
| SOME T =>
Pattern.rewrite_term (Proof_Context.theory_of ctxt) []
[Option.map (Const o rpair T) o
get_overloaded ctxt o Term.map_types (K dummyT)] variant);
Apparently this interferes with abbreviations. Am I doing anything
strange here?
cheers
chris
On 09/24/2013 01:06 PM, Christian Sternagel wrote:
> Dear Florian and Peter,
>
> first, sorry for my long silence, I was on holidays.
>
> On 09/20/2013 12:30 AM, Florian Haftmann wrote:
>> Hi Peter, hi Christian
>>
>>> Referring to Isabelle_12-Sep-2013:
>>>
>>> When using overloading from Monad_Syntax, abbreviations are no longer
>>> displayed in output syntax:
>>
>> is this »no longer« referring to the state of Isabelle2013? Or did it
>> also go wrong then?
>
> This works as expected with Isabelle2013. Most likely, my recent
> localization of adhoc overloading caused the new behavior (which I agree
> is not nice). I was not aware of this myself, thanks for bringing it to
> my attention.
>
>>
>>> theory Scratch
>>> imports
>>> Main
>>> "~~/src/HOL/Library/Monad_Syntax"
>>>
>>> abbreviation "my_abbrev \<equiv> [True]"
>>>
>>> term "foo (Some my_abbrev) f" (* Yields: foo (Some my_abbrev) f *)
>>> term "bind (Some my_abbrev) f" (* Yields: Some [True] >>= f*)
>>
>> A first analysis:
>>
>>> theory Monad_Syn
>>> imports
>>> Main
>>> "~~/src/Tools/Adhoc_Overloading"
>>> begin
>>>
>>> consts
>>> bind :: "['a, 'b ⇒ 'c] ⇒ 'd"
>>>
>>> adhoc_overloading
>>> bind Set.bind Predicate.bind Option.bind List.bind
>>>
>>> abbreviation "my_abbrev \<equiv> [True]"
>>>
>>> term "foo (Some my_abbrev) f" (* Yields: foo (Some my_abbrev) f *)
>>> term "bind (Some my_abbrev) f" (* Yields: bind (Some [True]) f *)
>>
>> The monad syntax is not to blame, the problem is already in adhoc
>> overloading.
>>
>> Using
>>
>>> declare [[show_variants]]
>>
>>> term "foo (Some my_abbrev) f" (* Yields: foo (Some my_abbrev) f *)
>>> term "bind (Some my_abbrev) f" (* Yields: Option.bind (Some
>> my_abbrev) f *)
>>
>> Going to the corresponding lines in adhoc_overloading.ML:
>>
>>> fun uncheck ctxt =
>>> if Config.get ctxt show_variants then I
>>> else map (insert_overloaded ctxt);
>>
>> I roughly guess something in insert_overloaded modifies the term in a
>> way that the abbreviation does not apply any longer (again, only a rough
>> guess).
>
> Thanks for the nice analysis.
>
>>
>> @Christian: maybe you have a suggestion what is going on here?
>>
>
> At the moment not. I will investigate this issue and come back to the
> mailing list as soon as I find out more.
>
> cheers
>
> chris
>
>
>
>
More information about the isabelle-dev
mailing list