On Thursday, June 12, 2014 12:48:37 AM UTC-7, Marc Mezzarobba wrote: > > Sure. But why not have > > sage: bool(sin(x)^2+cos(x)^2==1) > True > > return False as well, and let the user test that > > (rhs-lhs).simplify_full() == 0 >
That would probably be even desirable if you want to make SR more generally usable in sage (imagine, say a cached function with SR elements as arguments. You would probably end up with a routine that gets *slower* as its cache fills) 1. the behavior of == is already full of subtleties (and bugs), > so I don't think arguments such as "4/2==2 is surprising for > new users" are very strong; > If 4/2==2 were to raise an exception, I agree, but we've already seen that internal usage of "==" precludes that option. Having 2/2 != 1 would just make too much code that is traditionally valid in all kinds of programming languages and computer algebra systems have insidious bugs to be socially acceptable. Yes, it is great to have a rich equality predicate that automatically > does the right thing in many cases. The only problem is, I know I cannot > trust its output, and I am convinced that I never will because the > issues discussed in this thread are basically unfixable. I think that's correct. "equality" is a fluid term in mathematics that may appear to have a consistent meaning throughout in mathematics, but in fact it's a local decision which equivalence relations will be called "equality" in mathematics literature. And even within well-defined domains the thing that's decided to mean equality can turn out to be undecidable. > I think I would lose all confidence in Sage (which may not be such a bad > thing, after all). > Or more generally, in math software. This problem is not limited to sage (although it may be worse because we get to blame python for some of the choices) >> sage: {t.parent() for t in {R(42), 42}} > >> {Integer Ring} > >> sage: {t.parent() for t in {42, R(42)}} > >> {Univariate Polynomial Ring in y over Rational Field} > > > > Totally, just like Python's > > > > {type(t) for t in {0, 0.0}} == {float} > > You can make these examples more fun by ensuring you can control the order in which the set gets constructed: sage: {t.parent() for t in set([42, R(42)])} set([Integer Ring]) sage: {t.parent() for t in set([R(42), 42])} set([Univariate Polynomial Ring in y over Rational Field]) sage: set([0, 0.0]) set([0]) sage: set([0.0, 0]) set([0.000000000000000]) (After all, 4/2 and 2 *are not* equal. Otherwise 2.is_invertible() would be > True.) > That is not such an uncontroversial statement. With ZZ regarded as a subset of QQ (quite a valid thing to do) we should have 4/2 == 2. In that view one should as whether 2 is invertible *in ZZ* , so it would be the is_invertible method that is flawed. -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at http://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.