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