[isabelle-dev] Typedef and localization
Makarius
makarius at sketis.net
Fri Sep 10 17:26:08 CEST 2010
On Thu, 9 Sep 2010, Jasmin Christian Blanchette wrote:
> I ran into a strange behavior of "Typedef". The theory below captures
> the problem:
>
> theory N
> imports Multiset
> begin
>
> locale Foo =
> fixes f :: "'a => 'b"
>
> ML {* Typedef.get_info @{context} @{type_name multiset} *}
>
> Now, 'a and 'b are fixed in the context, and "Typedef.get_info" takes a
> context, so it should be context-aware. Which means that it shouldn't
> talk about 'a or 'b, since these are taken by the context already. But
> it does! This is the result of the invocation above:
>
> [({Abs_name = "Multiset.Abs_multiset", Rep_name = "Multiset.count", abs_type = "'a Multiset.multiset",
> rep_type = "'a ⇒ Nat.nat", axiom_name = "Multiset.type_definition_multiset"},
> {Rep = "count (?x∷?'a multiset) ∈ multiset", set_def =
> SOME "multiset ≡ {f∷?'a ⇒ nat. finite {x∷?'a. (0∷nat) < f x}}", ...]
> : Typedef.info list
>
> Notice that "abs_type" and "rep_type" talk about 'a -- but that's just a
> clash with the 'a that's already fixed in the locale. It should be 'c or
> ?'a (the latter would require changing the tools based on "Typedef" --
> e.g. removing calls to "varify"), but not 'a. Interestingly, the
> theorems are correctly generalized to ?'a -- it's just "abs_type" and
> "rep_type" that are broken.
Inspecting the authoritative source, which is the ML text together with
its history, it says in
http://isabelle.in.tum.de/repos/isabelle/annotate/9cc3df9a606e/src/HOL/Tools/typedef.ML#l38
type info =
(*global part*)
{rep_type: typ, abs_type: typ, Rep_name: string, Abs_name: string, axiom_name: string} *
(*local part*)
{inhabited: thm, type_definition: thm, set_def: thm option, Rep: thm, Rep_inverse: thm,
Abs_inverse: thm, Rep_inject: thm, Abs_inject: thm, Rep_cases: thm, Abs_cases: thm,
Rep_induct: thm, Abs_induct: thm};
And the log entry of that change:
Typedef.info: separate global and local part, only the latter is
transformed by morphisms;
This means things are formally all-right, despite the surprise.
These explanations in the repository always assume a common ground of
thinking about the system, which might make them appear a bit hermetic at
some point.
So same more explanations here:
* A local context is characterized by a mixture of Frees and Vars. The
Frees are like local constants, the Vars express generality (like
adhoc quantifiers that have already been generalized). This is
particularly important for type variables, because there is no
explicit quantification.
* In a global situations "variables" are just "variables", they can be
either all fixed or all schematic, but not mixed. The
varify_global / unvarify_global operations allow to flip coins. The
"global" in the name indicates that something special is going on
here, outside the usual context discipline.
It depends on the situations how things are stored in the background
context -- the typedef package prefers the free variant right now (as
does the locale infrastructure, IIRC). Digging through the history
further might explain further details, how the typedef of 9cc3df9a606e
emerged.
Makarius
More information about the isabelle-dev
mailing list