[isabelle-dev] Strange interaction of locales and constant definitions

Clemens Ballarin ballarin at in.tum.de
Mon May 27 19:07:06 CEST 2013

Hi Lars,

As already suggested, this is a limitation of parsing and type  
inference of locale expressions, which is fairly complex and the  
implementation is only a heuristic solution.  It aims at making syntax  
(in particular, definitions) from previous instances available in the  
parameter instantiation of subsequent instances.

A workaround is to make the types in the locale declaration explicit:

locale module = R: cring R + M: abelian_group M
   for R :: "('a, 'y) ring_scheme" (structure)
   and M :: "('a, 'b, 'z) module_scheme" (structure) + ...

The problem seems unrelated to overloading, for if the definition is  
changed to

context group begin
definition f :: "'a => 'a" where
    "f == (%x. inv x)"

it persists.  I don't know whether this can be fixed easily.


Quoting Lars Noschinski <noschinl at in.tum.de>:

> Hi everyone,
> I am encountering a very strange interaction of the definition of  
> specific constants with locale declarations in HOL-Algebra (as of  
> 06db08182c4b; but the behaviour also seems to exist in 2013).
> To reproduce this behaviour, insert the following code in  
> "~~/src/HOL/Algebra/Module.thy", before the definition of the  
> "module" locale:
> -----------------------------------------------------------
> context group begin
> definition f :: "'a ?'a" where
>    "f ? (?x. x (^) (0::int))"
> end
> -----------------------------------------------------------
> (interestingly, the right hand side of the constant matters; e.g.  
> simply  using "undefined" or "%x. x" will not produce an error).
> When doing so, the locale declaration will throw an error:
> -----------------------------------------------------------
> Type unification failed
> Type error in application: incompatible operand type
> Operator:  smult :: (??'a, 'c, ??'b) module_scheme ? ??'a ? 'c ? 'c
> Operand:   M :: ('c, 'd) ring_scheme
> -----------------------------------------------------------
> It is probably relevant that both locales on which "module" depends  
> depend recursively on "group".
> I can recover from this error by
>   - removing the stray "(structure)" declaration from M (the implicit
>     argument R of cring is already a structure),
>   - giving M an explicit type and
>   - making R an explicit argument with an explicit type.
> (The type annotations are those which are inferred automatically if  
> I don't define the constant f)
> I.e., if I replace the head of the locale declaration by
> -----------------------------------------------------------
> locale module = R: cring R + M: abelian_group M
>     for M :: "('a, 'd, 'c) module_scheme"
>     and R :: "('a, 'b) ring_scheme" (structure) +
> -----------------------------------------------------------
> the locale can be defined.
> Has anybody an idea what is going on there?
> _______________________________________________
> 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