Ah, I forgot about real of float.

I assume you meant:
  of_float :: float => 'a::field

 - Johannes


Am Mittwoch, den 29.07.2015, 16:07 +0100 schrieb Larry Paulson:
> This is an unusual case, because this function is not even injective. I would 
> prefer to reserve of_XXX for generic functions, like the existing ones.
> 
> I now see that there is another case:
> 
>       real :: float => real
> 
> This one is injective, and a properly generic function
> 
>       of_float :: "real ⇒ 'a::real_algebra_1”
> 
> looks easy to define.
> 
> Larry
> 
> > On 29 Jul 2015, at 15:24, Johannes Hölzl <hoe...@in.tum.de> wrote:
> > 
> > I'm fine with it. The only problem maight be that
> >  real :: "ereal => real"
> > is overloaded in Extended_Real, which is quite often used in Probability
> > theory. I can rename it to "of_ereal".
> > 
> >  - Johannes
> > 
> > Am Mittwoch, den 29.07.2015, 15:02 +0100 schrieb Larry Paulson:
> >> In recent work, I’ve seen again how tricky things are with coercions.
> >> We need “real” because it is already used in thousands of places and
> >> in many basic lemmas, but it can only do nat=>real and int=>real. If
> >> we are working more abstractly, only of_nat and of_int are general
> >> enough. It isn’t unusual to find both types of coercions in a single
> >> formula, and to make matters worse, their behaviour under
> >> simplification isn’t identical. But how can we fix this without
> >> breaking thousands of proofs?
> >> 
> >> I have a suggestion based on the assumption that real :: int=>real is
> >> almost never used. (I have previously removed overloading from other
> >> functions, and found essentially no uses of the integer version.) If
> >> this assumption is correct, we should be able to define real ::
> >> nat=>real as an abbreviation for of_nat, so that the two functions are
> >> synonymous. Then we could eliminate the existing abbreviation
> >> real_of_nat. This should win all around: we keep the name “real”,
> >> which is more readable than “of_nat”, and get rid of the overloading.
> >> The effect on existing proofs should be modest, especially if we
> >> change things to ensure that of_nat is simplified exactly as real is
> >> now.
> >> 
> >> Obviously, the biggest obstacle is likely to be occurrences of real ::
> >> int=>real. Any explicit occurrences will immediately be flagged, and
> >> can be replaced by of_int.
> >> 
> >> Views?
> >> 
> >> Larry
> >> 
> >>> On 3 Jun 2015, at 12:23, Larry Paulson <l...@cam.ac.uk> wrote:
> >>> 
> >>> The situation regarding coercions has become extremely untidy, and I 
> >>> think it should be cleared up. We have four generic functions:
> >>> 
> >>>   of_nat :: nat \<Rightarrow> ‘a::semiring_1
> >>>   of_int :: int \<Rightarrow> ‘a::ring_1
> >>>   of_rat :: rat \<Rightarrow> ‘a:: field_char_0
> >>>   of_real :: real \<Rightarrow> 'a::real_algebra_1
> >>> 
> >>> With these functions, we can express practically all numeric conversions, 
> >>> and they are based on algebraic principles. There is no need to introduce 
> >>> quadratically many other functions for each possible combination of 
> >>> source and target type. And yet we seem to done that. Why do we need 
> >>> abbreviations such as these?
> >>> 
> >>> abbreviation real_of_nat :: "nat \<Rightarrow> real”
> >>> where "real_of_nat \<equiv> of_nat"
> >>> 
> >>> abbreviation real_of_int :: "int \<Rightarrow> real”
> >>> where "real_of_int \<equiv> of_int"
> >>> 
> >>> abbreviation real_of_rat :: "rat \<Rightarrow> real”
> >>> where "real_of_rat \<equiv> of_rat"
> >>> 
> >>> abbreviation complex_of_real :: "real \<Rightarrow> complex"
> >>> where "complex_of_real \<equiv> of_real"
> >>> 
> >>> And then why use overloading so that “real” redirects to one of those, 
> >>> which in turn abbreviates one of the original four functions?  Note that 
> >>> "real x = of_nat x” is not an instance of reflexivity, but must be proved 
> >>> using the definition real_of_nat_def. This definition is used 88 times in 
> >>> our HOL development, and it’s also my direct experience of having two 
> >>> different but equivalent coercions complicates proofs.
> >>> 
> >>> We currently set up automatic coercions in Real.thy as follows:
> >>> 
> >>> declare [[coercion "of_nat :: nat \<Rightarrow> int"]]
> >>> declare [[coercion "real   :: nat \<Rightarrow> real"]]
> >>> declare [[coercion "real   :: int \<Rightarrow> real”]
> >>> 
> >>> And then in Complex.thy as follows:
> >>> 
> >>> declare [[coercion "of_real :: real \<Rightarrow> complex"]]
> >>> declare [[coercion "of_rat :: rat \<Rightarrow> complex"]]
> >>> declare [[coercion "of_int :: int \<Rightarrow> complex"]]
> >>> declare [[coercion "of_nat :: nat \<Rightarrow> complex”]]
> >>> 
> >>> This latter version is the correct one, using just the primitive 
> >>> coercions.
> >>> 
> >>> I think that we should phase out all the derivative coercions in favour 
> >>> of the primitive ones. I know that our complicated system arose by 
> >>> accident, but it would not be that difficult to fix things.
> >>> 
> >>> Larry
> >>> 
> >>>> On 3 Jun 2015, at 09:55, Fabian Immler <imm...@in.tum.de> wrote:
> >>>> 
> >>>> I think I could live without "real": coercions save a lot of the writing.
> >>>> Moreover, the "real_of_foo" abbreviations help to avoid type annotations:
> >>>> I suppose that all of the current occurrences of "real" could be 
> >>>> replaced with one particular "real_of_foo".
> >>>> 
> >>>> For reading (subgoals etc), one could perhaps think about less 
> >>>> obstructive abbreviations like e.g., "real_N" and "real_Z", or "real⇩N" 
> >>>> and "real⇩Z".
> >>>> But I see that "real_of_foo" is much more uniform and you can 
> >>>> immediately read off the type "foo".
> >>>> 
> >>>> Fabian
> >>> 
> >> 
> >> _______________________________________________
> >> 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