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