Cf. http://isabelle.in.tum.de/testboard/Isabelle/rev/fd70d029af7e

Dmitriy

On 23.11.2014 21:20, Christian Sternagel wrote:
*Moved from isabelle-users*

Thanks for the crucial hint Dmitriy!

Coming back to the original issue of Andreas, some explanation might be in order.

What we did until now in adhoc_overloading.ML (more precisely, the function "insert_variants") was to check for a given constant "c" of type "T" whether there is a registered variant "v" whose type unifies with "T". If so, "v" was inserted (but with all type-annotations "flattened" to "dummyT"). After that we just hoped that type-inference would do the trick. Apparently this worked quite well in many situations (or maybe there are just not that many users of "adhoc_overloading" ;)).

Be that as it may. In Andreas' example this "flattening" of types leads to somewhat unexpected results. Funnily (or maybe it was to be expected but I don't know the details) everything worked out in top-level thoeries. Somehow types are more polymorphic there (even though HOL is not polymorphic at all ;)). With notepad and a fixed type "'b" the problem occurred (and I guess the same would happen with locales).

(I'm not sure whether the TYPE_MATCH exception, which is not raised inside adhoc_overloading.ML but caused by its result, is the best problem-indicator for users here. Maybe there is also space for improvement elsewhere. Comments?)

Anyway, attached is the following series of patches (to be applied in this order):

delete - fixes a typo
drop_semicolons - drops semicolons
inst_unifier - uses the obtained unifier to instantiate the type of "v"
tune - misc tuning

With those applied (the important one is "inst_unifier") "insert_variants" does the following. For a given constant "c" of type "T", check whether there is a variant "v" of type T' such that T and T' unify. If so, apply the obtained type-unifier to "v" and insert the result instead of "c".

I hope this resolves your problem Andreas.

I tested the change on one of my local files that make heavy use of adhoc overloading. Maybe someone could have a look, push the changes to a test server, and push them to the main repo if everything is fine?

cheers

chris

On 11/23/2014 11:42 AM, Dmitriy Traytel wrote:
Hi Christian,

just a few weeks ago, I learned that Envir.subst_term_types is indeed
the wrong function when substituting with a unifier (instead it is
intended for matchers).

The right functions for unifiers in envir.ML are the ones prefixed with
"norm".

Hope that helps,
Dmitriy

On 22.11.2014 21:02, Christian Sternagel wrote:
I'm currently a bit confused by the result of "Sign.typ_unify" (or
rather the result of applying the corresponding "unifier"). So maybe
the problem stems from my ignorance w.r.t. to its intended result.

After applying the attached "debug" patch for the following

  consts pure :: "'a ⇒ 'b"

  definition pure_stream :: "'a ⇒ 'a stream"
  where "pure_stream = sconst"

  adhoc_overloading pure pure_stream

  consts ap_stream :: "('a ⇒ 'b) stream ⇒ 'a stream ⇒ 'b stream"
(infixl "◇" 70)
  consts S_stream :: "(('a ⇒ 'b ⇒ 'c) ⇒ ('a ⇒ 'b) ⇒ 'a ⇒ 'c) stream"

  declare [[show_variants]]

  term "pure id :: ('b ⇒ 'b) stream"

we obtain the output

oconst type: (??'a ⇒ ??'a) ⇒ ('b ⇒ 'b) stream
variant type: ?'a ⇒ ?'a stream
("unifier:",
 {(("'a", 0), (["HOL.type"], "??'a ⇒ ??'a")),
   (("?'a", 0),
     (["HOL.type"],
      "'b"))}) (line 165 of
"/home/griff/Repos/isabelle/src/Tools/adhoc_overloading.ML")
("candidate term:",
 Const ("Scratch.pure_stream",
        "?'a
         ⇒ ?'a Stream.stream")) (line 167 of
"/home/griff/Repos/isabelle/src/Tools/adhoc_overloading.ML")
("after unification:",
 Const ("Scratch.pure_stream",
        "(??'a ⇒ ??'a)
         ⇒ (??'a
             ⇒ ??'a) Stream.stream")) (line 168 of
"/home/griff/Repos/isabelle/src/Tools/adhoc_overloading.ML")
"pure_stream id"
  :: "('a ⇒ 'a) stream"

The result of unification is a bit surprising to me, since the
obtained "unifier" seems to claim that

  ('b => 'b) => ('b => 'b) stream

and

  (??'a => ??'a) => (??'a => ??'a) stream

are equal. What am I missing here? Maybe Envir.subst_term_types is not
the way to apply the typenv obtained by typ_unify? (In this special
case, if I would call subst_term_types twice with the same typenv, the
result would be as I expected.)

cheers

chris

Btw: the "delete" patch (which is to be applied before "debug") fixes
a typo in the description of "no_adhoc_overloading". It is entirely
unrelated to the issue at hand, but maybe somebody could apply it anyway.

On 11/21/2014 07:31 PM, Christian Sternagel wrote:
Dear Andreas,

Thanks for the report, I'll have a look. First an immediate observation:

When adding the following to Scratch.thy

declare [[show_variants]]

notepad
begin
   fix f :: "('b ⇒ 'b ⇒ 'a) stream"
   and x :: "'b stream"
   term "pure id :: ('b => 'b) stream"

the first "term" results in

"pure_stream id"
   :: "('c ⇒ 'c) stream"

while the second results in

"pure_stream id"
   :: "('b ⇒ 'b) stream"

So it is not surprising that the first causes problems while matching.
Why, however "'c" is produced instead of "'b" is not immediately clear
to me. I'll investigate.

cheers

chris

On 11/21/2014 04:09 PM, Andreas Lochbihler wrote:
Dear experts on adhoc overloading,

When I want to instantiate variables in a theorem using the attribute
"of", sometimes the exception TYPE_MATCH gets raised. This seems
strange
to me because I would expect that adhoc_overloading either complains
about not being able to uniquely resolve an overloaded constant or
exchanges the constant in the AST.

By adding more type annotations, I have so far been able to circumvent the exception, but there seems to be a check missing. Attached you find
a small example.

Best,
Andreas



_______________________________________________
isabelle-dev mailing list
isabelle-...@in.tum.de
https://mailmanbroy.informatik.tu-muenchen.de/mailman/listinfo/isabelle-dev

_______________________________________________
isabelle-dev mailing list
isabelle-...@in.tum.de
https://mailmanbroy.informatik.tu-muenchen.de/mailman/listinfo/isabelle-dev

Reply via email to