Currently we have definition of_real :: "real ⇒ 'a::real_algebra_1" where "of_real r = scaleR r 1"
Maybe of_real could be done another way. And floats could be injected into the rationals. Larry > On 29 Jul 2015, at 16:34, Johannes Hölzl <hoe...@in.tum.de> wrote: > > 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